diff --git a/info.json b/info.json index 44efe93..ca95a41 100644 --- a/info.json +++ b/info.json @@ -9,9 +9,16 @@ "anvil":{ "author":"FaceDeer" }, + "automobiles_pck":{ + "author":"apercy" + }, "awards":{ "author":"rubenwardy" }, + "basic_materials":{ + "author":"mt-mods", + "required":["xcompat"] + }, "bucket_wooden":{ "author":"Hume2" }, @@ -30,6 +37,15 @@ "discovery_maps":{ "author":"TomCon" }, + "ethereal":{ + "author":"TenPlus1", + "colloquial_name":"Ethereal NG", + "notes":"Broke something when making a technic pack. Forgot what.", + "status":"abandoned" + }, + "everness":{ + "author":"SaKeL" + }, "eye_spy":{ "author":"cjgray24" }, @@ -133,6 +149,9 @@ "author":"mt-mods", "required":["xcompat"] }, + "treecapitator":{ + "author":"Hybrid Dog" + }, "unified_inventory":{ "author":"RealBadAngel" }, @@ -162,6 +181,9 @@ "xcompat":{ "author":"mt-mods" }, + "xdecor":{ + "author":"Wuzzy" + }, "yl_api_nodestages":{ "author":"AliasAlreadyTaken" }, @@ -212,6 +234,7 @@ "toolranks":true, "toolranks_extras":true, "travelnet":true, + "treecapitator":true, "unified_inventory_plus":true, "uraniumstuff":true, "wetmud":true, @@ -222,6 +245,61 @@ "yl_canned_food":true, "yl_canned_food_mtg":true } + }, + "Unnamed Luanti Technic Pack":{ + "mods":{ + "3d_armor":true, + "ancient_bones":true, + "anvil":true, + "automobiles_pck":true, + "awards":true, + "basic_materials":true, + "bucket_wooden":true, + "ccompass":true, + "charcoal":true, + "colored_chests":true, + "coloredstrings":true, + "discovery_maps":true, + "everness":true, + "eye_spy":true, + "fakelib":true, + "farming":true, + "farmtools":true, + "grass_string":true, + "hammersredo":true, + "handholds_redo":true, + "mesecons":true, + "mob_horse":true, + "mob_mese_monster_classic":true, + "mobs":true, + "mobs_animal":true, + "mobs_monster":true, + "mobs_water":true, + "more_ladders":true, + "moreawards":true, + "moreores":true, + "multitools":true, + "nutritional":true, + "ropes":true, + "too_many_tnt":true, + "toolranks":true, + "toolranks_extras":true, + "travelnet":true, + "treecapitator":true, + "unified_inventory":true, + "unified_inventory_plus":true, + "unifiedbricks":true, + "unifieddyes":true, + "uraniumstuff":true, + "wetmud":true, + "worldedit":true, + "x_farming":true, + "xcompat":true, + "xdecor":true, + "yl_api_nodestages":true, + "yl_canned_food":true, + "yl_canned_food_mtg":true + } } } } diff --git a/mods/automobiles_pck/LICENSE b/mods/automobiles_pck/LICENSE new file mode 100644 index 0000000..960a1dd --- /dev/null +++ b/mods/automobiles_pck/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 APercy - Alexsandro Percy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/mods/automobiles_pck/README.md b/mods/automobiles_pck/README.md new file mode 100755 index 0000000..7c64533 --- /dev/null +++ b/mods/automobiles_pck/README.md @@ -0,0 +1,23 @@ +[![automobiles](https://user-images.githubusercontent.com/95320171/198845469-fe7bbe2d-19e9-42da-8343-9c32c1cdbd0b.png)](https://content.minetest.net/packages/apercy/automobiles_pck/) + +Modpack to add automobiles to Minetest. The main goal of this modpack is realistic driving over slopes and elevations. +Fuel is needed to operate the vehicles, however a small amount of fuel is provided in each vehicle on creation. + +## Dependencies +- [biofuel](https://content.minetest.net/packages/Lokrates/biofuel/) +- player_api + +## Vehicle Operation +W: Forward + +S: Brake + +A: Left + +D: Right + +E: Horn + +Shift: Reverse + +Vehicles can be colored by punching them with either dye or the vehicle painter. To fuel a vehicle, punch it with biofuel. diff --git a/mods/automobiles_pck/automobiles_beetle/README.md b/mods/automobiles_pck/automobiles_beetle/README.md new file mode 100755 index 0000000..89aa159 --- /dev/null +++ b/mods/automobiles_pck/automobiles_beetle/README.md @@ -0,0 +1,10 @@ +## Beetle + +This mod adds a beetle automobile to Minetest. + +## Licenses +- Code: see [LICENSE](/LICENSE) +- Media: Model made by myself; licence CC0 + +## Screenshot +![beetle](/automobiles_beetle/screenshot.jpg) diff --git a/mods/automobiles_pck/automobiles_beetle/crafts.lua b/mods/automobiles_pck/automobiles_beetle/crafts.lua new file mode 100644 index 0000000..b799a40 --- /dev/null +++ b/mods/automobiles_pck/automobiles_beetle/crafts.lua @@ -0,0 +1,151 @@ +local S = auto_beetle.S + +-- +-- items +-- + +-- body +minetest.register_craftitem("automobiles_beetle:beetle_body",{ + description = S("Beetle Body"), + inventory_image = "beetle_body.png", +}) + +-- beetle +minetest.register_tool("automobiles_beetle:beetle", { + description = "Beetle", + inventory_image = "automobiles_beetle.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_beetle:beetle", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 50 --reset hp + --minetest.chat_send_all("owner: " .. ent.owner) + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, S("Beetle")) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) + +-- beetle +minetest.register_tool("automobiles_beetle:beetle_conv", { + description = "Beetle", + inventory_image = "automobiles_beetle_conv.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_beetle:beetle_conv", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 50 --reset hp + --minetest.chat_send_all("owner: " .. ent.owner) + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, S("Beetle")) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) + +-- +-- crafting +-- +if minetest.get_modpath("default") then + minetest.register_craft({ + output = "automobiles_beetle:beetle", + recipe = { + {"automobiles_lib:wheel", "automobiles_lib:engine", "automobiles_lib:wheel"}, + {"automobiles_lib:wheel","automobiles_beetle:beetle_body", "automobiles_lib:wheel"}, + } + }) + minetest.register_craft({ + output = "automobiles_beetle:beetle_conv", + recipe = { + {"wool:white","wool:black","wool:black"}, + {"automobiles_lib:wheel", "automobiles_lib:engine", "automobiles_lib:wheel"}, + {"automobiles_lib:wheel","automobiles_beetle:beetle_body", "automobiles_lib:wheel"}, + } + }) + minetest.register_craft({ + output = "automobiles_beetle:beetle_body", + recipe = { + {"default:glass" ,"default:steel_ingot","default:glass"}, + {"default:steel_ingot","default:steel_ingot","default:steel_ingot"}, + {"default:steelblock","default:steelblock", "default:steelblock"}, + } + }) +end + +-- beetle +minetest.register_tool("automobiles_beetle:rc_beetle", { + description = "R/C Beetle", + inventory_image = "automobiles_beetle.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_beetle:rc_beetle", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 1 --reset hp + --minetest.chat_send_all("owner: " .. ent.owner) + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, S("R/C Beetle")) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) diff --git a/mods/automobiles_pck/automobiles_beetle/entities.lua b/mods/automobiles_pck/automobiles_beetle/entities.lua new file mode 100755 index 0000000..7c3ea71 --- /dev/null +++ b/mods/automobiles_pck/automobiles_beetle/entities.lua @@ -0,0 +1,502 @@ +-- destroy the beetle +function auto_beetle.destroy(self, puncher) + automobiles_lib.remove_light(self) + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + self.sound_handle = nil + end + + if self.driver_name then + -- detach the driver first (puncher must be driver) + if puncher then + puncher:set_detach() + puncher:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + if minetest.global_exists("player_api") then + player_api.player_attached[self.driver_name] = nil + -- player should stand again + player_api.set_animation(puncher, "stand") + end + end + self.driver_name = nil + end + + local pos = self.object:get_pos() + + if self.front_suspension then self.front_suspension:remove() end + if self.lf_wheel then self.lf_wheel:remove() end + if self.rf_wheel then self.rf_wheel:remove() end + if self.rear_suspension then self.rear_suspension:remove() end + if self.lr_wheel then self.lr_wheel:remove() end + if self.rr_wheel then self.rr_wheel:remove() end + if self.fuel_gauge then self.fuel_gauge:remove() end + if self.lights then self.lights:remove() end + if self.r_lights then self.r_lights:remove() end + if self.reverse_lights then self.reverse_lights:remove() end + if self.turn_l_light then self.turn_l_light:remove() end + if self.turn_r_light then self.turn_r_light:remove() end + if self.back_seat then self.back_seat:remove() end + + automobiles_lib.seats_destroy(self) + + automobiles_lib.destroy_inventory(self) + self.object:remove() + + pos.y=pos.y+2 + + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:engine') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') +end +-- +-- entity +-- + +minetest.register_entity('automobiles_beetle:wheel',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "beetle_anim_wheel.b3d", + backface_culling = false, + textures = {"automobiles_black.png", "automobiles_metal.png", "beetle_wheel.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_beetle:front_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "mesh", + mesh = "automobiles_buggy_f_suspension.b3d", + textures = {"automobiles_black.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + +minetest.register_entity('automobiles_beetle:rear_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + pointable=false, + visual = "mesh", + mesh = "automobiles_buggy_r_suspension.b3d", + textures = {"automobiles_black.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_beetle:f_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "beetle_f_lights.b3d", + textures = {"automobiles_grey.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_beetle:r_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "beetle_pos_lights.b3d", + textures = {"automobiles_rear_lights_off.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_beetle:turn_left_light',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "beetle_turn_l_light.b3d", + textures = {"automobiles_rear_lights.png", "automobiles_turn.png", }, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_beetle:turn_right_light',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "beetle_turn_r_light.b3d", + textures = {"automobiles_rear_lights.png", "automobiles_turn.png", }, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_beetle:reverse_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "beetle_reverse_lights.b3d", + textures = {"automobiles_grey.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_beetle:top',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "beetle_top.b3d", + backface_culling = false, + textures = {"automobiles_white.png", "automobiles_black.png", "beetle_glasses.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_beetle:top_retracted',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "beetle_top_retracted.b3d", + backface_culling = false, + textures = {"automobiles_black.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +function auto_beetle.paint(self, colstr) + local l_textures = self.initial_properties.textures + self._color = colstr + + --paint details + local target_texture = "beetle_painting.png" + local accessorie_texture = "beetle_paint_interior.png" + for _, texture in ipairs(l_textures) do + local indx = texture:find(target_texture) + if indx then + l_textures[_] = "("..target_texture.."^[multiply:"..colstr..")^("..target_texture.."^[multiply:#BBBBBB^[mask:beetle_details.png)" --here changes the main color + end + local indx = texture:find(accessorie_texture) + if indx then + l_textures[_] = accessorie_texture.."^[multiply:".. colstr --here changes the main color + end + end + self.object:set_properties({textures=l_textures}) +end + +function auto_beetle.set_paint(self, puncher, itmstck) + local is_admin = false + is_admin = minetest.check_player_privs(puncher, {server=true}) + if not (self.owner == puncher:get_player_name() or is_admin == true) then + return + end + + local item_name = "" + if itmstck then item_name = itmstck:get_name() end + + if item_name == "bike:painter" then + --painting with bike painter + local meta = itmstck:get_meta() + local colstr = meta:get_string("paint_color") + auto_beetle.paint(self, colstr) + return true + else + --painting with dyes + local split = string.split(item_name, ":") + local color, indx, _ + if split[1] then _,indx = split[1]:find('dye') end + if indx then + --lets paint!!!! + local color = split[2] --(item_name:sub(indx+1)):gsub(":", "") + local colstr = automobiles_lib.colors[color] + --minetest.chat_send_all(color ..' '.. dump(colstr)) + if colstr then + auto_beetle.paint(self, colstr) + itmstck:set_count(itmstck:get_count()-1) + puncher:set_wielded_item(itmstck) + return true + end + -- end painting + end + end + return false +end + +auto_beetle.car_properties1 = { + initial_properties = { + physical = true, + collide_with_objects = true, + collisionbox = {-0.1, -0.2, -0.1, 0.1, 1.8, 0.1}, + selectionbox = {-2.0, 0.0, -2.0, 2.0, 2, 2.0}, + stepheight = 0.65 + automobiles_lib.extra_stepheight, + visual = "mesh", + mesh = "beetle_body.b3d", + backface_culling = false, + textures = { + "automobiles_black.png", --bancos + "automobiles_black.png", --banco traseiro + "beetle_painting.png", --pintura carroceria + "automobiles_black.png", --chassis + "automobiles_metal.png", "automobiles_black.png", --escapamento + "automobiles_metal.png", --detalhes metal + "automobiles_black.png", "automobiles_metal.png", --estribos + "beetle_glasses.png", --vidros + "beetle_interior.png", --assoalho e forros + "beetle_paint_interior.png", --painel + "automobiles_metal.png", --para-choques + "beetle_painting.png", --para-lamas + "automobiles_metal.png", "automobiles_black.png", --volante + "beetle_painting.png", --portas + "automobiles_black.png", --forro portas + "automobiles_metal.png", --metais portas + "beetle_glasses.png", --vidros portas + }, + }, + textures = {}, + driver_name = nil, + sound_handle = nil, + owner = "", + static_save = true, + infotext = "A very nice Beetle!", + hp = 50, + buoyancy = 2, + physics = automobiles_lib.physics, + lastvelocity = vector.new(), + time_total = 0, + _passenger = nil, + _color = "#FFFFFF", + _steering_angle = 0, + _engine_running = false, + _last_checkpoint = "", + _total_laps = -1, + _race_id = "", + _energy = 1, + _last_time_collision_snd = 0, + _last_time_drift_snd = 0, + _last_time_command = 0, + _roll = math.rad(0), + _pitch = 0, + _longit_speed = 0, + _show_rag = true, + _show_lights = false, + _light_old_pos = nil, + _last_ground_check = 0, + _last_light_move = 0, + _last_engine_sound_update = 0, + _turn_light_timer = 0, + _inv = nil, + _inv_id = "", + _change_color = automobiles_lib.paint, + _intensity = 4, + _car_gravity = -automobiles_lib.gravity, + _is_flying = 0, + _trunk_slots = 12, + _engine_sound = "beetle_engine", + _base_pitch = 0.7, + _max_fuel = 10, + + _vehicle_name = "Beetle", + _drive_wheel_pos = {x=-4.42, y=7.00, z=21}, + _drive_wheel_angle = 12, + _seat_pos = {{x=-4.0,y=2,z=13.8},{x=4.0,y=2,z=13.8}, {x=-3.5,y=2,z=5},{x=3.5,y=2,z=5}}, + + _front_suspension_ent = 'automobiles_beetle:front_suspension', + _front_suspension_pos = {x=0,y=1.8,z=27.6}, + _front_wheel_ent = 'automobiles_beetle:wheel', + _front_wheel_xpos = 8.5, + _front_wheel_frames = {x = 1, y = 24}, + _rear_suspension_ent = 'automobiles_beetle:rear_suspension', + _rear_suspension_pos = {x=0,y=1.8,z=0}, + _rear_wheel_ent = 'automobiles_beetle:wheel', + _rear_wheel_xpos = 8.5, + _rear_wheel_frames = {x = 1, y = 24}, + _wheel_compensation = 0.9, + + _fuel_gauge_pos = {x=-4.42,y=8.70,z=20.2}, + _front_lights = 'automobiles_beetle:f_lights', + _rear_lights = 'automobiles_beetle:r_lights', + _reverse_lights = 'automobiles_beetle:reverse_lights', + _turn_left_lights = 'automobiles_beetle:turn_left_light', + _turn_right_lights = 'automobiles_beetle:turn_right_light', + _textures_turn_lights_off = {"automobiles_rear_lights.png", "automobiles_turn.png", }, + _textures_turn_lights_on = {"automobiles_rear_lights_full.png", "automobiles_turn_on.png", }, + + _change_color = auto_beetle.paint, + _painting_function = auto_beetle.set_paint, + _painting_load = auto_beetle.paint, + _transmission_state = 1, + + _horn_sound = 'beetle_horn', + + _LONGIT_DRAG_FACTOR = 0.12*0.12, + _LATER_DRAG_FACTOR = 6.0, + _max_acc_factor = 5, + _max_speed = 14, + _min_later_speed = 3, + _consumption_divisor = 60000, + + + get_staticdata = automobiles_lib.get_staticdata, + + on_deactivate = function(self) + automobiles_lib.save_inventory(self) + end, + + on_activate = automobiles_lib.on_activate, + + on_step = automobiles_lib.on_step, + + on_punch = automobiles_lib.on_punch, + on_rightclick = automobiles_lib.on_rightclick, +} + +minetest.register_entity("automobiles_beetle:beetle", auto_beetle.car_properties1) + + +auto_beetle.car_properties2 = automobiles_lib.properties_copy(auto_beetle.car_properties1) +auto_beetle.car_properties2._vehicle_name = "Convertible Beetle" +auto_beetle.car_properties2.initial_properties = automobiles_lib.properties_copy(auto_beetle.car_properties1.initial_properties) +auto_beetle.car_properties2.initial_properties.mesh = "beetle_body_convertible.b3d" +auto_beetle.car_properties2.initial_properties.textures = automobiles_lib.properties_copy(auto_beetle.car_properties1.initial_properties.textures) +auto_beetle.car_properties2._color = "#FFB82D" +auto_beetle.car_properties2._formspec_function = auto_beetle.driver_formspec +auto_beetle.car_properties2._rag_extended_ent = 'automobiles_beetle:top' +auto_beetle.car_properties2._rag_retracted_ent = 'automobiles_beetle:top_retracted' +auto_beetle.car_properties2._show_rag = true + +minetest.register_entity("automobiles_beetle:beetle_conv", auto_beetle.car_properties2) + + +auto_beetle.car_properties3 = automobiles_lib.properties_copy(auto_beetle.car_properties1) +auto_beetle.car_properties3.initial_properties = automobiles_lib.properties_copy(auto_beetle.car_properties1.initial_properties) +auto_beetle.car_properties3._vehicle_scale = 0.1 +auto_beetle.car_properties3._vehicle_power_scale = 0.12 +auto_beetle.car_properties3._ground_friction = 0.5 +auto_beetle.car_properties3.initial_properties.collisionbox = {-0.01, -0.02, -0.01, 0.01, 0.18, 0.01} +auto_beetle.car_properties3.initial_properties.selectionbox = {-0.2, 0.0, -0.2, 0.2, 0.2, 0.2} +auto_beetle.car_properties3._color = "#992222" + +minetest.register_entity("automobiles_beetle:rc_beetle", auto_beetle.car_properties3) + diff --git a/mods/automobiles_pck/automobiles_beetle/forms.lua b/mods/automobiles_pck/automobiles_beetle/forms.lua new file mode 100644 index 0000000..c9185ba --- /dev/null +++ b/mods/automobiles_pck/automobiles_beetle/forms.lua @@ -0,0 +1,79 @@ +local S = auto_beetle.S + +function auto_beetle.driver_formspec(name) + local player = minetest.get_player_by_name(name) + local vehicle_obj = automobiles_lib.getCarFromPlayer(player) + if vehicle_obj == nil then + return + end + local ent = vehicle_obj:get_luaentity() + + local yaw = "false" + local one_hand = "false" + if ent._yaw_by_mouse then yaw = "true" end + if ent._one_hand then one_hand = "true" end + + local basic_form = table.concat({ + "formspec_version[3]", + "size[6,7]", + }, "") + + basic_form = basic_form.."button[1,1.0;4,1;go_out;" .. S("Go Offboard") .. "]" + basic_form = basic_form.."button[1,2.5;4,1;top;" .. S("Close/Open Ragtop") .. "]" + basic_form = basic_form.."button[1,4.0;4,1;lights;" .. S("Lights") .. "]" + basic_form = basic_form.."checkbox[1,5.5;yaw;" .. S("Direction by mouse") .. ";"..yaw.."]" + basic_form = basic_form.."checkbox[1,6.2;one_hand;" .. S("One Hand Driving\n(open menu using AUX)") .. ";"..one_hand.."]" + + minetest.show_formspec(name, "auto_beetle:driver_main", basic_form) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "auto_beetle:driver_main" then + local name = player:get_player_name() + local car_obj = automobiles_lib.getCarFromPlayer(player) + if car_obj then + local ent = car_obj:get_luaentity() + if ent then + if fields.top then + if ent._show_rag == true then + ent._show_rag = false + else + ent._show_rag = true + end + end + if fields.go_out then + + if ent._passenger then --any pax? + local pax_obj = minetest.get_player_by_name(ent._passenger) + automobiles_lib.dettach_pax(ent, pax_obj) + end + + automobiles_lib.dettach_driver(ent, player) + end + if fields.lights then + if ent._show_lights == true then + ent._show_lights = false + else + ent._show_lights = true + end + end + if fields.yaw then + if ent._yaw_by_mouse == true then + ent._yaw_by_mouse = false + else + ent._yaw_by_mouse = true + end + end + if fields.one_hand then + if ent._one_hand == true then + ent._one_hand = false + else + ent._one_hand = true + core.chat_send_player(name,core.colorize('#00ff00', S(" >>> Use AUX or key \"E\" to open the menu"))) + end + end + end + end + minetest.close_formspec(name, "auto_beetle:driver_main") + end +end) diff --git a/mods/automobiles_pck/automobiles_beetle/init.lua b/mods/automobiles_pck/automobiles_beetle/init.lua new file mode 100755 index 0000000..5f888ad --- /dev/null +++ b/mods/automobiles_pck/automobiles_beetle/init.lua @@ -0,0 +1,27 @@ +-- +-- constants +-- +auto_beetle={} +auto_beetle.gravity = automobiles_lib.gravity + +auto_beetle.S = nil + +if(minetest.get_translator ~= nil) then + auto_beetle.S = minetest.get_translator(minetest.get_current_modname()) + +else + auto_beetle.S = function ( s ) return s end + +end + +local S = auto_beetle.S + +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "custom_physics.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "control.lua") +dofile(minetest.get_modpath("automobiles_beetle") .. DIR_DELIM .. "forms.lua") +dofile(minetest.get_modpath("automobiles_beetle") .. DIR_DELIM .. "entities.lua") +dofile(minetest.get_modpath("automobiles_beetle") .. DIR_DELIM .. "crafts.lua") + + diff --git a/mods/automobiles_pck/automobiles_beetle/locale/automobiles_beetle.de.tr b/mods/automobiles_pck/automobiles_beetle/locale/automobiles_beetle.de.tr new file mode 100644 index 0000000..5c218eb --- /dev/null +++ b/mods/automobiles_pck/automobiles_beetle/locale/automobiles_beetle.de.tr @@ -0,0 +1,3 @@ +# textdomain: automobiles_beetle +Beetle Body=Käfer Karroserie +Beetle=Käfer diff --git a/mods/automobiles_pck/automobiles_beetle/locale/template.txt b/mods/automobiles_pck/automobiles_beetle/locale/template.txt new file mode 100644 index 0000000..b240eae --- /dev/null +++ b/mods/automobiles_pck/automobiles_beetle/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: automobiles_beetle +Beetle Body= +Beetle= diff --git a/mods/automobiles_pck/automobiles_beetle/mod.conf b/mods/automobiles_pck/automobiles_beetle/mod.conf new file mode 100755 index 0000000..003bf8c --- /dev/null +++ b/mods/automobiles_pck/automobiles_beetle/mod.conf @@ -0,0 +1,5 @@ +name=automobiles_beetle +title=Beetle +description=The old classic Beetle for Minetest +author=apercy +depends=automobiles_lib diff --git a/mods/automobiles_pck/automobiles_beetle/models/beetle_anim_wheel.b3d b/mods/automobiles_pck/automobiles_beetle/models/beetle_anim_wheel.b3d new file mode 100755 index 0000000..31b58f4 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/models/beetle_anim_wheel.b3d differ diff --git a/mods/automobiles_pck/automobiles_beetle/models/beetle_body.b3d b/mods/automobiles_pck/automobiles_beetle/models/beetle_body.b3d new file mode 100755 index 0000000..e05c242 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/models/beetle_body.b3d differ diff --git a/mods/automobiles_pck/automobiles_beetle/models/beetle_body_convertible.b3d b/mods/automobiles_pck/automobiles_beetle/models/beetle_body_convertible.b3d new file mode 100755 index 0000000..d296f9b Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/models/beetle_body_convertible.b3d differ diff --git a/mods/automobiles_pck/automobiles_beetle/models/beetle_f_lights.b3d b/mods/automobiles_pck/automobiles_beetle/models/beetle_f_lights.b3d new file mode 100755 index 0000000..1fd6713 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/models/beetle_f_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_beetle/models/beetle_f_suspension.b3d b/mods/automobiles_pck/automobiles_beetle/models/beetle_f_suspension.b3d new file mode 100755 index 0000000..740cb65 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/models/beetle_f_suspension.b3d differ diff --git a/mods/automobiles_pck/automobiles_beetle/models/beetle_pos_lights.b3d b/mods/automobiles_pck/automobiles_beetle/models/beetle_pos_lights.b3d new file mode 100755 index 0000000..b8114ef Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/models/beetle_pos_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_beetle/models/beetle_r_suspension.b3d b/mods/automobiles_pck/automobiles_beetle/models/beetle_r_suspension.b3d new file mode 100755 index 0000000..8c366c1 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/models/beetle_r_suspension.b3d differ diff --git a/mods/automobiles_pck/automobiles_beetle/models/beetle_reverse_lights.b3d b/mods/automobiles_pck/automobiles_beetle/models/beetle_reverse_lights.b3d new file mode 100755 index 0000000..6ae11ad Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/models/beetle_reverse_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_beetle/models/beetle_top.b3d b/mods/automobiles_pck/automobiles_beetle/models/beetle_top.b3d new file mode 100755 index 0000000..44882a0 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/models/beetle_top.b3d differ diff --git a/mods/automobiles_pck/automobiles_beetle/models/beetle_top_retracted.b3d b/mods/automobiles_pck/automobiles_beetle/models/beetle_top_retracted.b3d new file mode 100755 index 0000000..671db48 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/models/beetle_top_retracted.b3d differ diff --git a/mods/automobiles_pck/automobiles_beetle/models/beetle_turn_l_light.b3d b/mods/automobiles_pck/automobiles_beetle/models/beetle_turn_l_light.b3d new file mode 100755 index 0000000..3f3d51d Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/models/beetle_turn_l_light.b3d differ diff --git a/mods/automobiles_pck/automobiles_beetle/models/beetle_turn_r_light.b3d b/mods/automobiles_pck/automobiles_beetle/models/beetle_turn_r_light.b3d new file mode 100755 index 0000000..533bc57 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/models/beetle_turn_r_light.b3d differ diff --git a/mods/automobiles_pck/automobiles_beetle/sounds/beetle_engine.ogg b/mods/automobiles_pck/automobiles_beetle/sounds/beetle_engine.ogg new file mode 100644 index 0000000..261051a Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/sounds/beetle_engine.ogg differ diff --git a/mods/automobiles_pck/automobiles_beetle/sounds/beetle_horn.ogg b/mods/automobiles_pck/automobiles_beetle/sounds/beetle_horn.ogg new file mode 100755 index 0000000..a52b3c3 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/sounds/beetle_horn.ogg differ diff --git a/mods/automobiles_pck/automobiles_beetle/textures/automobiles_beetle.png b/mods/automobiles_pck/automobiles_beetle/textures/automobiles_beetle.png new file mode 100755 index 0000000..38767a1 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/textures/automobiles_beetle.png differ diff --git a/mods/automobiles_pck/automobiles_beetle/textures/automobiles_beetle_conv.png b/mods/automobiles_pck/automobiles_beetle/textures/automobiles_beetle_conv.png new file mode 100755 index 0000000..750c8ba Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/textures/automobiles_beetle_conv.png differ diff --git a/mods/automobiles_pck/automobiles_beetle/textures/beetle_body.png b/mods/automobiles_pck/automobiles_beetle/textures/beetle_body.png new file mode 100755 index 0000000..310c99d Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/textures/beetle_body.png differ diff --git a/mods/automobiles_pck/automobiles_beetle/textures/beetle_details.png b/mods/automobiles_pck/automobiles_beetle/textures/beetle_details.png new file mode 100755 index 0000000..cde268b Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/textures/beetle_details.png differ diff --git a/mods/automobiles_pck/automobiles_beetle/textures/beetle_glasses.png b/mods/automobiles_pck/automobiles_beetle/textures/beetle_glasses.png new file mode 100755 index 0000000..ae8c71e Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/textures/beetle_glasses.png differ diff --git a/mods/automobiles_pck/automobiles_beetle/textures/beetle_interior.png b/mods/automobiles_pck/automobiles_beetle/textures/beetle_interior.png new file mode 100755 index 0000000..ed92280 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/textures/beetle_interior.png differ diff --git a/mods/automobiles_pck/automobiles_beetle/textures/beetle_paint_interior.png b/mods/automobiles_pck/automobiles_beetle/textures/beetle_paint_interior.png new file mode 100755 index 0000000..ed92280 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/textures/beetle_paint_interior.png differ diff --git a/mods/automobiles_pck/automobiles_beetle/textures/beetle_painting.png b/mods/automobiles_pck/automobiles_beetle/textures/beetle_painting.png new file mode 100755 index 0000000..b37d935 Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/textures/beetle_painting.png differ diff --git a/mods/automobiles_pck/automobiles_beetle/textures/beetle_wheel.png b/mods/automobiles_pck/automobiles_beetle/textures/beetle_wheel.png new file mode 100755 index 0000000..456303a Binary files /dev/null and b/mods/automobiles_pck/automobiles_beetle/textures/beetle_wheel.png differ diff --git a/mods/automobiles_pck/automobiles_buggy/README.md b/mods/automobiles_pck/automobiles_buggy/README.md new file mode 100755 index 0000000..97e3f51 --- /dev/null +++ b/mods/automobiles_pck/automobiles_buggy/README.md @@ -0,0 +1,10 @@ +## Buggy + +This mod adds a buggy automobile to Minetest. + +## Licenses +- Code: see [LICENSE](/LICENSE) +- Media: see [license_media.txt](/license_media.txt) + +## Screenshot +![buggy](/automobiles_buggy/screenshot.jpg) diff --git a/mods/automobiles_pck/automobiles_buggy/buggy_crafts.lua b/mods/automobiles_pck/automobiles_buggy/buggy_crafts.lua new file mode 100644 index 0000000..4024df7 --- /dev/null +++ b/mods/automobiles_pck/automobiles_buggy/buggy_crafts.lua @@ -0,0 +1,81 @@ +local S = buggy.S + +-- +-- items +-- + +-- body +minetest.register_craftitem("automobiles_buggy:buggy_body",{ + description = S("Buggy Body"), + inventory_image = "automobiles_buggy_body.png", +}) +-- wheel +minetest.register_craftitem("automobiles_buggy:wheel",{ + description = S("Buggy Wheel"), + inventory_image = "automobiles_buggy_wheel_icon.png", +}) + +-- buggy +minetest.register_tool("automobiles_buggy:buggy", { + description = S("Buggy"), + inventory_image = "automobiles_buggy.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_buggy:buggy", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 50 --reset hp + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, S("Buggy")) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) + +-- +-- crafting +-- +if minetest.get_modpath("default") then + minetest.register_craft({ + output = "automobiles_buggy:buggy", + recipe = { + {"automobiles_buggy:wheel", "automobiles_lib:engine", "automobiles_buggy:wheel"}, + {"automobiles_buggy:wheel","automobiles_buggy:buggy_body", "automobiles_buggy:wheel"}, + } + }) + minetest.register_craft({ + output = "automobiles_buggy:buggy_body", + recipe = { + {"default:glass" ,"","default:steel_ingot"}, + {"default:steel_ingot","","default:steel_ingot"}, + {"default:steel_ingot","default:steel_ingot", "default:steel_ingot"}, + } + }) + minetest.register_craft({ + output = "automobiles_buggy:wheel", + recipe = { + {"default:steel_ingot", "default:tin_ingot", "default:steel_ingot"}, + {"default:tin_ingot","default:steelblock", "default:tin_ingot"}, + {"default:steel_ingot", "default:tin_ingot", "default:steel_ingot"}, + } + }) +end diff --git a/mods/automobiles_pck/automobiles_buggy/buggy_entities.lua b/mods/automobiles_pck/automobiles_buggy/buggy_entities.lua new file mode 100755 index 0000000..c0fd29d --- /dev/null +++ b/mods/automobiles_pck/automobiles_buggy/buggy_entities.lua @@ -0,0 +1,278 @@ +-- +-- entity +-- + +minetest.register_entity('automobiles_buggy:front_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "mesh", + mesh = "automobiles_buggy_f_suspension.b3d", + textures = {"automobiles_black.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + +minetest.register_entity('automobiles_buggy:rear_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + pointable=false, + visual = "mesh", + mesh = "automobiles_buggy_r_suspension.b3d", + textures = {"automobiles_black.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_buggy:f_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_buggy_f_lights.b3d", + textures = {"automobiles_grey.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_buggy:r_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_buggy_r_lights.b3d", + textures = {"automobiles_rear_lights_off.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_buggy:f_wheel',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_buggy_f_wheel.b3d", + backface_culling = false, + textures = {"automobiles_black.png", "automobiles_metal.png", "automobiles_buggy_wheel.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_buggy:r_wheel',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_buggy_r_wheel.b3d", + backface_culling = false, + textures = {"automobiles_black.png", "automobiles_metal.png", "automobiles_buggy_wheel.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_buggy:rag',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_buggy_rag.b3d", + backface_culling = false, + textures = {"automobiles_black.png", "automobiles_buggy_rag_window.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity("automobiles_buggy:buggy", { + initial_properties = { + physical = true, + collide_with_objects = true, + collisionbox = {-0.1, -0.45, -0.1, 0.1, 1, 0.1}, + selectionbox = {-1.5, 0.0, -1.5, 1.5, 2, 1.5}, + stepheight = 0.7 + automobiles_lib.extra_stepheight, + visual = "mesh", + mesh = "automobiles_buggy_body.b3d", + textures = { + "automobiles_black.png", --bancos + "automobiles_painting.png", --carroceria + "automobiles_black.png", --banco traseiro + "automobiles_black.png", --chssis + "automobiles_metal.png", --frontlights + "automobiles_black.png", --interior + "automobiles_metal.png", --engine + "automobiles_buggy_fuel.png", --panel + "automobiles_metal.png", --windshield + "automobiles_buggy_windshield.png", --windshield + "automobiles_metal.png", --engine protection + "automobiles_metal.png", --front protection + "automobiles_metal.png", --driver protection + "automobiles_black.png", -- engine details + "automobiles_metal.png", "automobiles_black.png", --volante + }, + }, + textures = {}, + driver_name = nil, + sound_handle = nil, + owner = "", + static_save = true, + infotext = "A very nice buggy!", + hp = 50, + buoyancy = 2, + physics = automobiles_lib.physics, + lastvelocity = vector.new(), + time_total = 0, + _passenger = nil, + _color = "#ff8b0e", + _steering_angle = 0, + _engine_running = false, + _last_checkpoint = "", + _total_laps = -1, + _race_id = "", + _energy = 1, + _last_time_collision_snd = 0, + _last_time_drift_snd = 0, + _last_time_command = 0, + _roll = math.rad(0), + _pitch = 0, + _longit_speed = 0, + _show_rag = true, + _show_lights = false, + _light_old_pos = nil, + _last_ground_check = 0, + _last_light_move = 0, + _last_engine_sound_update = 0, + _inv = nil, + _inv_id = "", + _change_color = automobiles_lib.paint, + _intensity = 4, + _trunk_slots = 8, + _engine_sound = "buggy_engine", + _max_fuel = 10, + _formspec_function = buggy.driver_formspec, + + _vehicle_name = "Buggy", + _drive_wheel_pos = {x=-4.26,y=6.01,z=16}, + _drive_wheel_angle = 15, + _rag_extended_ent = 'automobiles_buggy:rag', + _seat_pos = {{x=-4.25,y=0.48,z=9.5},{x=4.25,y=0.48,z=9.5}}, + + _front_suspension_ent = 'automobiles_buggy:front_suspension', + _front_suspension_pos = {x=0,y=-0.7,z=23}, + _front_wheel_ent = 'automobiles_buggy:f_wheel', + _front_wheel_xpos = 8, + _front_wheel_frames = {x = 1, y = 13}, + _rear_suspension_ent = 'automobiles_buggy:rear_suspension', + _rear_suspension_pos = {x=0,y=0,z=0}, + _rear_wheel_ent = 'automobiles_buggy:r_wheel', + _rear_wheel_xpos = 8, + _rear_wheel_frames = {x = 1, y = 13}, + + _fuel_gauge_pos = {x=0,y=4.65,z=15.17}, + _front_lights = 'automobiles_buggy:f_lights', + _rear_lights = 'automobiles_buggy:r_lights', + + _LONGIT_DRAG_FACTOR = 0.12*0.12, + _LATER_DRAG_FACTOR = 6.0, + _max_acc_factor = 5, + _max_speed = 15, + _min_later_speed = 4.0, + _consumption_divisor = 60000, + + get_staticdata = automobiles_lib.get_staticdata, + + on_deactivate = function(self) + automobiles_lib.save_inventory(self) + end, + + on_activate = automobiles_lib.on_activate, + + on_step = automobiles_lib.on_step, + + on_punch = automobiles_lib.on_punch, + on_rightclick = automobiles_lib.on_rightclick, +}) + + diff --git a/mods/automobiles_pck/automobiles_buggy/buggy_forms.lua b/mods/automobiles_pck/automobiles_buggy/buggy_forms.lua new file mode 100644 index 0000000..c073b81 --- /dev/null +++ b/mods/automobiles_pck/automobiles_buggy/buggy_forms.lua @@ -0,0 +1,79 @@ +local S = buggy.S + +function buggy.driver_formspec(name) + local player = minetest.get_player_by_name(name) + local vehicle_obj = automobiles_lib.getCarFromPlayer(player) + if vehicle_obj == nil then + return + end + local ent = vehicle_obj:get_luaentity() + + local yaw = "false" + local one_hand = "false" + if ent._yaw_by_mouse then yaw = "true" end + if ent._one_hand then one_hand = "true" end + + local basic_form = table.concat({ + "formspec_version[3]", + "size[6,7]", + }, "") + + basic_form = basic_form.."button[1,1.0;4,1;go_out;" .. S("Go Offboard") .. "]" + basic_form = basic_form.."button[1,2.5;4,1;top;" .. S("Close/Open Rag") .. "]" + basic_form = basic_form.."button[1,4.0;4,1;lights;" .. S("Lights") .. "]" + basic_form = basic_form.."checkbox[1,5.5;yaw;" .. S("Direction by mouse") .. ";"..yaw.."]" + basic_form = basic_form.."checkbox[1,6.2;one_hand;" .. S("One Hand Driving\n(open menu using AUX)") .. ";"..one_hand.."]" + + minetest.show_formspec(name, "buggy:driver_main", basic_form) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "buggy:driver_main" then + local name = player:get_player_name() + local car_obj = automobiles_lib.getCarFromPlayer(player) + if car_obj then + local ent = car_obj:get_luaentity() + if ent then + if fields.top then + if ent._show_rag == true then + ent._show_rag = false + else + ent._show_rag = true + end + end + if fields.go_out then + + if ent._passenger then --any pax? + local pax_obj = minetest.get_player_by_name(ent._passenger) + automobiles_lib.dettach_pax(ent, pax_obj) + end + + automobiles_lib.dettach_driver(ent, player) + end + if fields.lights then + if ent._show_lights == true then + ent._show_lights = false + else + ent._show_lights = true + end + end + if fields.yaw then + if ent._yaw_by_mouse == true then + ent._yaw_by_mouse = false + else + ent._yaw_by_mouse = true + end + end + if fields.one_hand then + if ent._one_hand == true then + ent._one_hand = false + else + ent._one_hand = true + core.chat_send_player(name,core.colorize('#00ff00', S(" >>> Use AUX or key \"E\" to open the menu"))) + end + end + end + end + minetest.close_formspec(name, "buggy:driver_main") + end +end) diff --git a/mods/automobiles_pck/automobiles_buggy/init.lua b/mods/automobiles_pck/automobiles_buggy/init.lua new file mode 100755 index 0000000..4a8b404 --- /dev/null +++ b/mods/automobiles_pck/automobiles_buggy/init.lua @@ -0,0 +1,27 @@ +-- +-- constants +-- +buggy={} +buggy.gravity = automobiles_lib.gravity + +buggy.S = nil + +if(minetest.get_translator ~= nil) then + buggy.S = minetest.get_translator(minetest.get_current_modname()) + +else + buggy.S = function ( s ) return s end + +end + +local S = buggy.S + +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "custom_physics.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "control.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") +dofile(minetest.get_modpath("automobiles_buggy") .. DIR_DELIM .. "buggy_forms.lua") +dofile(minetest.get_modpath("automobiles_buggy") .. DIR_DELIM .. "buggy_entities.lua") +dofile(minetest.get_modpath("automobiles_buggy") .. DIR_DELIM .. "buggy_crafts.lua") + + diff --git a/mods/automobiles_pck/automobiles_buggy/locale/automobiles_buggy.de.tr b/mods/automobiles_pck/automobiles_buggy/locale/automobiles_buggy.de.tr new file mode 100644 index 0000000..b1e86dc --- /dev/null +++ b/mods/automobiles_pck/automobiles_buggy/locale/automobiles_buggy.de.tr @@ -0,0 +1,9 @@ +# textdomain: automobiles_buggy +### buggy_crafts.lua ### +Buggy Body=Buggy Karrosserie +Buggy Wheel=Buggy Rad +Buggy=Buggy +Go Offboard=Aussteigen +Close/Open Rag=Öffne/Schließe Sonnendach +Lights=Lichter +Direction by mouse=Lenke mit Maus diff --git a/mods/automobiles_pck/automobiles_buggy/locale/automobiles_buggy.eo.tr b/mods/automobiles_pck/automobiles_buggy/locale/automobiles_buggy.eo.tr new file mode 100644 index 0000000..725aff3 --- /dev/null +++ b/mods/automobiles_pck/automobiles_buggy/locale/automobiles_buggy.eo.tr @@ -0,0 +1,9 @@ +# textdomain: automobiles_buggy +### buggy_crafts.lua ### +Buggy Body=Korpo de Buggy +Buggy Wheel=Rado de Buggy +Buggy=Buggy +Go Offboard= +Close/Open Rag= +Lights= +Direction by mouse= diff --git a/mods/automobiles_pck/automobiles_buggy/locale/template.txt b/mods/automobiles_pck/automobiles_buggy/locale/template.txt new file mode 100644 index 0000000..6c48028 --- /dev/null +++ b/mods/automobiles_pck/automobiles_buggy/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: automobiles_buggy +### buggy_crafts.lua ### +Buggy Body= +Buggy Wheel= +Buggy= +Go Offboard= +Close/Open Rag= +Lights= +Direction by mouse= diff --git a/mods/automobiles_pck/automobiles_buggy/mod.conf b/mods/automobiles_pck/automobiles_buggy/mod.conf new file mode 100755 index 0000000..a31b1bc --- /dev/null +++ b/mods/automobiles_pck/automobiles_buggy/mod.conf @@ -0,0 +1,5 @@ +name=automobiles_buggy +title=Buggy +description=A buggy +author=apercy +depends=automobiles_lib diff --git a/mods/automobiles_pck/automobiles_buggy/mod_translation_updater.py b/mods/automobiles_pck/automobiles_buggy/mod_translation_updater.py new file mode 100755 index 0000000..b2feaaf --- /dev/null +++ b/mods/automobiles_pck/automobiles_buggy/mod_translation_updater.py @@ -0,0 +1,495 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Script to generate Minetest translation template files and update +# translation files. +# +# Copyright (C) 2019 Joachim Stolberg, 2020 FaceDeer, 2020 Louis Royer, +# 2023 Wuzzy. +# License: LGPLv2.1 or later (see LICENSE file for details) + +import os, fnmatch, re, shutil, errno +from sys import argv as _argv +from sys import stderr as _stderr + +# Running params +params = {"recursive": False, + "help": False, + "verbose": False, + "folders": [], + "old-file": False, + "break-long-lines": False, + "print-source": False, + "truncate-unused": False, +} +# Available CLI options +options = {"recursive": ['--recursive', '-r'], + "help": ['--help', '-h'], + "verbose": ['--verbose', '-v'], + "old-file": ['--old-file', '-o'], + "break-long-lines": ['--break-long-lines', '-b'], + "print-source": ['--print-source', '-p'], + "truncate-unused": ['--truncate-unused', '-t'], +} + +# Strings longer than this will have extra space added between +# them in the translation files to make it easier to distinguish their +# beginnings and endings at a glance +doublespace_threshold = 80 + +# These symbols mark comment lines showing the source file name. +# A comment may look like "##[ init.lua ]##". +symbol_source_prefix = "##[" +symbol_source_suffix = "]##" + +# comment to mark the section of old/unused strings +comment_unused = "##### not used anymore #####" + +def set_params_folders(tab: list): + '''Initialize params["folders"] from CLI arguments.''' + # Discarding argument 0 (tool name) + for param in tab[1:]: + stop_param = False + for option in options: + if param in options[option]: + stop_param = True + break + if not stop_param: + params["folders"].append(os.path.abspath(param)) + +def set_params(tab: list): + '''Initialize params from CLI arguments.''' + for option in options: + for option_name in options[option]: + if option_name in tab: + params[option] = True + break + +def print_help(name): + '''Prints some help message.''' + print(f'''SYNOPSIS + {name} [OPTIONS] [PATHS...] +DESCRIPTION + {', '.join(options["help"])} + prints this help message + {', '.join(options["recursive"])} + run on all subfolders of paths given + {', '.join(options["old-file"])} + create *.old files + {', '.join(options["break-long-lines"])} + add extra line breaks before and after long strings + {', '.join(options["print-source"])} + add comments denoting the source file + {', '.join(options["verbose"])} + add output information + {', '.join(options["truncate-unused"])} + delete unused strings from files +''') + +def main(): + '''Main function''' + set_params(_argv) + set_params_folders(_argv) + if params["help"]: + print_help(_argv[0]) + else: + # Add recursivity message + print("Running ", end='') + if params["recursive"]: + print("recursively ", end='') + # Running + if len(params["folders"]) >= 2: + print("on folder list:", params["folders"]) + for f in params["folders"]: + if params["recursive"]: + run_all_subfolders(f) + else: + update_folder(f) + elif len(params["folders"]) == 1: + print("on folder", params["folders"][0]) + if params["recursive"]: + run_all_subfolders(params["folders"][0]) + else: + update_folder(params["folders"][0]) + else: + print("on folder", os.path.abspath("./")) + if params["recursive"]: + run_all_subfolders(os.path.abspath("./")) + else: + update_folder(os.path.abspath("./")) + +# Group 2 will be the string, groups 1 and 3 will be the delimiters (" or ') +# See https://stackoverflow.com/questions/46967465/regex-match-text-in-either-single-or-double-quote +pattern_lua_quoted = re.compile( + r'(?:^|[\.=,{\(\s])' # Look for beginning of file or anything that isn't a function identifier + r'N?F?S\s*\(\s*' # Matches S, FS, NS or NFS function call + r'(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)' # Quoted string + r'[\s,\)]', # End of call or argument + re.DOTALL) +# Handles the [[ ... ]] string delimiters +pattern_lua_bracketed = re.compile( + r'(?:^|[\.=,{\(\s])' # Same as for pattern_lua_quoted + r'N?F?S\s*\(\s*' # Same as for pattern_lua_quoted + r'\[\[(.*?)\]\]' # [[ ... ]] string delimiters + r'[\s,\)]', # Same as for pattern_lua_quoted + re.DOTALL) + +# Handles "concatenation" .. " of strings" +pattern_concat = re.compile(r'["\'][\s]*\.\.[\s]*["\']', re.DOTALL) + +# Handles a translation line in *.tr file. +# Group 1 is the source string left of the equals sign. +# Group 2 is the translated string, right of the equals sign. +pattern_tr = re.compile( + r'(.*)' # Source string + # the separating equals sign, if NOT preceded by @, unless + # that @ is preceded by another @ + r'(?:(?2.5 + if exc.errno == errno.EEXIST and os.path.isdir(path): + pass + else: raise + +# Converts the template dictionary to a text to be written as a file +# dKeyStrings is a dictionary of localized string to source file sets +# dOld is a dictionary of existing translations and comments from +# the previous version of this text +def strings_to_text(dkeyStrings, dOld, mod_name, header_comments, textdomain): + # if textdomain is specified, insert it at the top + if textdomain != None: + lOut = [textdomain] # argument is full textdomain line + # otherwise, use mod name as textdomain automatically + else: + lOut = [f"# textdomain: {mod_name}"] + if header_comments is not None: + lOut.append(header_comments) + + dGroupedBySource = {} + + for key in dkeyStrings: + sourceList = list(dkeyStrings[key]) + sourceString = "\n".join(sourceList) + listForSource = dGroupedBySource.get(sourceString, []) + listForSource.append(key) + dGroupedBySource[sourceString] = listForSource + + lSourceKeys = list(dGroupedBySource.keys()) + lSourceKeys.sort() + for source in lSourceKeys: + localizedStrings = dGroupedBySource[source] + if params["print-source"]: + if lOut[-1] != "": + lOut.append("") + lOut.append(source) + for localizedString in localizedStrings: + val = dOld.get(localizedString, {}) + translation = val.get("translation", "") + comment = val.get("comment") + if params["break-long-lines"] and len(localizedString) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None and comment != "" and not comment.startswith("# textdomain:"): + lOut.append(comment) + lOut.append(f"{localizedString}={translation}") + if params["break-long-lines"] and len(localizedString) > doublespace_threshold: + lOut.append("") + + unusedExist = False + if not params["truncate-unused"]: + for key in dOld: + if key not in dkeyStrings: + val = dOld[key] + translation = val.get("translation") + comment = val.get("comment") + # only keep an unused translation if there was translated + # text or a comment associated with it + if translation != None and (translation != "" or comment): + if not unusedExist: + unusedExist = True + lOut.append("\n\n" + comment_unused + "\n") + if params["break-long-lines"] and len(key) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None: + lOut.append(comment) + lOut.append(f"{key}={translation}") + if params["break-long-lines"] and len(key) > doublespace_threshold: + lOut.append("") + return "\n".join(lOut) + '\n' + +# Writes a template.txt file +# dkeyStrings is the dictionary returned by generate_template +def write_template(templ_file, dkeyStrings, mod_name): + # read existing template file to preserve comments + existing_template = import_tr_file(templ_file) + + text = strings_to_text(dkeyStrings, existing_template[0], mod_name, existing_template[2], existing_template[3]) + mkdir_p(os.path.dirname(templ_file)) + with open(templ_file, "wt", encoding='utf-8') as template_file: + template_file.write(text) + +# Gets all translatable strings from a lua file +def read_lua_file_strings(lua_file): + lOut = [] + with open(lua_file, encoding='utf-8') as text_file: + text = text_file.read() + + text = re.sub(pattern_concat, "", text) + + strings = [] + for s in pattern_lua_quoted.findall(text): + strings.append(s[1]) + for s in pattern_lua_bracketed.findall(text): + strings.append(s) + + for s in strings: + found_bad = pattern_bad_luastring.search(s) + if found_bad: + print("SYNTAX ERROR: Unescaped '@' in Lua string: " + s) + continue + s = s.replace('\\"', '"') + s = s.replace("\\'", "'") + s = s.replace("\n", "@n") + s = s.replace("\\n", "@n") + s = s.replace("=", "@=") + lOut.append(s) + return lOut + +# Gets strings from an existing translation file +# returns both a dictionary of translations +# and the full original source text so that the new text +# can be compared to it for changes. +# Returns also header comments in the third return value. +def import_tr_file(tr_file): + dOut = {} + text = None + in_header = True + header_comments = None + textdomain = None + if os.path.exists(tr_file): + with open(tr_file, "r", encoding='utf-8') as existing_file : + # save the full text to allow for comparison + # of the old version with the new output + text = existing_file.read() + existing_file.seek(0) + # a running record of the current comment block + # we're inside, to allow preceeding multi-line comments + # to be retained for a translation line + latest_comment_block = None + for line in existing_file.readlines(): + line = line.rstrip('\n') + # "##### not used anymore #####" comment + if line == comment_unused: + # Always delete the 'not used anymore' comment. + # It will be re-added to the file if neccessary. + latest_comment_block = None + if header_comments != None: + in_header = False + continue + # Comment lines + elif line.startswith("#"): + # Source file comments: ##[ file.lua ]## + if line.startswith(symbol_source_prefix) and line.endswith(symbol_source_suffix): + # This line marks the end of header comments. + if params["print-source"]: + in_header = False + # Remove those comments; they may be added back automatically. + continue + + # Store first occurance of textdomain + # discard all subsequent textdomain lines + if line.startswith("# textdomain:"): + if textdomain == None: + textdomain = line + continue + elif in_header: + # Save header comments (normal comments at top of file) + if not header_comments: + header_comments = line + else: + header_comments = header_comments + "\n" + line + else: + # Save normal comments + if line.startswith("# textdomain:") and textdomain == None: + textdomain = line + elif not latest_comment_block: + latest_comment_block = line + else: + latest_comment_block = latest_comment_block + "\n" + line + + continue + + match = pattern_tr.match(line) + if match: + # this line is a translated line + outval = {} + outval["translation"] = match.group(2) + if latest_comment_block: + # if there was a comment, record that. + outval["comment"] = latest_comment_block + latest_comment_block = None + in_header = False + + dOut[match.group(1)] = outval + return (dOut, text, header_comments, textdomain) + +# like os.walk but returns sorted filenames +def sorted_os_walk(folder): + tuples = [] + t = 0 + for root, dirs, files in os.walk(folder): + tuples.append( (root, dirs, files) ) + t = t + 1 + + tuples = sorted(tuples) + + paths_and_files = [] + f = 0 + + for tu in tuples: + root = tu[0] + dirs = tu[1] + files = tu[2] + files = sorted(files, key=str.lower) + for filename in files: + paths_and_files.append( (os.path.join(root, filename), filename) ) + f = f + 1 + return paths_and_files + +# Walks all lua files in the mod folder, collects translatable strings, +# and writes it to a template.txt file +# Returns a dictionary of localized strings to source file lists +# that can be used with the strings_to_text function. +def generate_template(folder, mod_name): + dOut = {} + paths_and_files = sorted_os_walk(folder) + for paf in paths_and_files: + fullpath_filename = paf[0] + filename = paf[1] + if fnmatch.fnmatch(filename, "*.lua"): + found = read_lua_file_strings(fullpath_filename) + if params["verbose"]: + print(f"{fullpath_filename}: {str(len(found))} translatable strings") + + for s in found: + sources = dOut.get(s, set()) + sources.add(os.path.relpath(fullpath_filename, start=folder)) + dOut[s] = sources + + if len(dOut) == 0: + return None + + # Convert source file set to list, sort it and add comment symbols. + # Needed because a set is unsorted and might result in unpredictable. + # output orders if any source string appears in multiple files. + for d in dOut: + sources = dOut.get(d, set()) + sources = sorted(list(sources), key=str.lower) + newSources = [] + for i in sources: + newSources.append(f"{symbol_source_prefix} {i} {symbol_source_suffix}") + dOut[d] = newSources + + templ_file = os.path.join(folder, "locale/template.txt") + write_template(templ_file, dOut, mod_name) + return dOut + +# Updates an existing .tr file, copying the old one to a ".old" file +# if any changes have happened +# dNew is the data used to generate the template, it has all the +# currently-existing localized strings +def update_tr_file(dNew, mod_name, tr_file): + if params["verbose"]: + print(f"updating {tr_file}") + + tr_import = import_tr_file(tr_file) + dOld = tr_import[0] + textOld = tr_import[1] + + textNew = strings_to_text(dNew, dOld, mod_name, tr_import[2], tr_import[3]) + + if textOld and textOld != textNew: + print(f"{tr_file} has changed.") + if params["old-file"]: + shutil.copyfile(tr_file, f"{tr_file}.old") + + with open(tr_file, "w", encoding='utf-8') as new_tr_file: + new_tr_file.write(textNew) + +# Updates translation files for the mod in the given folder +def update_mod(folder): + modname = get_modname(folder) + if modname is not None: + print(f"Updating translations for {modname}") + data = generate_template(folder, modname) + if data == None: + print(f"No translatable strings found in {modname}") + else: + for tr_file in get_existing_tr_files(folder): + update_tr_file(data, modname, os.path.join(folder, "locale/", tr_file)) + else: + print(f"Unable to determine the mod name in folder {folder}. Missing 'name' field in mod.conf.", file=_stderr) + exit(1) + +# Determines if the folder being pointed to is a mod or a mod pack +# and then runs update_mod accordingly +def update_folder(folder): + is_modpack = os.path.exists(os.path.join(folder, "modpack.txt")) or os.path.exists(os.path.join(folder, "modpack.conf")) + if is_modpack: + subfolders = [f.path for f in os.scandir(folder) if f.is_dir() and not f.name.startswith('.')] + for subfolder in subfolders: + update_mod(subfolder) + else: + update_mod(folder) + print("Done.") + +def run_all_subfolders(folder): + for modfolder in [f.path for f in os.scandir(folder) if f.is_dir() and not f.name.startswith('.')]: + update_folder(modfolder) + +main() diff --git a/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_body.b3d b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_body.b3d new file mode 100755 index 0000000..92fbfdd Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_body.b3d differ diff --git a/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_drive_wheel.b3d b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_drive_wheel.b3d new file mode 100755 index 0000000..eeb9858 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_drive_wheel.b3d differ diff --git a/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_f_lights.b3d b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_f_lights.b3d new file mode 100755 index 0000000..436aba0 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_f_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_f_suspension.b3d b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_f_suspension.b3d new file mode 100755 index 0000000..740cb65 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_f_suspension.b3d differ diff --git a/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_f_wheel.b3d b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_f_wheel.b3d new file mode 100755 index 0000000..216e434 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_f_wheel.b3d differ diff --git a/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_r_lights.b3d b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_r_lights.b3d new file mode 100755 index 0000000..e6a58cb Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_r_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_r_suspension.b3d b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_r_suspension.b3d new file mode 100755 index 0000000..8c366c1 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_r_suspension.b3d differ diff --git a/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_r_wheel.b3d b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_r_wheel.b3d new file mode 100755 index 0000000..a302b34 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_r_wheel.b3d differ diff --git a/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_rag.b3d b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_rag.b3d new file mode 100755 index 0000000..3d20230 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/models/automobiles_buggy_rag.b3d differ diff --git a/mods/automobiles_pck/automobiles_buggy/screenshot.jpg b/mods/automobiles_pck/automobiles_buggy/screenshot.jpg new file mode 100644 index 0000000..3a50d18 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/screenshot.jpg differ diff --git a/mods/automobiles_pck/automobiles_buggy/sounds/buggy_engine.ogg b/mods/automobiles_pck/automobiles_buggy/sounds/buggy_engine.ogg new file mode 100644 index 0000000..3085b33 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/sounds/buggy_engine.ogg differ diff --git a/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy.png b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy.png new file mode 100755 index 0000000..06e54ea Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy.png differ diff --git a/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_body.png b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_body.png new file mode 100755 index 0000000..69539e9 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_body.png differ diff --git a/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_fuel.png b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_fuel.png new file mode 100755 index 0000000..089e6c4 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_fuel.png differ diff --git a/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_lights.png b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_lights.png new file mode 100755 index 0000000..6c7d532 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_lights.png differ diff --git a/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_rag_window.png b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_rag_window.png new file mode 100755 index 0000000..6768074 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_rag_window.png differ diff --git a/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_rear_lights.png b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_rear_lights.png new file mode 100644 index 0000000..d78b416 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_rear_lights.png differ diff --git a/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_rear_lights_full.png b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_rear_lights_full.png new file mode 100644 index 0000000..4b47e67 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_rear_lights_full.png differ diff --git a/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_rear_lights_off.png b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_rear_lights_off.png new file mode 100644 index 0000000..68ab0e3 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_rear_lights_off.png differ diff --git a/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_wheel.png b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_wheel.png new file mode 100755 index 0000000..456303a Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_wheel.png differ diff --git a/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_wheel_icon.png b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_wheel_icon.png new file mode 100755 index 0000000..3ab797b Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_wheel_icon.png differ diff --git a/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_windshield.png b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_windshield.png new file mode 100644 index 0000000..c267c32 Binary files /dev/null and b/mods/automobiles_pck/automobiles_buggy/textures/automobiles_buggy_windshield.png differ diff --git a/mods/automobiles_pck/automobiles_catrelle/README.md b/mods/automobiles_pck/automobiles_catrelle/README.md new file mode 100755 index 0000000..43781e0 --- /dev/null +++ b/mods/automobiles_pck/automobiles_catrelle/README.md @@ -0,0 +1,10 @@ +## Catrelle + +This mod adds a catrelle automobile to Minetest. + +## Licenses +- Code: see [LICENSE](/LICENSE) +- Media: Model made by myself; licence CC0 + +## Screenshot +![catrelle](/automobiles_catrelle/screenshot.jpg) diff --git a/mods/automobiles_pck/automobiles_catrelle/crafts.lua b/mods/automobiles_pck/automobiles_catrelle/crafts.lua new file mode 100644 index 0000000..8705ac6 --- /dev/null +++ b/mods/automobiles_pck/automobiles_catrelle/crafts.lua @@ -0,0 +1,114 @@ +local S = catrelle.S + +-- +-- items +-- + +-- body +minetest.register_craftitem("automobiles_catrelle:catrelle_body",{ + description = S("Catrelle Body"), + inventory_image = "automobiles_catrelle_body.png", +}) + +-- catrelle +minetest.register_tool("automobiles_catrelle:catrelle", { + description = S("Catrelle"), + inventory_image = "automobiles_catrelle.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_catrelle:catrelle", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 50 --reset hp + ent._catrelle_type = ent._catrelle_type or 0 + --minetest.chat_send_all("owner: " .. ent.owner) + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, S("Catrelle")) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) + +-- catrelle TL +minetest.register_tool("automobiles_catrelle:catrelle_4f", { + description = S("Catrelle 4F"), + inventory_image = "automobiles_catrelle.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_catrelle:catrelle_4f", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 50 --reset hp + ent._catrelle_type = ent._catrelle_type or 1 + --minetest.chat_send_all("owner: " .. ent.owner) + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, "Catrelle 4F") + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) + +-- +-- crafting +-- +if minetest.get_modpath("default") then + minetest.register_craft({ + output = "automobiles_catrelle:catrelle_4f", + recipe = { + {"automobiles_catrelle:catrelle", "default:glass", "default:steelblock"}, + } + }) + minetest.register_craft({ + output = "automobiles_catrelle:catrelle", + recipe = { + {"automobiles_lib:wheel", "automobiles_lib:engine", "automobiles_lib:wheel"}, + {"automobiles_lib:wheel","automobiles_catrelle:catrelle_body", "automobiles_lib:wheel"}, + } + }) + minetest.register_craft({ + output = "automobiles_catrelle:catrelle_body", + recipe = { + {"default:glass" ,"default:steel_ingot","default:steel_ingot"}, + {"default:steel_ingot","default:steel_ingot","default:steel_ingot"}, + {"default:steelblock","default:steelblock", "default:steelblock"}, + } + }) +end diff --git a/mods/automobiles_pck/automobiles_catrelle/entities.lua b/mods/automobiles_pck/automobiles_catrelle/entities.lua new file mode 100755 index 0000000..f0d8ef5 --- /dev/null +++ b/mods/automobiles_pck/automobiles_catrelle/entities.lua @@ -0,0 +1,332 @@ +function catrelle.extra_parts(self) + local pos = self.object:get_pos() + local back_seat = minetest.add_entity(pos,'automobiles_catrelle:back_seat') + back_seat:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.back_seat = back_seat +end + +-- +-- entity +-- + +minetest.register_entity('automobiles_catrelle:wheel',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_catrelle_wheel.b3d", + backface_culling = false, + textures = {"automobiles_black.png", "automobiles_metal.png", "automobiles_catrelle_wheel.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_catrelle:front_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "sprite", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + +minetest.register_entity('automobiles_catrelle:rear_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + pointable=false, + visual = "sprite", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_catrelle:f_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_catrelle_f_lights.b3d", + textures = {"automobiles_grey.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_catrelle:r_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_catrelle_pos_lights.b3d", + textures = {"automobiles_rear_lights_off.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_catrelle:turn_left_light',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_catrelle_turn_l_light.b3d", + textures = {"automobiles_turn.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_catrelle:turn_right_light',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_catrelle_turn_r_light.b3d", + textures = {"automobiles_turn.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_catrelle:back_seat',{ +initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "mesh", + mesh = "automobiles_catrelle_seat.b3d", + textures = {"automobiles_black.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + +catrelle.car_properties1 = { + initial_properties = { + physical = true, + collide_with_objects = true, + collisionbox = {-0.1, -0.4, -0.1, 0.1, 1.8, 0.1}, + selectionbox = {-2.0, 0.0, -2.0, 2.0, 2, 2.0}, + stepheight = 0.65 + automobiles_lib.extra_stepheight, + visual = "mesh", + mesh = "automobiles_catrelle_body.b3d", + textures = { + "automobiles_black.png", --bancos + "automobiles_painting.png", --pintura + "automobiles_black.png", --paralamas + "automobiles_black.png", --grade_motor + "automobiles_catrelle_bars.png", --grade_motor + "automobiles_painting.png", --interior 1 + "automobiles_dark_grey.png", --interior 2 + "automobiles_black.png", --painel1 + "automobiles_painting.png", --lat glass interno + "automobiles_painting.png", --lat glass externo + "automobiles_catrelle_fuel.png", --combustivel + "automobiles_catrelle_glass.png", --parabrisa + "automobiles_metal.png", --para choques + "automobiles_painting.png", --pintura portas + "automobiles_dark_grey.png", --forracao portas + "automobiles_catrelle_glass.png", --vidros + "automobiles_black.png", --volante + "automobiles_black.png", --ventilação + }, + }, + textures = {}, + driver_name = nil, + sound_handle = nil, + owner = "", + static_save = true, + infotext = "A very nice Catrelle!", + hp = 50, + buoyancy = 2, + physics = automobiles_lib.physics, + lastvelocity = vector.new(), + time_total = 0, + _passenger = nil, + _color = "#07B6BC", + _steering_angle = 0, + _engine_running = false, + _last_checkpoint = "", + _total_laps = -1, + _race_id = "", + _energy = 1, + _last_time_collision_snd = 0, + _last_time_drift_snd = 0, + _last_time_command = 0, + _roll = math.rad(0), + _pitch = 0, + _longit_speed = 0, + _show_rag = true, + _show_lights = false, + _light_old_pos = nil, + _last_ground_check = 0, + _last_light_move = 0, + _last_engine_sound_update = 0, + _turn_light_timer = 0, + _inv = nil, + _inv_id = "", + _change_color = automobiles_lib.paint, + _intensity = 4, + _car_gravity = -automobiles_lib.gravity, + _is_flying = 0, + _trunk_slots = 32, + _engine_sound = "automobiles_engine", + _max_fuel = 10, + + _vehicle_name = "Catrelle", + _drive_wheel_pos = {x=-4.0, y=8.00, z=21}, + _drive_wheel_angle = 15, + _seat_pos = {{x=-4.0,y=3,z=15},{x=4.0,y=3,z=15}}, + + _front_suspension_ent = 'automobiles_catrelle:front_suspension', + _front_suspension_pos = {x=0,y=-0.2,z=29}, + _front_wheel_ent = 'automobiles_catrelle:wheel', + _front_wheel_xpos = 7.5, + _front_wheel_frames = {x = 1, y = 49}, + _rear_suspension_ent = 'automobiles_catrelle:rear_suspension', + _rear_suspension_pos = {x=0,y=-0.2,z=0}, + _rear_wheel_ent = 'automobiles_catrelle:wheel', + _rear_wheel_xpos = 7.5, + _rear_wheel_frames = {x = 1, y = 49}, + + _fuel_gauge_pos = {x=-4.47,y=8.50,z=20.5}, + _front_lights = 'automobiles_catrelle:f_lights', + _rear_lights = 'automobiles_catrelle:r_lights', + _turn_left_lights = 'automobiles_catrelle:turn_left_light', + _turn_right_lights = 'automobiles_catrelle:turn_right_light', + _textures_turn_lights_off = {"automobiles_turn.png", }, + _textures_turn_lights_on = { "automobiles_turn_on.png", }, + + _LONGIT_DRAG_FACTOR = 0.12*0.12, + _LATER_DRAG_FACTOR = 10.0, + _max_acc_factor = 5, + _max_speed = 14, + _min_later_speed = 3, + _consumption_divisor = 50000, + + get_staticdata = automobiles_lib.get_staticdata, + + on_deactivate = function(self) + automobiles_lib.save_inventory(self) + end, + + on_activate = automobiles_lib.on_activate, + + on_step = automobiles_lib.on_step, + + on_punch = automobiles_lib.on_punch, + on_rightclick = automobiles_lib.on_rightclick, +} + +minetest.register_entity("automobiles_catrelle:catrelle", catrelle.car_properties1) + +catrelle.car_properties2 = automobiles_lib.properties_copy(catrelle.car_properties1) +catrelle.car_properties2._vehicle_name = "Catrelle 4F" +catrelle.car_properties2.initial_properties = automobiles_lib.properties_copy(catrelle.car_properties1.initial_properties) +catrelle.car_properties2.initial_properties.textures = automobiles_lib.properties_copy(catrelle.car_properties1.initial_properties.textures) +catrelle.car_properties2.initial_properties.textures[9] = "automobiles_alpha.png" +catrelle.car_properties2.initial_properties.textures[10] = "automobiles_catrelle_lat_glass.png" +catrelle.car_properties2._seat_pos = {{x=-4.0,y=3,z=15},{x=4.0,y=3,z=15}, {x=-4.0,y=3,z=7},{x=4.0,y=3,z=7}} +catrelle.car_properties2._color = "#0063b0" +catrelle.car_properties2._trunk_slots = 16 +catrelle.car_properties2._extra_items_function = catrelle.extra_parts + +minetest.register_entity("automobiles_catrelle:catrelle_4f", catrelle.car_properties2) + diff --git a/mods/automobiles_pck/automobiles_catrelle/init.lua b/mods/automobiles_pck/automobiles_catrelle/init.lua new file mode 100755 index 0000000..de28c5a --- /dev/null +++ b/mods/automobiles_pck/automobiles_catrelle/init.lua @@ -0,0 +1,26 @@ +-- +-- constants +-- +catrelle={} +catrelle.gravity = automobiles_lib.gravity + +catrelle.S = nil + +if(minetest.get_translator ~= nil) then + catrelle.S = minetest.get_translator(minetest.get_current_modname()) + +else + catrelle.S = function ( s ) return s end + +end + +local S = catrelle.S + +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "custom_physics.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "control.lua") +dofile(minetest.get_modpath("automobiles_catrelle") .. DIR_DELIM .. "entities.lua") +dofile(minetest.get_modpath("automobiles_catrelle") .. DIR_DELIM .. "crafts.lua") + + diff --git a/mods/automobiles_pck/automobiles_catrelle/locale/automobile_catrelle.de.tr b/mods/automobiles_pck/automobiles_catrelle/locale/automobile_catrelle.de.tr new file mode 100644 index 0000000..ea20e95 --- /dev/null +++ b/mods/automobiles_pck/automobiles_catrelle/locale/automobile_catrelle.de.tr @@ -0,0 +1,5 @@ +# textdomain: automobiles_catrelle +### crafts.lua ### +Catrelle Body=Catrelle Karrosserie +Catrelle=Catrelle +Catrelle 4F=Catrelle 4F diff --git a/mods/automobiles_pck/automobiles_catrelle/locale/automobiles_catrelle.eo.tr b/mods/automobiles_pck/automobiles_catrelle/locale/automobiles_catrelle.eo.tr new file mode 100644 index 0000000..3475fe2 --- /dev/null +++ b/mods/automobiles_pck/automobiles_catrelle/locale/automobiles_catrelle.eo.tr @@ -0,0 +1,5 @@ +# textdomain: automobiles_catrelle +### crafts.lua ### +Catrelle Body=Korpo de Catrelle +Catrelle=Catrelle +Catrelle 4F= diff --git a/mods/automobiles_pck/automobiles_catrelle/locale/template.txt b/mods/automobiles_pck/automobiles_catrelle/locale/template.txt new file mode 100644 index 0000000..f534a3d --- /dev/null +++ b/mods/automobiles_pck/automobiles_catrelle/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: automobiles_catrelle +### crafts.lua ### +Catrelle Body= +Catrelle= +Catrelle 4F= diff --git a/mods/automobiles_pck/automobiles_catrelle/mod.conf b/mods/automobiles_pck/automobiles_catrelle/mod.conf new file mode 100755 index 0000000..19be576 --- /dev/null +++ b/mods/automobiles_pck/automobiles_catrelle/mod.conf @@ -0,0 +1,5 @@ +name=automobiles_catrelle +title=Catrelle +description=Une 4L pour mes amis français +author=apercy +depends=automobiles_lib diff --git a/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_body.b3d b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_body.b3d new file mode 100755 index 0000000..da3595e Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_body.b3d differ diff --git a/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_f_lights.b3d b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_f_lights.b3d new file mode 100755 index 0000000..c1d9f1c Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_f_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_pos_lights.b3d b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_pos_lights.b3d new file mode 100755 index 0000000..da8d375 Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_pos_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_seat.b3d b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_seat.b3d new file mode 100755 index 0000000..113ffc2 Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_seat.b3d differ diff --git a/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_turn_l_light.b3d b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_turn_l_light.b3d new file mode 100755 index 0000000..24b7cc0 Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_turn_l_light.b3d differ diff --git a/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_turn_r_light.b3d b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_turn_r_light.b3d new file mode 100755 index 0000000..02d35fb Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_turn_r_light.b3d differ diff --git a/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_wheel.b3d b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_wheel.b3d new file mode 100755 index 0000000..646ae47 Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/models/automobiles_catrelle_wheel.b3d differ diff --git a/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle.png b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle.png new file mode 100755 index 0000000..38b5644 Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle.png differ diff --git a/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_bars.png b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_bars.png new file mode 100755 index 0000000..715d8a5 Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_bars.png differ diff --git a/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_body.png b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_body.png new file mode 100755 index 0000000..a146a07 Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_body.png differ diff --git a/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_fuel.png b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_fuel.png new file mode 100755 index 0000000..089e6c4 Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_fuel.png differ diff --git a/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_glass.png b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_glass.png new file mode 100755 index 0000000..551d2aa Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_glass.png differ diff --git a/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_lat_glass.png b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_lat_glass.png new file mode 100755 index 0000000..eb75768 Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_lat_glass.png differ diff --git a/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_lights.png b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_lights.png new file mode 100755 index 0000000..6c7d532 Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_lights.png differ diff --git a/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_wheel.png b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_wheel.png new file mode 100644 index 0000000..d608df6 Binary files /dev/null and b/mods/automobiles_pck/automobiles_catrelle/textures/automobiles_catrelle_wheel.png differ diff --git a/mods/automobiles_pck/automobiles_coupe/README.md b/mods/automobiles_pck/automobiles_coupe/README.md new file mode 100755 index 0000000..2e9214a --- /dev/null +++ b/mods/automobiles_pck/automobiles_coupe/README.md @@ -0,0 +1,10 @@ +## Coupe + +This mod adds a coupe automobile to Minetest. + +## Licenses +- Code: see [LICENSE](/LICENSE) +- Media: Model adapted from car assets v1 made by https://www.racoon-media.nl; licence CC0 + +## Screenshot +![coupe](/automobiles_coupe/screenshot.jpg) diff --git a/mods/automobiles_pck/automobiles_coupe/coupe_crafts.lua b/mods/automobiles_pck/automobiles_coupe/coupe_crafts.lua new file mode 100755 index 0000000..7938142 --- /dev/null +++ b/mods/automobiles_pck/automobiles_coupe/coupe_crafts.lua @@ -0,0 +1,69 @@ +local S = coupe.S + +-- +-- items +-- + +-- body +minetest.register_craftitem("automobiles_coupe:coupe_body",{ + description = S("Coupe Body"), + inventory_image = "automobiles_coupe_body.png", +}) + +-- coupe +minetest.register_tool("automobiles_coupe:coupe", { + description = S("Coupe"), + inventory_image = "automobiles_coupe.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_coupe:coupe", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 50 --reset hp + --minetest.chat_send_all("owner: " .. ent.owner) + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, S("Coupe")) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) + +-- +-- crafting +-- +if minetest.get_modpath("default") then + minetest.register_craft({ + output = "automobiles_coupe:coupe", + recipe = { + {"automobiles_lib:wheel", "automobiles_lib:engine", "automobiles_lib:wheel"}, + {"automobiles_lib:wheel","automobiles_coupe:coupe_body", "automobiles_lib:wheel"}, + } + }) + minetest.register_craft({ + output = "automobiles_coupe:coupe_body", + recipe = { + {"default:glass" ,"default:glass","default:steel_ingot"}, + {"default:steel_ingot","","default:steel_ingot"}, + {"default:steelblock","default:steelblock", "default:steelblock"}, + } + }) +end diff --git a/mods/automobiles_pck/automobiles_coupe/coupe_entities.lua b/mods/automobiles_pck/automobiles_coupe/coupe_entities.lua new file mode 100755 index 0000000..f65c4e1 --- /dev/null +++ b/mods/automobiles_pck/automobiles_coupe/coupe_entities.lua @@ -0,0 +1,307 @@ +-- +-- entity +-- +local old_entities = {"automobiles_coupe:time_machine_kit", "automobiles_coupe:wheel","automobiles_coupe:normal_kit"} +for _,entity_name in ipairs(old_entities) do + minetest.register_entity(":"..entity_name, { + on_activate = function(self, staticdata) + self.object:remove() + end, + }) +end + + +minetest.register_entity('automobiles_coupe:front_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "sprite", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + +minetest.register_entity('automobiles_coupe:rear_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + pointable=false, + visual = "sprite", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_coupe:f_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_coupe_f_lights.b3d", + textures = {"automobiles_grey.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_coupe:r_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_coupe_rear_pos_lights.b3d", + textures = {"automobiles_rear_lights_off.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_coupe:reverse_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_coupe_reverse_lights.b3d", + textures = {"automobiles_grey.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_coupe:turn_left_light',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_coupe_turn_l_light.b3d", + textures = {"automobiles_turn.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_coupe:turn_right_light',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_coupe_turn_r_light.b3d", + textures = {"automobiles_turn.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_coupe:steering',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_coupe_drive_wheel.b3d", + textures = {"automobiles_black.png", "automobiles_black.png", "automobiles_black.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity("automobiles_coupe:coupe", { + initial_properties = { + physical = true, + collide_with_objects = true, + collisionbox = {-0.1, -0.2, -0.1, 0.1, 1, 0.1}, + selectionbox = {-1.5, 0.0, -1.5, 1.5, 2, 1.5}, + stepheight = 0.65 + automobiles_lib.extra_stepheight, + visual = "mesh", + mesh = "automobiles_coupe_body.b3d", + textures = { + "automobiles_black.png", --bancos + "automobiles_painting.png", --carroceria + "automobiles_black.png", --paralamas + "automobiles_black.png", --saia + "automobiles_black.png", --banco + "automobiles_coupe_glasses.png", --vidros + "automobiles_black.png", --aletas vidro traseiro + "automobiles_grey.png", --interior + "automobiles_black.png", --panel + "automobiles_coupe_fuel.png", + }, + }, + textures = {}, + driver_name = nil, + sound_handle = nil, + owner = "", + static_save = true, + infotext = "A very nice coupe!", + hp = 50, + buoyancy = 2, + physics = automobiles_lib.physics, + lastvelocity = vector.new(), + time_total = 0, + _passenger = nil, + _color = "#6d6d6d", + _steering_angle = 0, + _engine_running = false, + _last_checkpoint = "", + _total_laps = -1, + _race_id = "", + _energy = 1, + _last_time_collision_snd = 0, + _last_time_drift_snd = 0, + _last_time_command = 0, + _roll = math.rad(0), + _pitch = 0, + _longit_speed = 0, + _show_rag = true, + _show_lights = false, + _light_old_pos = nil, + _last_ground_check = 0, + _last_light_move = 0, + _last_engine_sound_update = 0, + _turn_light_timer = 0, + _inv = nil, + _inv_id = "", + _change_color = automobiles_lib.paint, + _intensity = 4, + _trunk_slots = 8, + _engine_sound = "coupe_engine", + _max_fuel = 10, + + _vehicle_name = "Coupe", + _drive_wheel_pos = {x=-4.26,y=6.01,z=14.18}, + _drive_wheel_angle = 15, + _steering_ent = 'automobiles_coupe:steering', + _seat_pos = {{x=-4.25,y=0.48,z=9.5},{x=4.25,y=0.48,z=9.5}}, + + _front_suspension_ent = 'automobiles_coupe:front_suspension', + _front_suspension_pos = {x=0,y=1.5,z=24.5}, + _front_wheel_ent = 'automobiles_lib:wheel', + _front_wheel_xpos = 9.5, + _front_wheel_frames = {x = 1, y = 49}, + _rear_suspension_ent = 'automobiles_coupe:rear_suspension', + _rear_suspension_pos = {x=0,y=1.5,z=0}, + _rear_wheel_ent = 'automobiles_lib:wheel', + _rear_wheel_xpos = 9.5, + _rear_wheel_frames = {x = 1, y = 49}, + + _fuel_gauge_pos = {x=0,y=6.2,z=15.8}, + _front_lights = 'automobiles_coupe:f_lights', + _rear_lights = 'automobiles_coupe:r_lights', + _reverse_lights = 'automobiles_coupe:reverse_lights', + _turn_left_lights = 'automobiles_coupe:turn_left_light', + _turn_right_lights = 'automobiles_coupe:turn_right_light', + _textures_turn_lights_off = {"automobiles_turn.png", }, + _textures_turn_lights_on = { "automobiles_turn_on.png", }, + + _LONGIT_DRAG_FACTOR = 0.12*0.12, + _LATER_DRAG_FACTOR = 18.0, + _max_acc_factor = 8, + _max_speed = 22, + _min_later_speed = 2, + _consumption_divisor = 50000, + + get_staticdata = automobiles_lib.get_staticdata, + + on_deactivate = function(self) + automobiles_lib.save_inventory(self) + end, + + on_activate = automobiles_lib.on_activate, + + on_step = automobiles_lib.on_step, + + on_punch = automobiles_lib.on_punch, + on_rightclick = automobiles_lib.on_rightclick, +}) + + diff --git a/mods/automobiles_pck/automobiles_coupe/init.lua b/mods/automobiles_pck/automobiles_coupe/init.lua new file mode 100755 index 0000000..b8df851 --- /dev/null +++ b/mods/automobiles_pck/automobiles_coupe/init.lua @@ -0,0 +1,26 @@ +-- +-- constants +-- +coupe={} +coupe.gravity = automobiles_lib.gravity + +coupe.S = nil + +if(minetest.get_translator ~= nil) then + coupe.S = minetest.get_translator(minetest.get_current_modname()) + +else + coupe.S = function ( s ) return s end + +end + +local S = coupe.S + +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "custom_physics.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "control.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") +dofile(minetest.get_modpath("automobiles_coupe") .. DIR_DELIM .. "coupe_entities.lua") +dofile(minetest.get_modpath("automobiles_coupe") .. DIR_DELIM .. "coupe_crafts.lua") + + diff --git a/mods/automobiles_pck/automobiles_coupe/locale/automobiles_coupe.de.tr b/mods/automobiles_pck/automobiles_coupe/locale/automobiles_coupe.de.tr new file mode 100755 index 0000000..2850f8b --- /dev/null +++ b/mods/automobiles_pck/automobiles_coupe/locale/automobiles_coupe.de.tr @@ -0,0 +1,4 @@ +# textdomain: automobiles_coupe +### coupe_crafts.lua ### +Coupe Body=Coupe Karrosserie +Coupe=Coupe diff --git a/mods/automobiles_pck/automobiles_coupe/locale/automobiles_coupe.eo.tr b/mods/automobiles_pck/automobiles_coupe/locale/automobiles_coupe.eo.tr new file mode 100755 index 0000000..c765c20 --- /dev/null +++ b/mods/automobiles_pck/automobiles_coupe/locale/automobiles_coupe.eo.tr @@ -0,0 +1,4 @@ +# textdomain: automobiles_coupe +### coupe_crafts.lua ### +Coupe Body=Korpo de Coupe +Coupe=Coupe diff --git a/mods/automobiles_pck/automobiles_coupe/locale/template.txt b/mods/automobiles_pck/automobiles_coupe/locale/template.txt new file mode 100755 index 0000000..9f1208b --- /dev/null +++ b/mods/automobiles_pck/automobiles_coupe/locale/template.txt @@ -0,0 +1,4 @@ +# textdomain: automobiles_coupe +### coupe_crafts.lua ### +Coupe Body= +Coupe= diff --git a/mods/automobiles_pck/automobiles_coupe/mod.conf b/mods/automobiles_pck/automobiles_coupe/mod.conf new file mode 100755 index 0000000..c196af2 --- /dev/null +++ b/mods/automobiles_pck/automobiles_coupe/mod.conf @@ -0,0 +1,5 @@ +name=automobiles_coupe +title=Coupe +description=A coupe +author=apercy +depends=automobiles_lib diff --git a/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_body.b3d b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_body.b3d new file mode 100755 index 0000000..4ce30fd Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_body.b3d differ diff --git a/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_drive_wheel.b3d b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_drive_wheel.b3d new file mode 100755 index 0000000..eeb9858 Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_drive_wheel.b3d differ diff --git a/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_f_lights.b3d b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_f_lights.b3d new file mode 100755 index 0000000..a294779 Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_f_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_panel.b3d b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_panel.b3d new file mode 100755 index 0000000..e8a017f Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_panel.b3d differ diff --git a/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_rear_pos_lights.b3d b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_rear_pos_lights.b3d new file mode 100755 index 0000000..d9ceb09 Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_rear_pos_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_reverse_lights.b3d b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_reverse_lights.b3d new file mode 100755 index 0000000..e8a410f Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_reverse_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_turn_l_light.b3d b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_turn_l_light.b3d new file mode 100755 index 0000000..0be5b9e Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_turn_l_light.b3d differ diff --git a/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_turn_r_light.b3d b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_turn_r_light.b3d new file mode 100755 index 0000000..1f7dbaf Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/models/automobiles_coupe_turn_r_light.b3d differ diff --git a/mods/automobiles_pck/automobiles_coupe/screenshot.jpg b/mods/automobiles_pck/automobiles_coupe/screenshot.jpg new file mode 100755 index 0000000..ecc509a Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/screenshot.jpg differ diff --git a/mods/automobiles_pck/automobiles_coupe/sounds/coupe_engine.ogg b/mods/automobiles_pck/automobiles_coupe/sounds/coupe_engine.ogg new file mode 100644 index 0000000..ba166be Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/sounds/coupe_engine.ogg differ diff --git a/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe.png b/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe.png new file mode 100755 index 0000000..ea4916c Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe.png differ diff --git a/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe_body.png b/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe_body.png new file mode 100755 index 0000000..cb1de60 Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe_body.png differ diff --git a/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe_fuel.png b/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe_fuel.png new file mode 100755 index 0000000..089e6c4 Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe_fuel.png differ diff --git a/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe_glasses.png b/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe_glasses.png new file mode 100755 index 0000000..eb2e88d Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe_glasses.png differ diff --git a/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe_lights.png b/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe_lights.png new file mode 100755 index 0000000..6c7d532 Binary files /dev/null and b/mods/automobiles_pck/automobiles_coupe/textures/automobiles_coupe_lights.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/README.md b/mods/automobiles_pck/automobiles_delorean/README.md new file mode 100755 index 0000000..39f786e --- /dev/null +++ b/mods/automobiles_pck/automobiles_delorean/README.md @@ -0,0 +1,10 @@ +## Delorean + +This mod adds a delorean automobile to Minetest. + +## Licenses +- Code: see [LICENSE](/LICENSE) +- Media: Model made by myself, licence CC0 + +## Screenshot +![delorean](/automobiles_delorean/screenshot.jpg) diff --git a/mods/automobiles_pck/automobiles_delorean/control.lua b/mods/automobiles_pck/automobiles_delorean/control.lua new file mode 100755 index 0000000..1ae2b68 --- /dev/null +++ b/mods/automobiles_pck/automobiles_delorean/control.lua @@ -0,0 +1,102 @@ +--global constants + +function delorean.control(self, dtime, hull_direction, longit_speed, longit_drag, later_drag, accel, max_acc_factor, max_speed, steering_limit, steering_speed) + self._last_time_command = self._last_time_command + dtime + if self._last_time_command > 1 then self._last_time_command = 1 end + + local player = minetest.get_player_by_name(self.driver_name) + local retval_accel = accel; + local stop = false + + -- player control + if player then + local ctrl = player:get_player_control() + + local acc = 0 + if self._energy > 0 then + if longit_speed < max_speed and ctrl.up then + --get acceleration factor + acc = automobiles_lib.check_road_is_ok(self.object, max_acc_factor) + --minetest.chat_send_all('engineacc: '.. engineacc) + if acc > 1 and acc < max_acc_factor and longit_speed > 0 then + --improper road will reduce speed + acc = -1 + end + end + + --reversing + if not self._is_flying or self._is_flying == 0 then + if ctrl.sneak and longit_speed <= 1.0 and longit_speed > -1.0 then + acc = -2 + end + end + end + + --break + if ctrl.down then + --[[if math.abs(longit_speed) > 0 then + acc = -5 / (longit_speed / 2) -- lets set a brake efficience based on speed + end]]-- + + --total stop + --wheel break + if not self._is_flying or self._is_flying == 0 then + if longit_speed > 0 then + acc = -5 + --[[if (longit_speed + acc) < 0 then + acc = longit_speed * -1 + end]]-- + end + + if longit_speed < 0 then + acc = 5 + if (longit_speed + acc) > 0 then + acc = longit_speed * -1 + end + end + if math.abs(longit_speed) < 0.2 then + stop = true + end + else + acc = -5 + end + end + + if acc then retval_accel=vector.add(accel,vector.multiply(hull_direction,acc)) end + + -- yaw + local yaw_cmd = 0 + if self._yaw_by_mouse == true then + local rot_y = math.deg(player:get_look_horizontal()) + self._steering_angle = automobiles_lib.set_yaw_by_mouse(self, rot_y, steering_limit) + else + -- steering + if ctrl.right then + self._steering_angle = math.max(self._steering_angle-steering_speed*dtime,-steering_limit) + elseif ctrl.left then + self._steering_angle = math.min(self._steering_angle+steering_speed*dtime,steering_limit) + else + --center steering + if longit_speed > 0 then + local factor = 1 + if self._steering_angle > 0 then factor = -1 end + local correction = (steering_limit*(longit_speed/75)) * factor + local before_correction = self._steering_angle + self._steering_angle = self._steering_angle + correction + if math.sign(before_correction) ~= math.sign(self._steering_angle) then self._steering_angle = 0 end + end + end + end + + local angle_factor = self._steering_angle / 60 + if angle_factor < 0 then angle_factor = angle_factor * -1 end + local deacc_on_curve = longit_speed * angle_factor + deacc_on_curve = deacc_on_curve * -1 + if deacc_on_curve then retval_accel=vector.add(retval_accel,vector.multiply(hull_direction,deacc_on_curve)) end + + end + + return retval_accel, stop +end + + diff --git a/mods/automobiles_pck/automobiles_delorean/crafts.lua b/mods/automobiles_pck/automobiles_delorean/crafts.lua new file mode 100644 index 0000000..a39642c --- /dev/null +++ b/mods/automobiles_pck/automobiles_delorean/crafts.lua @@ -0,0 +1,109 @@ +local S = delorean.S + +-- +-- items +-- + +-- body +minetest.register_craftitem("automobiles_delorean:delorean_body",{ + description = S("Delorean Body"), + inventory_image = "automobiles_delorean_body.png", +}) + +-- delorean +minetest.register_tool("automobiles_delorean:delorean", { + description = S("Delorean"), + inventory_image = "automobiles_delorean.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_delorean:delorean", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 50 --reset hp + ent._car_type = ent._car_type or 0 + --minetest.chat_send_all("owner: " .. ent.owner) + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, S("Delorean")) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) + +-- delorean +minetest.register_tool("automobiles_delorean:time_machine", { + description = S("Time Machine"), + inventory_image = "automobiles_delorean.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_delorean:delorean", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 50 --reset hp + ent._car_type = ent._car_type or 1 + --minetest.chat_send_all("delorean: " .. ent._car_type) + --minetest.chat_send_all("owner: " .. ent.owner) + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, "Delorean") + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) + +-- +-- crafting +-- +if minetest.get_modpath("default") then + minetest.register_craft({ + output = "automobiles_delorean:delorean", + recipe = { + {"automobiles_lib:wheel", "automobiles_lib:engine", "automobiles_lib:wheel"}, + {"automobiles_lib:wheel","automobiles_delorean:delorean_body", "automobiles_lib:wheel"}, + } + }) + minetest.register_craft({ + output = "automobiles_delorean:delorean_body", + recipe = { + {"default:glass" ,"default:glass","default:steelblock"}, + {"default:steelblock","","default:steelblock"}, + {"default:steelblock","default:steelblock", "default:steelblock"}, + } + }) +end diff --git a/mods/automobiles_pck/automobiles_delorean/entities.lua b/mods/automobiles_pck/automobiles_delorean/entities.lua new file mode 100755 index 0000000..02ad704 --- /dev/null +++ b/mods/automobiles_pck/automobiles_delorean/entities.lua @@ -0,0 +1,460 @@ +local S = delorean.S + +function delorean.set_kit(self) + local normal_kit = nil + if self.normal_kit then self.normal_kit:remove() end + local pos = self.object:get_pos() + if self._car_type == 0 or self._car_type == nil then + normal_kit = minetest.add_entity(pos,'automobiles_delorean:normal_kit') + normal_kit:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.normal_kit = normal_kit + self.normal_kit:set_properties({is_visible=true}) + elseif self._car_type == 1 then + --time machine + normal_kit = minetest.add_entity(pos,'automobiles_delorean:time_machine_kit') + normal_kit:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.normal_kit = normal_kit + self.normal_kit:set_properties({is_visible=true}) + + local instruments = minetest.add_entity(pos,'automobiles_delorean:time_machine_kit_instruments') + instruments:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.instruments = instruments + self.instruments:set_properties({is_visible=true}) + end +end + +-- +-- entity +-- + +minetest.register_entity('automobiles_delorean:wheel',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_delorean_wheel.b3d", + backface_culling = false, + textures = {"automobiles_black.png", "automobiles_metal.png", "automobiles_delorean_wheel.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_delorean:normal_kit',{ +initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "mesh", + mesh = "automobiles_delorean_normal_kit.b3d", + textures = {"automobiles_black.png","automobiles_delorean_glasses.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + +minetest.register_entity('automobiles_delorean:time_machine_kit',{ +initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "mesh", + mesh = "automobiles_delorean_time_machine_accessories.b3d", + textures = { + "automobiles_metal.png", --ok + "automobiles_black.png", --ok + "automobiles_dark_grey.png", --exausts + "automobiles_black.png", --exausts + "automobiles_metal.png", --energy base collector + "automobiles_painting.png^[multiply:#0063b0", --capacitors + "automobiles_black.png", --arc + "automobiles_painting.png^[multiply:#07B6BC", --capacitors + "automobiles_black.png", --base mr fusion + "automobiles_painting.png", --mr fusion + "automobiles_metal.png", --ok + "automobiles_painting.png", --ok + "automobiles_black.png", --ok + "automobiles_metal.png", --lateral tubes + "automobiles_black.png", --conductors + "automobiles_black.png", --ok + "automobiles_delorean_brass.png", --ok + "automobiles_metal.png", --base circuit switch + "automobiles_red.png", --red button + "automobiles_dark_grey.png", --ok + "automobiles_delorean_brass.png", --ok + "automobiles_black.png", --electric switch + "automobiles_dark_grey.png", --base + "automobiles_metal.png", --f bump + "automobiles_dark_grey.png", --f bump + "automobiles_metal.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + +minetest.register_entity('automobiles_delorean:time_machine_kit_instruments',{ + initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "mesh", + mesh = "automobiles_delorean_time_machine_instruments.b3d", + textures = { + "automobiles_metal.png", --time panel + "automobiles_delorean_time.png", --time panel + "automobiles_metal.png", -- flux capacitor + "automobiles_delorean_flux.png", --flux capacitor + "automobiles_black.png", --flux capacitor + "automobiles_dark_grey.png", --roof panel + "automobiles_delorean_roof_1.png", --root panel + "automobiles_delorean_roof_2.png", --roof panel + }, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + + +minetest.register_entity('automobiles_delorean:front_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "sprite", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + +minetest.register_entity('automobiles_delorean:rear_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + pointable=false, + visual = "sprite", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_delorean:f_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_delorean_f_lights.b3d", + textures = {"automobiles_grey.png", "automobiles_black.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_delorean:r_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_delorean_rear_pos_lights.b3d", + textures = {"automobiles_rear_lights_off.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_delorean:reverse_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_delorean_reverse_lights.b3d", + textures = {"automobiles_grey.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_delorean:turn_left_light',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_delorean_turn_l_light.b3d", + textures = {"automobiles_turn.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_delorean:turn_right_light',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_delorean_turn_r_light.b3d", + textures = {"automobiles_turn.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity("automobiles_delorean:delorean", { + initial_properties = { + physical = true, + collide_with_objects = true, + collisionbox = {-0.1, -0.2, -0.1, 0.1, 1, 0.1}, + selectionbox = {-1.5, 0.0, -1.5, 1.5, 2, 1.5}, + stepheight = 0.65 + automobiles_lib.extra_stepheight, + visual = "mesh", + mesh = "automobiles_delorean_body.b3d", + textures = { + "automobiles_dark_grey.png", --bancos + "automobiles_painting.png", --pintura portas + "automobiles_black.png", --retrovisores + "automobiles_dark_grey.png", --forro da porta + "automobiles_delorean_glasses.png", --vidros das portas + "automobiles_metal.png", --espelhos + "automobiles_black.png", --volante + "automobiles_painting2.png", --face + "automobiles_black.png", --moldura parabrisa + "automobiles_delorean_glasses.png", --parabrisa + "automobiles_black.png", --grade_motor + "automobiles_dark_grey.png", --revestimento interno + "automobiles_delorean_fuel.png", --combustivel + "automobiles_painting.png", --pintura + "automobiles_black.png", --frisos + "automobiles_black.png", --paralamas + "automobiles_black.png", --assoalho + "automobiles_painting2.png", --traseira + "automobiles_black.png", --traseira placa + "automobiles_black.png", --ventilação vidro traseiro + }, + }, + textures = {}, + driver_name = nil, + sound_handle = nil, + owner = "", + static_save = true, + infotext = S("A very nice delorean!"), + hp = 50, + buoyancy = 2, + physics = automobiles_lib.physics, + lastvelocity = vector.new(), + time_total = 0, + _passenger = nil, + _color = "#9f9f9f", + _steering_angle = 0, + _engine_running = false, + _last_checkpoint = "", + _total_laps = -1, + _race_id = "", + _energy = 1, + _last_time_collision_snd = 0, + _last_time_drift_snd = 0, + _last_time_command = 0, + _roll = math.rad(0), + _pitch = 0, + _longit_speed = 0, + _show_rag = true, + _show_lights = false, + _light_old_pos = nil, + _last_ground_check = 0, + _last_light_move = 0, + _last_engine_sound_update = 0, + _turn_light_timer = 0, + _inv = nil, + _inv_id = "", + _change_color = automobiles_lib.paint, + _intensity = 4, + _car_type = nil, + _car_gravity = -automobiles_lib.gravity, + _is_flying = 0, + _trunk_slots = 8, + _engine_sound = "delorean_engine", + _max_fuel = 10, + _formspec_function = delorean.driver_formspec, + + _vehicle_name = S("Delorean"), + _drive_wheel_pos = {x=-4.66, y=6.31, z=15.69}, + _drive_wheel_angle = 15, + _seat_pos = {{x=-4.65,y=0.48,z=9.5},{x=4.65,y=0.48,z=9.5}}, + + _front_suspension_ent = 'automobiles_delorean:front_suspension', + _front_suspension_pos = {x=0,y=1.5,z=27.7057}, + _front_wheel_ent = 'automobiles_delorean:wheel', + _front_wheel_xpos = 9.5, + _front_wheel_frames = {x = 1, y = 49}, + _rear_suspension_ent = 'automobiles_delorean:rear_suspension', + _rear_suspension_pos = {x=0,y=1.5,z=0}, + _rear_wheel_ent = 'automobiles_delorean:wheel', + _rear_wheel_xpos = 9.5, + _rear_wheel_frames = {x = 1, y = 49}, + + _fuel_gauge_pos = {x=-4.66,y=6.2,z=17.9}, + _front_lights = 'automobiles_delorean:f_lights', + _rear_lights = 'automobiles_delorean:r_lights', + _reverse_lights = 'automobiles_delorean:reverse_lights', + _turn_left_lights = 'automobiles_delorean:turn_left_light', + _turn_right_lights = 'automobiles_delorean:turn_right_light', + _textures_turn_lights_off = {"automobiles_turn.png", }, + _textures_turn_lights_on = { "automobiles_turn_on.png", }, + _extra_items_function = delorean.set_kit, --uses _car_type do change "skin" + + _setmode = delorean.set_mode, + _control_function = delorean.control, + + _LONGIT_DRAG_FACTOR = 0.12*0.12, + _LATER_DRAG_FACTOR = 8.0, + _max_acc_factor = 8.0, + _max_speed = 30, + _min_later_speed = 4.5, + _consumption_divisor = 40000, + + _wheel_compensation = 0.8, + + get_staticdata = automobiles_lib.get_staticdata, + + on_deactivate = function(self) + automobiles_lib.save_inventory(self) + end, + + on_activate = automobiles_lib.on_activate, + + on_step = automobiles_lib.on_step, + + on_punch = automobiles_lib.on_punch, + on_rightclick = automobiles_lib.on_rightclick, +}) + + diff --git a/mods/automobiles_pck/automobiles_delorean/flight.lua b/mods/automobiles_pck/automobiles_delorean/flight.lua new file mode 100644 index 0000000..5e2c7bc --- /dev/null +++ b/mods/automobiles_pck/automobiles_delorean/flight.lua @@ -0,0 +1,147 @@ +function delorean.gravity_auto_correction(self, dtime) + local factor = 1 + --minetest.chat_send_player(self.driver_name, "antes: " .. self._car_gravity) + if self._car_gravity > 0 then factor = -1 end + local time_correction = (dtime/automobiles_lib.ideal_step) + local intensity = 1 + local correction = (intensity*factor) * time_correction + if math.abs(correction) > 1 then correction = 1 * math.sign(correction) end + --minetest.chat_send_player(self.driver_name, correction) + local before_correction = self._car_gravity + local new_car_gravity = self._car_gravity + correction + if math.sign(before_correction) ~= math.sign(new_car_gravity) then + self._car_gravity = 0 + else + self._car_gravity = new_car_gravity + end + + --now desacelerate + if self._car_gravity == 0 then + local curr_vel = self.object:get_velocity() + if curr_vel.y < 0 then + self._car_gravity = 0.5 + else + self._car_gravity = -0.5 + end + end + + --minetest.chat_send_player(self.driver_name, "depois: " .. self._car_gravity) +end + +function delorean.control_flight(self, player) + if self._is_flying == 1 then + local ctrl = player:get_player_control() + local max = 6 + local min = -6 + local curr_vel = self.object:get_velocity() + if ctrl.jump then + if self._car_gravity < max and curr_vel.y < 2.5 then + self._car_gravity = self._car_gravity + 1 + end + elseif ctrl.sneak then + if self._car_gravity > min and curr_vel.y > -2.5 then + self._car_gravity = self._car_gravity - 1 + end + end + end +end + +function delorean.set_wheels_mode(self, angle_factor) + if not self._is_flying or self._is_flying == 0 then + --whell turn + --[[self.lf_wheel:set_attach(self.front_suspension,'',{x=-self._front_wheel_xpos,y=0,z=0},{x=0,y=-self._steering_angle-angle_factor,z=0}) + self.rf_wheel:set_attach(self.front_suspension,'',{x=self._front_wheel_xpos,y=0,z=0},{x=0,y=(-self._steering_angle+angle_factor)+180,z=0}) + self.lr_wheel:set_attach(self.rear_suspension,'',{x=-self._rear_wheel_xpos,y=0,z=0},{x=0,y=0,z=0}) + self.rr_wheel:set_attach(self.rear_suspension,'',{x=self._rear_wheel_xpos,y=0,z=0},{x=0,y=180,z=0})]]-- + else + local extra_space = 0.5 + self.lf_wheel:set_attach(self.front_suspension,'',{x=-self._front_wheel_xpos-extra_space,y=0,z=0},{x=0,y=0,z=90}) + self.rf_wheel:set_attach(self.front_suspension,'',{x=self._front_wheel_xpos+extra_space,y=0,z=0},{x=0,y=180,z=-90}) + self.lr_wheel:set_attach(self.rear_suspension,'',{x=-self._rear_wheel_xpos-extra_space,y=0,z=0},{x=0,y=0,z=90}) + self.rr_wheel:set_attach(self.rear_suspension,'',{x=self._rear_wheel_xpos+extra_space,y=0,z=0},{x=0,y=180,z=-90}) + end +end + +function delorean.turn_flight_mode(self) + if self._is_flying == 1 then + --initial lift + self._car_gravity = 10 + local curr_pos = self.object:get_pos() + curr_pos.y = curr_pos.y + 1.5 + self.object:move_to(curr_pos) + self._start_flight_semaphore = 1 --semaphore to avoid the grouund detection on first loop + end +end + +function delorean.set_mode(self, is_attached, curr_pos, velocity, player, dtime) + if self._car_type == 1 then + local ent_properties = self.normal_kit:get_properties() + if ent_properties then + if ent_properties.mesh ~= "automobiles_delorean_time_machine_accessories.b3d" then + delorean.set_kit(self) + end + end + + if is_attached == true then + self.instruments:set_properties( + { + textures={ + "automobiles_metal.png", --time panel + "automobiles_delorean_time.png", --time panel + "automobiles_metal.png", -- flux capacitor + "automobiles_delorean_flux.png", --flux capacitor + "automobiles_black.png", --flux capacitor + "automobiles_dark_grey.png", --roof panel + "automobiles_delorean_roof_1.png", --root panel + "automobiles_delorean_roof_2.png", --roof panel + }, glow=15} + ) + else + self.instruments:set_properties( + { + textures={ + "automobiles_metal.png", --time panel + "automobiles_delorean_time_off.png", --time panel + "automobiles_metal.png", -- flux capacitor + "automobiles_delorean_flux_off.png", --flux capacitor + "automobiles_black.png", --flux capacitor + "automobiles_dark_grey.png", --roof panel + "automobiles_delorean_roof_1_off.png", --root panel + "automobiles_delorean_roof_2_off.png", --roof panel + }, glow=0} + ) + end + + --start flight functions + if self._is_flying == 1 then + if is_attached then + delorean.control_flight(self, player) + end + delorean.gravity_auto_correction(self, dtime) + + --check if is near the ground, so revert the flight mode + local noded = automobiles_lib.nodeatpos(automobiles_lib.pos_shift(curr_pos,{y=-0.6})) + if (noded and noded.drawtype ~= 'airlike') then + if noded.drawtype ~= 'liquid' then + if not self._start_flight_semaphore then --check if the flight started now + self._is_flying = 0 + else + self._start_flight_semaphore = nil --set the deactivation to work normally now + end + end + --avoid liquids + if noded.drawtype == 'liquid' then + self._car_gravity = 5 + local fixed_vel = velocity + fixed_vel.y = 0.1 + self.lastvelocity.y = fixed_vel.y --do not compute collision after + self.object:set_velocity(fixed_vel) + --curr_pos.y = curr_pos.y + 0.5 + --self.object:move_to(curr_pos) + end + end + end + delorean.set_wheels_mode(self, 0) + end +end + diff --git a/mods/automobiles_pck/automobiles_delorean/forms.lua b/mods/automobiles_pck/automobiles_delorean/forms.lua new file mode 100644 index 0000000..ba7dbcc --- /dev/null +++ b/mods/automobiles_pck/automobiles_delorean/forms.lua @@ -0,0 +1,94 @@ +local S = delorean.S +-------------- +-- Manual -- +-------------- + +function delorean.getCarFromPlayer(player) + local seat = player:get_attach() + if seat then + local car = seat:get_attach() + return car + end + return nil +end + +function delorean.driver_formspec(name) + local player = minetest.get_player_by_name(name) + local vehicle_obj = delorean.getCarFromPlayer(player) + if vehicle_obj == nil then + return + end + local ent = vehicle_obj:get_luaentity() + + local yaw = "false" + local one_hand = "false" + if ent._yaw_by_mouse then yaw = "true" end + if ent._one_hand then one_hand = "true" end + + local flight = "false" + if ent._is_flying == 1 then flight = "true" end + + local basic_form = table.concat({ + "formspec_version[3]", + "size[6,7]", + }, "") + + basic_form = basic_form.."button[1,1.0;4,1;go_out;" .. S("Go Offboard") .. "]" + basic_form = basic_form.."button[1,2.5;4,1;lights;" .. S("Lights") .. "]" + if ent._car_type == 1 then basic_form = basic_form.."checkbox[1,4.0;flight;" .. S("Flight Mode") .. ";"..flight.."]" end + basic_form = basic_form.."checkbox[1,5.5;yaw;" .. S("Direction by mouse") .. ";"..yaw.."]" + --if ent._car_type ~= 1 then basic_form = basic_form.."checkbox[1,6.2;one_hand;" .. S("One Hand Driving\n(open menu using AUX)") .. ";"..one_hand.."]" end + + minetest.show_formspec(name, "delorean:driver_main", basic_form) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "delorean:driver_main" then + local name = player:get_player_name() + local car_obj = delorean.getCarFromPlayer(player) + if car_obj then + local ent = car_obj:get_luaentity() + if ent then + if fields.go_out then + if ent._passenger then --any pax? + local pax_obj = minetest.get_player_by_name(ent._passenger) + automobiles_lib.dettach_pax(ent, pax_obj) + end + ent._is_flying = 0 + automobiles_lib.dettach_driver(ent, player) + end + if fields.lights then + if ent._show_lights == true then + ent._show_lights = false + else + ent._show_lights = true + end + end + if fields.yaw then + if ent._yaw_by_mouse == true then + ent._yaw_by_mouse = false + else + ent._yaw_by_mouse = true + end + end + if fields.flight then + if ent._is_flying == 1 then + ent._is_flying = 0 + else + ent._is_flying = 1 + end + delorean.turn_flight_mode(ent) + end + if fields.one_hand then + if ent._one_hand == true then + ent._one_hand = false + else + ent._one_hand = true + core.chat_send_player(name,core.colorize('#00ff00', S(" >>> Use AUX or key \"E\" to open the menu"))) + end + end + end + end + minetest.close_formspec(name, "delorean:driver_main") + end +end) diff --git a/mods/automobiles_pck/automobiles_delorean/init.lua b/mods/automobiles_pck/automobiles_delorean/init.lua new file mode 100755 index 0000000..08e0db8 --- /dev/null +++ b/mods/automobiles_pck/automobiles_delorean/init.lua @@ -0,0 +1,29 @@ +-- +-- constants +-- +delorean={} +delorean.gravity = automobiles_lib.gravity + +delorean.S = nil + +if(minetest.get_translator ~= nil) then + delorean.S = minetest.get_translator(minetest.get_current_modname()) + +else + delorean.S = function ( s ) return s end + +end + +local S = delorean.S + +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "custom_physics.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "control.lua") +dofile(minetest.get_modpath("automobiles_delorean") .. DIR_DELIM .. "forms.lua") +dofile(minetest.get_modpath("automobiles_delorean") .. DIR_DELIM .. "control.lua") +dofile(minetest.get_modpath("automobiles_delorean") .. DIR_DELIM .. "flight.lua") +dofile(minetest.get_modpath("automobiles_delorean") .. DIR_DELIM .. "entities.lua") +dofile(minetest.get_modpath("automobiles_delorean") .. DIR_DELIM .. "crafts.lua") + + diff --git a/mods/automobiles_pck/automobiles_delorean/locale/automobiles_delorean.de.tr b/mods/automobiles_pck/automobiles_delorean/locale/automobiles_delorean.de.tr new file mode 100644 index 0000000..b693bfa --- /dev/null +++ b/mods/automobiles_pck/automobiles_delorean/locale/automobiles_delorean.de.tr @@ -0,0 +1,10 @@ +# textdomain: automobiles_delorean +### coupe_crafts.lua ### +Delorean Body=Delorean Karrosserie +Time Machine=Zeitmaschine +Delorean=Delorean +A very nice delorean!=Ein sehr schöner Delorean! +Go Offboard=Aussteigen +Lights=Lichter +Flight Mode=Flugmodus +Direction by mouse=Lenke mit Maus diff --git a/mods/automobiles_pck/automobiles_delorean/locale/automobiles_delorean.eo.tr b/mods/automobiles_pck/automobiles_delorean/locale/automobiles_delorean.eo.tr new file mode 100644 index 0000000..68daddb --- /dev/null +++ b/mods/automobiles_pck/automobiles_delorean/locale/automobiles_delorean.eo.tr @@ -0,0 +1,10 @@ +# textdomain: automobiles_delorean +### crafts.lua ### +Delorean Body=Korpo de Delorean +Time Machine= +Delorean=Delorean +A very nice delorean!= +Go Offboard= +Lights= +Flight Mode= +Direction by mouse= diff --git a/mods/automobiles_pck/automobiles_delorean/locale/template.txt b/mods/automobiles_pck/automobiles_delorean/locale/template.txt new file mode 100644 index 0000000..6547cb1 --- /dev/null +++ b/mods/automobiles_pck/automobiles_delorean/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain: automobiles_delorean +### coupe_crafts.lua ### +Delorean Body= +Time Machine= +Delorean= +A very nice delorean!= +Go Offboard= +Lights= +Flight Mode= +Direction by mouse= diff --git a/mods/automobiles_pck/automobiles_delorean/mod.conf b/mods/automobiles_pck/automobiles_delorean/mod.conf new file mode 100755 index 0000000..21bc41d --- /dev/null +++ b/mods/automobiles_pck/automobiles_delorean/mod.conf @@ -0,0 +1,5 @@ +name=automobiles_delorean +title=Delorean +description=A Delorean +author=apercy +depends=automobiles_lib diff --git a/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_body.b3d b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_body.b3d new file mode 100755 index 0000000..7160324 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_body.b3d differ diff --git a/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_f_lights.b3d b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_f_lights.b3d new file mode 100755 index 0000000..392d326 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_f_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_normal_kit.b3d b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_normal_kit.b3d new file mode 100755 index 0000000..9582f99 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_normal_kit.b3d differ diff --git a/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_rear_pos_lights.b3d b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_rear_pos_lights.b3d new file mode 100755 index 0000000..7d21980 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_rear_pos_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_reverse_lights.b3d b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_reverse_lights.b3d new file mode 100755 index 0000000..23e472c Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_reverse_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_time_machine_accessories.b3d b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_time_machine_accessories.b3d new file mode 100755 index 0000000..ee289f9 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_time_machine_accessories.b3d differ diff --git a/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_time_machine_instruments.b3d b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_time_machine_instruments.b3d new file mode 100755 index 0000000..e1911d6 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_time_machine_instruments.b3d differ diff --git a/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_turn_l_light.b3d b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_turn_l_light.b3d new file mode 100755 index 0000000..2e4e92a Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_turn_l_light.b3d differ diff --git a/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_turn_r_light.b3d b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_turn_r_light.b3d new file mode 100755 index 0000000..643e38b Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_turn_r_light.b3d differ diff --git a/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_wheel.b3d b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_wheel.b3d new file mode 100755 index 0000000..15d59f0 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/models/automobiles_delorean_wheel.b3d differ diff --git a/mods/automobiles_pck/automobiles_delorean/screenshot.png b/mods/automobiles_pck/automobiles_delorean/screenshot.png new file mode 100644 index 0000000..4429e34 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/screenshot.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/sounds/delorean_engine.ogg b/mods/automobiles_pck/automobiles_delorean/sounds/delorean_engine.ogg new file mode 100644 index 0000000..fb9170f Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/sounds/delorean_engine.ogg differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean.png new file mode 100755 index 0000000..ea4916c Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_body.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_body.png new file mode 100755 index 0000000..cb1de60 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_body.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_brass.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_brass.png new file mode 100755 index 0000000..d205b3f Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_brass.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_flux.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_flux.png new file mode 100755 index 0000000..7ca8a8d Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_flux.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_flux_off.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_flux_off.png new file mode 100644 index 0000000..37d72a9 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_flux_off.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_fuel.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_fuel.png new file mode 100755 index 0000000..089e6c4 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_fuel.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_glasses.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_glasses.png new file mode 100755 index 0000000..e0eb69f Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_glasses.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_lights.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_lights.png new file mode 100755 index 0000000..6c7d532 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_lights.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_roof_1.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_roof_1.png new file mode 100755 index 0000000..81a26a2 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_roof_1.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_roof_1_off.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_roof_1_off.png new file mode 100644 index 0000000..d939742 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_roof_1_off.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_roof_2.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_roof_2.png new file mode 100755 index 0000000..0910c40 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_roof_2.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_roof_2_off.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_roof_2_off.png new file mode 100644 index 0000000..f5e00eb Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_roof_2_off.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_time.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_time.png new file mode 100755 index 0000000..7619254 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_time.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_time_off.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_time_off.png new file mode 100644 index 0000000..0570d12 Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_time_off.png differ diff --git a/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_wheel.png b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_wheel.png new file mode 100755 index 0000000..154b0bb Binary files /dev/null and b/mods/automobiles_pck/automobiles_delorean/textures/automobiles_delorean_wheel.png differ diff --git a/mods/automobiles_pck/automobiles_lib/README.md b/mods/automobiles_pck/automobiles_lib/README.md new file mode 100755 index 0000000..9f6ee0a --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/README.md @@ -0,0 +1,9 @@ +This mod adds library for automobiles + +licence of code +MIT + +physics_lib.lua - MIT by TheTermos + +licence of the media: +licence CC0 diff --git a/mods/automobiles_pck/automobiles_lib/blend/automobile_scaled.blend b/mods/automobiles_pck/automobiles_lib/blend/automobile_scaled.blend new file mode 100755 index 0000000..c0fc0b3 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/blend/automobile_scaled.blend differ diff --git a/mods/automobiles_pck/automobiles_lib/blend/buggy.blend b/mods/automobiles_pck/automobiles_lib/blend/buggy.blend new file mode 100755 index 0000000..61e6f02 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/blend/buggy.blend differ diff --git a/mods/automobiles_pck/automobiles_lib/blend/coupe.blend b/mods/automobiles_pck/automobiles_lib/blend/coupe.blend new file mode 100755 index 0000000..1b61d2b Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/blend/coupe.blend differ diff --git a/mods/automobiles_pck/automobiles_lib/control.lua b/mods/automobiles_pck/automobiles_lib/control.lua new file mode 100755 index 0000000..1001829 --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/control.lua @@ -0,0 +1,233 @@ +--global constants + +automobiles_lib.vector_up = vector.new(0, 1, 0) + +function automobiles_lib.check_road_is_ok(obj, max_acc_factor) + local pos_below = obj:get_pos() + pos_below.y = pos_below.y - 0.1 + local node_below = core.get_node(pos_below).name + --core.chat_send_all(node_below) + local nodedef = core.registered_nodes[node_below] + if nodedef.liquidtype == "none" then + local slow_nodes = { + ['default:ice '] = 0.01, + ['default:cave_ice'] = 0.01, + } + local acc = slow_nodes[node_below] + if acc == nil then acc = max_acc_factor end + return acc + else + return 0 + end +end + +function automobiles_lib.set_yaw_by_mouse(self, dir, steering_limit) + local rotation = self.object:get_rotation() + local rot_y = math.deg(rotation.y) + + local total = math.abs(math.floor(rot_y/360)) + + if rot_y < 0 then rot_y = rot_y + (360*total) end + if rot_y > 360 then rot_y = rot_y - (360*total) end + if rot_y >= 270 and dir <= 90 then dir = dir + 360 end + if rot_y <= 90 and dir >= 270 then dir = dir - 360 end + + local intensity = 2 + if self._intensity then intensity = self._intensity end + local command = (rot_y - dir) * intensity + if command < -90 then command = -90 + elseif command > 90 then command = 90 end + --core.chat_send_all("rotation y: "..rot_y.." - dir: "..dir.." - command: "..(rot_y - dir)) + + --core.chat_send_all("rotation y: "..rot_y.." - dir: "..dir.." - command: "..command) + + return (-command * steering_limit)/90 +end + +function automobiles_lib.control(self, dtime, hull_direction, longit_speed, longit_drag, later_drag, accel, max_acc_factor, max_speed, steering_limit, steering_speed) + self._last_time_command = self._last_time_command + dtime + hull_direction = hull_direction or 0 + longit_speed = longit_speed or 0 + longit_drag = longit_drag or 0 + later_drag = later_drag or 0 + max_acc_factor = max_acc_factor or 0 + max_acc_factor = max_acc_factor + + max_speed = max_speed or 0 + max_speed = math.min(max_speed,automobiles_lib.speed_limit) + + steering_limit = steering_limit or 0 + steering_speed = steering_speed or 0 + + if self._last_time_command > 1 then self._last_time_command = 1 end + + local player = core.get_player_by_name(self.driver_name) + local retval_accel = accel; + local stop = false + + -- player control + if player then + local ctrl = player:get_player_control() + local rot_x = player:get_look_vertical() + local pi = math.pi + local ang_min = -pi / 32 + local ang_max = pi / 64 + local gap = pi / 128 + + if self._one_hand == true then + if rot_x < (ang_min - gap)then + player:set_look_vertical(ang_min - gap) + end + if rot_x > (ang_max + gap) then + player:set_look_vertical(ang_max + gap) + end + end + + local acc = 0 + if self._energy > 0 then + if self._one_hand == true then + if rot_x <= ang_min then + if longit_speed < max_speed then + --get acceleration factor + acc = automobiles_lib.check_road_is_ok(self.object, max_acc_factor) + --core.chat_send_all('engineacc: '.. engineacc) + if acc > 1 and acc < max_acc_factor and longit_speed > 0 then + --improper road will reduce speed + acc = -1 + end + end + end + else + if longit_speed < max_speed and ctrl.up then + --get acceleration factor + acc = automobiles_lib.check_road_is_ok(self.object, max_acc_factor) + --core.chat_send_all('engineacc: '.. engineacc) + if acc > 1 and acc < max_acc_factor and longit_speed > 0 then + --improper road will reduce speed + acc = -1 + end + end + end + + + --reversing + if self._one_hand == true then + if rot_x >= ang_max then + acc = -2 + end + else + if ctrl.sneak and longit_speed <= 1.0 and longit_speed > -1.0 then + acc = -2 + end + end + end + + --break + if self._one_hand == true then + if rot_x >= ang_max and not ctrl.LMB then + if longit_speed > 0 then + acc = -5 + end + if longit_speed < 0 then + acc = 5 + if (longit_speed + acc) > 0 then + acc = longit_speed * -1 + end + end + if math.abs(longit_speed) < 1 then + stop = true + end + end + else + if ctrl.down or ctrl.jump then + --[[if math.abs(longit_speed) > 0 then + acc = -5 / (longit_speed / 2) -- lets set a brake efficience based on speed + end]]-- + + --total stop + --wheel break + if longit_speed > 0 then + acc = -5 + --[[if (longit_speed + acc) < 0 then + acc = longit_speed * -1 + end]]-- + end + if longit_speed < 0 then + acc = 5 + if (longit_speed + acc) > 0 then + acc = longit_speed * -1 + end + end + if math.abs(longit_speed) < 1 then + stop = true + end + end + end + + if acc then retval_accel=vector.add(accel,vector.multiply(hull_direction,acc)) end + + if ctrl.aux1 then + if self._one_hand == true then + local formspec_f = automobiles_lib.driver_formspec + if self._formspec_function then formspec_f = self._formspec_function end + formspec_f(self.driver_name) + end + --[[ + --sets the engine running - but sets a delay also, cause keypress + if self._last_time_command > 0.3 then + self._last_time_command = 0 + if self._engine_running then + self._engine_running = false + -- sound and animation + if self.sound_handle then + core.sound_stop(self.sound_handle) + self.sound_handle = nil + end + --self.engine:set_animation_frame_speed(0) + + elseif self._engine_running == false and self._energy > 0 then + self._engine_running = true + -- sound and animation + self.sound_handle = core.sound_play({name = "engine"}, + {object = self.object, gain = 2.0, pitch = 1.0, max_hear_distance = 32, loop = true,}) + --self.engine:set_animation_frame_speed(30) + end + end]]-- + end + + -- yaw + local yaw_cmd = 0 + if self._yaw_by_mouse == true or self._one_hand == true then + local rot_y = math.deg(player:get_look_horizontal()) + self._steering_angle = automobiles_lib.set_yaw_by_mouse(self, rot_y, steering_limit) + else + -- steering + if ctrl.right then + self._steering_angle = math.max(self._steering_angle-steering_speed*dtime,-steering_limit) + elseif ctrl.left then + self._steering_angle = math.min(self._steering_angle+steering_speed*dtime,steering_limit) + else + --center steering + if longit_speed > 0 then + local factor = 1 + if self._steering_angle > 0 then factor = -1 end + local correction = (steering_limit*(longit_speed/75)) * factor + local before_correction = self._steering_angle + self._steering_angle = self._steering_angle + correction + if math.sign(before_correction) ~= math.sign(self._steering_angle) then self._steering_angle = 0 end + end + end + end + + local angle_factor = self._steering_angle / 60 + if angle_factor < 0 then angle_factor = angle_factor * -1 end + local deacc_on_curve = longit_speed * angle_factor + deacc_on_curve = deacc_on_curve * -1 + if deacc_on_curve then retval_accel=vector.add(retval_accel,vector.multiply(hull_direction,deacc_on_curve)) end + + end + + return retval_accel, stop +end + + diff --git a/mods/automobiles_pck/automobiles_lib/custom_physics.lua b/mods/automobiles_pck/automobiles_lib/custom_physics.lua new file mode 100755 index 0000000..5f84d5b --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/custom_physics.lua @@ -0,0 +1,95 @@ +function automobiles_lib.physics(self) + local friction = self._ground_friction or 0.99 + local vel=self.object:get_velocity() + local new_velocity = vector.new() + + --buoyancy + local surface = nil + local surfnodename = nil + local spos = automobiles_lib.get_stand_pos(self) + if not spos then return end + spos.y = spos.y+0.01 + -- get surface height + local snodepos = automobiles_lib.get_node_pos(spos) + local surfnode = automobiles_lib.nodeatpos(spos) + while surfnode and (surfnode.drawtype == 'liquid' or surfnode.drawtype == 'flowingliquid') do + surfnodename = surfnode.name + surface = snodepos.y +0.5 + if surface > spos.y+self.height then break end + snodepos.y = snodepos.y+1 + surfnode = automobiles_lib.nodeatpos(snodepos) + end + + self.isinliquid = surfnodename + if surface then -- standing in liquid + self.isinliquid = true + end + local last_accel = vector.new() + if self._last_accel then + last_accel = vector.new(self._last_accel) + end + + if self.isinliquid then + self.water_drag = 0.2 + self.isinliquid = true + local height = self.height + local submergence = math.min(surface-spos.y,height)/height +-- local balance = self.buoyancy*self.height + local buoyacc = automobiles_lib.gravity*(-1)*(self.buoyancy-submergence) + --local buoyacc = self._baloon_buoyancy*(self.buoyancy-submergence) + local accell = { + x=-vel.x*self.water_drag, + y=buoyacc-(vel.y*math.abs(vel.y)*0.4), + z=-vel.z*self.water_drag + } + if self.buoyancy >= 1 then self._engine_running = false end + if last_accel then + accell = vector.add(accell,last_accel) + end + new_velocity = vector.multiply(accell,self.dtime) + else + self.isinliquid = false + new_velocity = vector.multiply(last_accel,self.dtime) + end + + if self.isonground and not self.isinliquid then + --dumb friction + new_velocity = {x=new_velocity.x*friction, + y=new_velocity.y, + z=new_velocity.z*friction} + --core.chat_send_all(dump(friction)) + + -- bounciness + if self.springiness and self.springiness > 0 and self.buoyancy >= 1 then + local vnew = vector.new(new_velocity) + + if not self.collided then -- ugly workaround for inconsistent collisions + for _,k in ipairs({'y','z','x'}) do + if new_velocity[k]==0 and math.abs(self.lastvelocity[k])> 0.1 then + vnew[k]=-self.lastvelocity[k]*self.springiness + end + end + end + + if not vector.equals(new_velocity,vnew) then + self.collided = true + else + if self.collided then + vnew = vector.new(self.lastvelocity) + end + self.collided = false + end + new_velocity = vnew + end + + --fix bug with unexpected moving + if not self.driver_name and math.abs(vel.x) < 0.2 and math.abs(vel.z) < 0.2 then + self.object:set_velocity({x=0,y=automobiles_lib.gravity*(-1)*self.dtime,z=0}) + if self.wheels then self.wheels:set_animation_frame_speed(0) end + return + end + end + + self.object:add_velocity(new_velocity) +end + diff --git a/mods/automobiles_pck/automobiles_lib/entities.lua b/mods/automobiles_pck/automobiles_lib/entities.lua new file mode 100644 index 0000000..05858ae --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/entities.lua @@ -0,0 +1,865 @@ +minetest.register_entity('automobiles_lib:pivot_mesh',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_pivot_mesh.b3d", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + self.object:set_armor_groups({immortal=1}) + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_lib:pointer',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_pointer.b3d", + visual_size = {x = 0.5, y = 0.5, z = 0.5}, + textures = {"automobiles_white.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + self.object:set_armor_groups({immortal=1}) + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, +}) + +function automobiles_lib.on_rightclick (self, clicker) + if not clicker or not clicker:is_player() then + --return + end + + local name = clicker:get_player_name() + --[[if self.owner and self.owner ~= name and self.owner ~= "" then return end]]-- + if self.owner == "" then + self.owner = name + end + + if name == self.driver_name then + local formspec_f = automobiles_lib.driver_formspec + if self._formspec_function then formspec_f = self._formspec_function end + formspec_f(name) + else + if name == self.owner or + (self.driver_name == nil and + ( minetest.check_player_privs(clicker, "valet_parking") or minetest.check_player_privs(clicker, {server=true}) ) + ) then + if clicker:get_player_control().aux1 == true then + automobiles_lib.show_vehicle_trunk_formspec(self, clicker, self._trunk_slots) + else + --is the owner, okay, lets attach + local attach_driver_f = automobiles_lib.attach_driver + if self._attach then attach_driver_f = self._attach end + attach_driver_f(self, clicker) + -- sound + local base_pitch = 1 + if self._base_pitch then base_pitch = self._base_pitch end + self.sound_handle = minetest.sound_play({name = self._engine_sound}, + {object = self.object, gain = 1, pitch = base_pitch, max_hear_distance = 30, loop = true,}) + end + else + --minetest.chat_send_all("clicou") + --a passenger + + if (automobiles_lib.is_minetest and not player_api.player_attached[name]) or + (automobiles_lib.is_mcl and not mcl_player.player_attached[name]) then + --there is no passenger, so lets attach + if self.driver_name then + local attach_pax_f = automobiles_lib.attach_pax + if self._attach_pax then attach_pax_f = self._attach_pax end + attach_pax_f(self, clicker, true) + end + else + --there is a passenger + --if you are the passenger, so deattach + local dettach_pax_f = automobiles_lib.dettach_pax + if self._dettach_pax then dettach_pax_f = self._dettach_pax end + dettach_pax_f(self, clicker) + end + end + end +end + +function automobiles_lib.on_punch (self, puncher, ttime, toolcaps, dir, damage) + if not puncher or not puncher:is_player() then + return + end + + local name = puncher:get_player_name() + --[[if self.owner and self.owner ~= name and self.owner ~= "" then return end]]-- + if self.owner == nil then + self.owner = name + end + + if self.driver_name and self.driver_name ~= name then + -- do not allow other players to remove the object while there is a driver + return + end + + local is_attached = false + local obj_attach = puncher:get_attach() + if obj_attach == self.driver_seat or obj_attach == self.object then is_attached = true end + + local itmstck=puncher:get_wielded_item() + local item_name = "" + if itmstck then item_name = itmstck:get_name() end + + --refuel procedure + --[[ + refuel works it car is stopped and engine is off + ]]-- + local velocity = self.object:get_velocity() + local speed = automobiles_lib.get_hipotenuse_value(vector.new(), velocity) + --if math.abs(speed) <= 0.1 then + local was_refueled = automobiles_lib.loadFuel(self, puncher:get_player_name(), false, self._max_fuel) + if was_refueled then + return + end + --end + -- end refuel + + if is_attached == false then + + -- deal with painting or destroying + if itmstck then + --race status restart + if item_name == "checkpoints:status_restarter" and self._engine_running == false then + --restart race current status + self._last_checkpoint = "" + self._total_laps = -1 + self._race_id = "" + return + end + + local paint_f = automobiles_lib.set_paint + if self._painting_function then paint_f = self._painting_function end + if paint_f(self, puncher, itmstck) == false then + local is_admin = false + is_admin = minetest.check_player_privs(puncher, {server=true}) + --minetest.chat_send_all('owner '.. self.owner ..' - name '.. name) + if not self.driver and (self.owner == name or is_admin == true) and toolcaps and + toolcaps.damage_groups and toolcaps.damage_groups.fleshy then + self.hp = self.hp - 10 + minetest.sound_play("automobiles_collision", { + object = self.object, + max_hear_distance = 5, + gain = 1.0, + fade = 0.0, + pitch = 1.0, + }) + end + end + end + + if self.hp <= 0 then + local destroy_f = automobiles_lib.destroy + if self._destroy_function then destroy_f = self._destroy_function end + destroy_f(self) + end + + end +end + +function automobiles_lib.get_staticdata(self) + return minetest.serialize({ + stored_owner = self.owner, + stored_hp = self.hp, + stored_color = self._color, + stored_det_color = self._det_color, + stored_steering = self._steering_angle, + stored_energy = self._energy, + stored_rag = self._show_rag, + stored_pitch = self._pitch, + stored_light_old_pos = self._light_old_pos, + stored_inv_id = self._inv_id, + stored_car_type = self._car_type, + stored_car_gravity = self._car_gravity, + stored_scale = self._vehicle_scale or 1, + stored_power_scale = self._vehicle_power_scale or 1, + --race data + stored_last_checkpoint = self._last_checkpoint, + stored_total_laps = self._total_laps, + stored_race_id = self._race_id, + }) +end + +local function scale_entity(self, scale) + scale = scale or 1 + local initial_properties = automobiles_lib.properties_copy(self.initial_properties) + local new_properties = automobiles_lib.properties_copy(initial_properties) + + --[[if initial_properties.collisionbox then + for i, value in ipairs(initial_properties.collisionbox) do + new_properties.collisionbox[i] = value * scale + --core.log("action", new_properties.collisionbox[i]) + end + end + + if initial_properties.selectionbox then + for i, value in ipairs(initial_properties.selectionbox) do + new_properties.selectionbox[i] = value * scale + end + end]]-- + + if initial_properties.stepheight then + new_properties.stepheight = initial_properties.stepheight * scale + end + + new_properties.visual_size = {x=scale, y=scale} + + self.object:set_properties(new_properties) +end + +function automobiles_lib.on_activate(self, staticdata, dtime_s) + if staticdata ~= "" and staticdata ~= nil then + local data = minetest.deserialize(staticdata) or {} + self.owner = data.stored_owner + self.hp = data.stored_hp + self._color = data.stored_color + self._det_color = data.stored_det_color + self._steering_angle = data.stored_steering + self._energy = data.stored_energy + --minetest.debug("loaded: ", self.energy) + --race data + self._last_checkpoint = data.stored_last_checkpoint + self._total_laps = data.stored_total_laps + self._race_id = data.stored_race_id + self._show_rag = data.stored_rag + self._pitch = data.stored_pitch + self._light_old_pos = data.stored_light_old_pos + self._inv_id = data.stored_inv_id + + self._car_type = data.stored_car_type + self._car_gravity = data.stored_car_gravity or -automobiles_lib.gravity + self._vehicle_scale = data.stored_scale or 1 + self._vehicle_power_scale = data.stored_power_scale or 1 + + automobiles_lib.setText(self, self._vehicle_name) + if data.remove then + automobiles_lib.destroy_inventory(self) + self.object:remove() + return + end + end + + scale_entity(self, self._vehicle_scale) + + if self._painting_load then + self._painting_load(self, self._color) + else + automobiles_lib.paint(self, self._color) + end + + local pos = self.object:get_pos() + + local front_suspension=minetest.add_entity(self.object:get_pos(),self._front_suspension_ent) + if front_suspension then + front_suspension:set_attach(self.object,'',self._front_suspension_pos,{x=0,y=0,z=0}) + self.front_suspension = front_suspension + end + + if self._front_wheel_ent then + local lf_wheel=minetest.add_entity(pos,self._front_wheel_ent) + if lf_wheel then + lf_wheel:set_attach(self.front_suspension,'',{x=-self._front_wheel_xpos,y=0,z=0},{x=0,y=0,z=0}) + -- set the animation once and later only change the speed + lf_wheel:set_animation(self._front_wheel_frames, 0, 0, true) + self.lf_wheel = lf_wheel + end + + local rf_wheel=minetest.add_entity(pos,self._front_wheel_ent) + if rf_wheel then + rf_wheel:set_attach(self.front_suspension,'',{x=self._front_wheel_xpos,y=0,z=0},{x=0,y=180,z=0}) + -- set the animation once and later only change the speed + rf_wheel:set_animation(self._front_wheel_frames, 0, 0, true) + self.rf_wheel = rf_wheel + end + end + + local rear_suspension=minetest.add_entity(self.object:get_pos(),self._rear_suspension_ent) + if rear_suspension then + rear_suspension:set_attach(self.object,'',self._rear_suspension_pos,{x=0,y=0,z=0}) + self.rear_suspension = rear_suspension + end + + if self._rear_wheel_ent then + local lr_wheel=minetest.add_entity(pos,self._rear_wheel_ent) + if lr_wheel then + lr_wheel:set_attach(self.rear_suspension,'',{x=-self._rear_wheel_xpos,y=0,z=0},{x=0,y=0,z=0}) + -- set the animation once and later only change the speed + lr_wheel:set_animation(self._rear_wheel_frames, 0, 0, true) + self.lr_wheel = lr_wheel + end + + local rr_wheel=minetest.add_entity(pos,self._rear_wheel_ent) + if rr_wheel then + rr_wheel:set_attach(self.rear_suspension,'',{x=self._rear_wheel_xpos,y=0,z=0},{x=0,y=180,z=0}) + -- set the animation once and later only change the speed + rr_wheel:set_animation(self._rear_wheel_frames, 0, 0, true) + self.rr_wheel = rr_wheel + end + end + + + if self._steering_ent then + local steering_axis=minetest.add_entity(pos,'automobiles_lib:pivot_mesh') + if steering_axis then + steering_axis:set_attach(self.object,'',self._drive_wheel_pos,{x=self._drive_wheel_angle,y=0,z=0}) + if steering_axis then + self.steering_axis = steering_axis + + local steering=minetest.add_entity(self.steering_axis:get_pos(), self._steering_ent) + steering:set_attach(self.steering_axis,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.steering = steering + end + end + end + + if self._rag_retracted_ent then + local rag_rect=minetest.add_entity(self.object:get_pos(),self._rag_retracted_ent) + if rag_rect then + rag_rect:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.rag_rect = rag_rect + self.rag_rect:set_properties({is_visible=false}) + end + end + + if self._rag_extended_ent then + local rag=minetest.add_entity(self.object:get_pos(),self._rag_extended_ent) + if rag then + rag:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.rag = rag + end + end + + automobiles_lib.seats_create(self) + + local pointer_entity = 'automobiles_lib:pointer' + if self._gauge_pointer_ent then pointer_entity = self._gauge_pointer_ent end + if self._fuel_gauge_pos then + local fuel_gauge=minetest.add_entity(pos, pointer_entity) + if fuel_gauge then + fuel_gauge:set_attach(self.object,'',self._fuel_gauge_pos,{x=0,y=0,z=0}) + self.fuel_gauge = fuel_gauge + end + end + + if self._front_lights then + local lights = minetest.add_entity(pos,self._front_lights) + if lights then + lights:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.lights = lights + self.lights:set_properties({is_visible=true}) + end + end + + if self._rear_lights then + local r_lights = minetest.add_entity(pos,self._rear_lights) + if r_lights then + r_lights:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.r_lights = r_lights + self.r_lights:set_properties({is_visible=true}) + end + end + + if self._reverse_lights then + local reverse_lights = minetest.add_entity(pos,self._reverse_lights) + if reverse_lights then + reverse_lights:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.reverse_lights = reverse_lights + self.reverse_lights:set_properties({is_visible=true}) + end + end + + if self._turn_left_lights then + local turn_l_light = minetest.add_entity(pos,self._turn_left_lights) + if turn_l_light then + turn_l_light:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.turn_l_light = turn_l_light + self.turn_l_light:set_properties({is_visible=true}) + end + end + + if self._turn_right_lights then + local turn_r_light = minetest.add_entity(pos,self._turn_right_lights) + if turn_r_light then + turn_r_light:set_attach(self.object,'',{x=0,y=0,z=0},{x=0,y=0,z=0}) + self.turn_r_light = turn_r_light + self.turn_r_light:set_properties({is_visible=true}) + end + end + + if self._extra_items_function then + self._extra_items_function(self) + end + + self.object:set_armor_groups({immortal=1}) + + local inv = minetest.get_inventory({type = "detached", name = self._inv_id}) + -- if the game was closed the inventories have to be made anew, instead of just reattached + if not inv then + automobiles_lib.create_inventory(self, self._trunk_slots) + else + self.inv = inv + end + + automobiles_lib.actfunc(self, staticdata, dtime_s) +end + +function checkIsFinite(mynumber) + if math.isfinite(mynumber) then + return mynumber + end + return 0 +end + +function automobiles_lib.on_step(self, dtime) + automobiles_lib.stepfunc(self, dtime) + + --[[sound play control]]-- + self._last_time_collision_snd = self._last_time_collision_snd + dtime + if self._last_time_collision_snd > 1 then self._last_time_collision_snd = 1 end + self._last_time_drift_snd = self._last_time_drift_snd + dtime + if self._last_time_drift_snd > 2.0 then self._last_time_drift_snd = 2.0 end + --[[end sound control]]-- + + --in case it's not declared + self._max_acc_factor = self._max_acc_factor or 1 + self._vehicle_scale = self._vehicle_scale or 1 + self._vehicle_power_scale = self._vehicle_power_scale or self._vehicle_scale + + local rotation = self.object:get_rotation() + local yaw = rotation.y + local newyaw=yaw + local pitch = rotation.x + + local hull_direction = minetest.yaw_to_dir(yaw) + local nhdir = {x=hull_direction.z,y=0,z=-hull_direction.x} -- lateral unit vector + local velocity = self.object:get_velocity() + + local longit_speed = automobiles_lib.dot(velocity,hull_direction) + local fuel_weight_factor = (5 - self._energy)/5000 + local longit_drag = vector.multiply(hull_direction,(longit_speed*longit_speed) * + (self._LONGIT_DRAG_FACTOR - fuel_weight_factor) * -1 * automobiles_lib.sign(longit_speed)) + + local later_speed = automobiles_lib.dot(velocity,nhdir) + local dynamic_later_drag = self._LATER_DRAG_FACTOR + if longit_speed > 2 then dynamic_later_drag = 2.0 end + if longit_speed > 8 then dynamic_later_drag = 0.5 end + --core.chat_send_all(dump(longit_speed)) + + if automobiles_lib.extra_drift and longit_speed > (4*self._vehicle_power_scale) then + dynamic_later_drag = dynamic_later_drag/(longit_speed*2) + end + + local later_drag = vector.new() + if self._is_motorcycle == true then + later_drag = vector.multiply(nhdir,later_speed* + later_speed*self._LATER_DRAG_FACTOR*-1*automobiles_lib.sign(later_speed)) + else + later_drag = vector.multiply(nhdir,later_speed* + later_speed*dynamic_later_drag*-1*automobiles_lib.sign(later_speed)) + end + + local accel = vector.add(longit_drag,later_drag) + local stop = nil + local curr_pos = self.object:get_pos() + + if self._show_rag == true then + if self._windshield_pos and self._windshield_ext_rotation then + self.object:set_bone_position("windshield", self._windshield_pos, self._windshield_ext_rotation) --extended + end + if self.rag_rect then self.rag_rect:set_properties({is_visible=true}) end + if self.rag then self.rag:set_properties({is_visible=false}) end + else + if self._windshield_pos then + self.object:set_bone_position("windshield", self._windshield_pos, {x=0, y=0, z=0}) --retracted + end + if self.rag_rect then self.rag_rect:set_properties({is_visible=false}) end + if self.rag then self.rag:set_properties({is_visible=true}) end + end + + local player = nil + local is_attached = false + if self.driver_name then + player = minetest.get_player_by_name(self.driver_name) + + if player then + local player_attach = player:get_attach() + if player_attach then + if self.driver_seat then + if player_attach == self.driver_seat or player_attach == self.object then is_attached = true end + end + end + end + end + + --for flying + if self._setmode then + self._setmode(self, is_attached, curr_pos, velocity, player, dtime) + end + + local is_braking = false + if is_attached then + local ctrl = player:get_player_control() + if ctrl.jump then + dynamic_later_drag = 0.2 + end + if ctrl.aux1 then + --sets the engine running - but sets a delay also, cause keypress + if self._last_time_command > 0.8 then + self._last_time_command = 0 + local horn_sound = "automobiles_horn" + if self._horn_sound then horn_sound = self._horn_sound end + minetest.sound_play({name = horn_sound}, + {object = self.object, gain = 0.6, pitch = 1.0, max_hear_distance = 32, loop = false,}) + end + end + if ctrl.down then + is_braking = true + if self.r_lights then self.r_lights:set_properties({textures={"automobiles_rear_lights_full.png"}, glow=15}) end + end + if self.reverse_lights then + if ctrl.sneak then + self.reverse_lights:set_properties({textures={"automobiles_white.png"}, glow=15}) + else + self.reverse_lights:set_properties({textures={"automobiles_grey.png"}, glow=0}) + end + end + end + + self._last_light_move = self._last_light_move + dtime + if self._last_light_move > 0.15 then + self._last_light_move = 0 + if self.lights then + if self._show_lights == true then + --self.lights:set_properties({is_visible=true}) + self.lights:set_properties({textures={"automobiles_front_lights.png"}, glow=15}) + if is_braking == false then + if self.r_lights then self.r_lights:set_properties({textures={"automobiles_rear_lights.png"}, glow=10}) end + end + automobiles_lib.put_light(self) + else + --self.lights:set_properties({is_visible=false}) + self.lights:set_properties({textures={"automobiles_grey.png"}, glow=0}) + if is_braking == false then + if self.r_lights then self.r_lights:set_properties({textures={"automobiles_rear_lights_off.png"}, glow=0}) end + end + automobiles_lib.remove_light(self) + end + end + end + + -- impacts and control + if is_attached then --and self.driver_name == self.owner then + local impact = automobiles_lib.get_hipotenuse_value(velocity, self.lastvelocity) + if impact > 1 then + --self.damage = self.damage + impact --sum the impact value directly to damage meter + if self._last_time_collision_snd > 0.3 then + self._last_time_collision_snd = 0 + minetest.sound_play("collision", { + to_player = self.driver_name, + --pos = curr_pos, + --max_hear_distance = 5, + gain = 1.0, + fade = 0.0, + pitch = 1.0, + }) + end + --[[if self.damage > 100 then --if acumulated damage is greater than 100, adieu + automobiles_lib.destroy(self) + end]]-- + end + + --control + local steering_angle_max = 40 + local steering_speed = 40 + if math.abs(longit_speed) > 3*self._vehicle_scale then + local mid_speed = (steering_speed/2) + steering_speed = (mid_speed + (mid_speed / math.abs(longit_speed*0.25))*self._vehicle_scale) + end + + --adjust engine parameter (transmission emulation) + local acc_factor = self._max_acc_factor + local transmission_state = automobiles_lib.get_transmission_state(self, longit_speed, self._max_speed) + + local target_acc_factor = acc_factor + + if self._have_transmission ~= false then + if transmission_state == 1 then + target_acc_factor = (acc_factor/3) + end + if transmission_state == 2 then + target_acc_factor = (acc_factor/2) + end + self._transmission_state = transmission_state + end + --core.chat_send_all(transmission_state) + + --control + local control = automobiles_lib.control + if self._control_function then + control = self._control_function + end + accel, stop = control(self, dtime, hull_direction, longit_speed, longit_drag, later_drag, accel, target_acc_factor, self._max_speed, steering_angle_max, steering_speed) + --accel = vector.multiply(accel, self._vehicle_power_scale) + else + self._show_lights = false + if self.sound_handle ~= nil then + minetest.sound_stop(self.sound_handle) + self.sound_handle = nil + end + end + + local angle_factor = self._steering_angle / 10 + + --whell turn + if self.lf_wheel and self.rf_wheel and self.lr_wheel and self.rr_wheel and self._is_flying ~= 1 then + self.lf_wheel:set_attach(self.front_suspension,'',{x=-self._front_wheel_xpos,y=0,z=0},{x=0,y=-self._steering_angle-angle_factor,z=0}) + self.rf_wheel:set_attach(self.front_suspension,'',{x=self._front_wheel_xpos,y=0,z=0},{x=0,y=(-self._steering_angle+angle_factor)+180,z=0}) + self.lr_wheel:set_attach(self.rear_suspension,'',{x=-self._rear_wheel_xpos,y=0,z=0},{x=0,y=0,z=0}) + self.rr_wheel:set_attach(self.rear_suspension,'',{x=self._rear_wheel_xpos,y=0,z=0},{x=0,y=180,z=0}) + end + + --check if the tyres is touching the pavement + local noded = automobiles_lib.nodeatpos(automobiles_lib.pos_shift(curr_pos,{y=self.initial_properties.collisionbox[2]-0.5})) + if (noded and noded.drawtype ~= 'airlike') then + if noded.drawtype ~= 'liquid' then + local wheel_compensation = longit_speed * (self._wheel_compensation or 1) + if self.lf_wheel then self.lf_wheel:set_animation_frame_speed( wheel_compensation * (12 - angle_factor)) end + if self.rf_wheel then self.rf_wheel:set_animation_frame_speed(-wheel_compensation * (12 + angle_factor)) end + if self.lr_wheel then self.lr_wheel:set_animation_frame_speed( wheel_compensation * (12 - angle_factor)) end + if self.rr_wheel then self.rr_wheel:set_animation_frame_speed(-wheel_compensation * (12 + angle_factor)) end + end + else + --is flying + if self.lf_wheel then self.lf_wheel:set_animation_frame_speed(0) end + if self.rf_wheel then self.rf_wheel:set_animation_frame_speed(0) end + if self.lr_wheel then self.lr_wheel:set_animation_frame_speed(0) end + if self.rr_wheel then self.rr_wheel:set_animation_frame_speed(0) end + end + + --drive wheel turn + if self._steering_ent then + self.steering:set_attach(self.steering_axis,'',{x=0,y=0,z=0},{x=0,y=0,z=self._steering_angle*2}) + else + self.object:set_bone_position("drive_wheel", {x=-0, y=0, z=0}, {x=0, y=0, z=-self._steering_angle*2}) + end + + + if math.abs(self._steering_angle)>5 then + local turn_rate = math.rad(40) + newyaw = yaw + dtime*(1 - 1 / (math.abs(longit_speed) + 1)) * + self._steering_angle / 30 * turn_rate * automobiles_lib.sign(longit_speed) + end + + --turn light + if self.turn_l_light and self.turn_r_light then + self._turn_light_timer = self._turn_light_timer + dtime + if math.abs(self._steering_angle) > 15 and self._turn_light_timer >= 1 then + self._turn_light_timer = 0 + --set turn light + --minetest.chat_send_all(self._steering_angle) + local textures_l = self._textures_turn_lights_on or {"automobiles_rear_lights_full.png"} + if self._steering_angle < 0 then + --minetest.chat_send_all("direita") + self.turn_r_light:set_properties({textures=textures_l, glow=20}) + end + if self._steering_angle > 0 then + --minetest.chat_send_all("esquerda") + self.turn_l_light:set_properties({textures=textures_l, glow=20}) + end + end + if self._turn_light_timer > 0.5 then + local textures_l = self._textures_turn_lights_off or {"automobiles_rear_lights_off.png"} + self.turn_l_light:set_properties({textures=textures_l, glow=0}) + self.turn_r_light:set_properties({textures=textures_l, glow=0}) + end + if self._turn_light_timer > 1 then + self._turn_light_timer = 1 + end + end + + --if it's not NaN, add accel + accel.x = checkIsFinite(accel.x) + accel.y = checkIsFinite(accel.y) + accel.z = checkIsFinite(accel.z) + + --[[ + accell correction + under some circunstances the acceleration exceeds the max value accepted by set_acceleration and + the game crashes with an overflow, so limiting the max acceleration in each axis prevents the crash + ]]-- + local max_factor = 25 + local acc_adjusted = 0 + if accel.x > max_factor then accel.x = acc_adjusted end + if accel.x < -max_factor then accel.x = -acc_adjusted end + if accel.z > max_factor then accel.z = acc_adjusted end + if accel.z < -max_factor then accel.z = -acc_adjusted end + -- end correction + + -- calculate energy consumption -- + ---------------------------------- + if self._energy > 0 then + local zero_reference = vector.new() + local acceleration = automobiles_lib.get_hipotenuse_value(accel, zero_reference) + --minetest.chat_send_all(acceleration) + if automobiles_lib.is_drift_game == false then + local consumption = 40000 + if self._consumption_divisor then + consumption = self._consumption_divisor + end + local consumed_power = acceleration/consumption + self._energy = self._energy - consumed_power; + else + self._energy = 5 + end + end + if self._energy <= 0 then + self._engine_running = false + self._is_flying = 0 + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + self.sound_handle = nil + minetest.chat_send_player(self.driver_name, "Out of fuel") + end + else + self._last_engine_sound_update = self._last_engine_sound_update + dtime + if self._last_engine_sound_update > 0.300 then + self._last_engine_sound_update = 0 + automobiles_lib.engine_set_sound_and_animation(self, longit_speed) + end + end + + local energy_indicator_angle = automobiles_lib.get_gauge_angle(self._energy) + if self.fuel_gauge then + self.fuel_gauge:set_attach(self.object,'',self._fuel_gauge_pos,{x=0,y=0,z=energy_indicator_angle}) + end + ---------------------------- + -- end energy consumption -- + + --gravity works + if not self._is_flying or self._is_flying == 0 then + accel.y = -automobiles_lib.gravity + else + local time_correction = (self.dtime/automobiles_lib.ideal_step) + local y_accel = self._car_gravity*time_correction + accel.y = y_accel --sets the anti gravity + end + + if stop == true then + self._last_accel = vector.new() --self.object:get_acceleration() + self.object:set_acceleration({x=0,y=0,z=0}) + self.object:set_velocity({x=0,y=0,z=0}) + else + self.object:move_to(curr_pos) + --automobiles_lib.set_acceleration(self.object, new_accel) + local limit = (self._max_speed/self.dtime) + if accel.y > limit then accel.y = limit end --it isn't a rocket :/ + self._last_accel = accel + end + + self._last_ground_check = self._last_ground_check + dtime + if self._last_ground_check > 0.18 then + self._last_ground_check = 0 + automobiles_lib.ground_get_distances(self, 0.372*self._vehicle_scale, (self._front_suspension_pos.z*self._vehicle_scale)/10) + end + local newpitch = self._pitch --velocity.y * math.rad(6) + + local newroll = self._roll or 0 + if self._is_flying == 1 then + newpitch = 0 + local turn_effect_speed = longit_speed + if turn_effect_speed > 10 then turn_effect_speed = 10 end + newroll = (-self._steering_angle/100)*(turn_effect_speed/10) + if math.abs(self._steering_angle) < 1 then newroll = 0 end + + --pitch + local max_pitch = 6 + local h_vel_compensation = (((longit_speed * 2) * 100)/max_pitch)/100 + if h_vel_compensation < 0 then h_vel_compensation = 0 end + if h_vel_compensation > max_pitch then h_vel_compensation = max_pitch end + newpitch = newpitch + (velocity.y * math.rad(max_pitch - h_vel_compensation)) + else + local turn_effect_speed = longit_speed + if self._is_motorcycle then + if turn_effect_speed > 20 then turn_effect_speed = 20 end + newroll = (-self._steering_angle/100)*(turn_effect_speed/10) + + if is_attached == false and stop == true then + newroll = self._stopped_roll + end + else + if turn_effect_speed > 10 then turn_effect_speed = 10 end + if math.abs(longit_speed) > 0 then + --local tilt_effect = (-self._steering_angle/100)*(turn_effect_speed/30) + local max_tilt = 10 + local tilt_effect = (-later_speed/12)*(turn_effect_speed/30) + local tire_burn = false + if tilt_effect > max_tilt then + tilt_effect = max_tilt + end + if tilt_effect < -max_tilt then + tilt_effect = -max_tilt + end + newroll = tilt_effect * -1 + self.front_suspension:set_rotation({x=0,y=0,z=tilt_effect}) + self.rear_suspension:set_rotation({x=0,y=0,z=tilt_effect}) + newroll = newroll + (self._roll or 0) + + + if (noded and noded.drawtype ~= 'airlike') then + if noded.drawtype ~= 'liquid' then + local min_later_speed = self._min_later_speed or 3 + local speed_for_smoke = min_later_speed / 2 + if (later_speed > speed_for_smoke or later_speed < -speed_for_smoke) and not self._is_motorcycle then + automobiles_lib.add_smoke(self, curr_pos, yaw, self._rear_wheel_xpos*self._vehicle_scale) + if automobiles_lib.extra_drift == false then --disables the sound when playing drift game.. it's annoying + if self._last_time_drift_snd >= 2.0 and (later_speed > min_later_speed or later_speed < -min_later_speed) then + self._last_time_drift_snd = 0 + minetest.sound_play("automobiles_drifting", { + pos = curr_pos, + max_hear_distance = 20, + gain = 3.0, + fade = 0.0, + pitch = 1.0, + ephemeral = true, + }) + end + end + end + end + end + + + else + if self.front_suspension then self.front_suspension:set_rotation({x=0,y=0,z=0}) end + if self.rear_suspension then self.rear_suspension:set_rotation({x=0,y=0,z=0}) end + end + end + end + + self.object:set_rotation({x=newpitch,y=newyaw,z=newroll}) + + self._longit_speed = longit_speed +end diff --git a/mods/automobiles_pck/automobiles_lib/formspecs.lua b/mods/automobiles_pck/automobiles_lib/formspecs.lua new file mode 100644 index 0000000..002d110 --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/formspecs.lua @@ -0,0 +1,93 @@ +local S = automobiles_lib.S + +function automobiles_lib.getCarFromPlayer(player, self) + local seat = player:get_attach() + if seat then + local car = seat:get_attach() + if car then + return car + else + return seat + end + end + return nil +end + +function automobiles_lib.driver_formspec(name) + local player = minetest.get_player_by_name(name) + if player then + local vehicle_obj = automobiles_lib.getCarFromPlayer(player) + if vehicle_obj == nil then + return + end + local ent = vehicle_obj:get_luaentity() + + if ent then + local yaw = "false" + local one_hand = "false" + if ent._yaw_by_mouse then yaw = "true" end + if ent._one_hand then one_hand = "true" end + + local basic_form = table.concat({ + "formspec_version[3]", + "size[6,7]", + }, "") + + basic_form = basic_form.."button[1,1.0;4,1;go_out;" .. S("Go Offboard") .. "]" + basic_form = basic_form.."button[1,2.5;4,1;lights;" .. S("Lights") .. "]" + basic_form = basic_form.."checkbox[1,5.5;yaw;" .. S("Direction by mouse") .. ";"..yaw.."]" + basic_form = basic_form.."checkbox[1,6.2;one_hand;" .. S("One Hand Driving\n(open menu using AUX)") .. ";"..one_hand.."]" + + minetest.show_formspec(name, "automobiles_lib:driver_main", basic_form) + end + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "automobiles_lib:driver_main" then + local name = player:get_player_name() + local car_obj = automobiles_lib.getCarFromPlayer(player) + if car_obj then + local ent = car_obj:get_luaentity() + if ent then + if fields.go_out then + if ent._passenger then --any pax? + local pax_obj = minetest.get_player_by_name(ent._passenger) + + local dettach_pax_f = automobiles_lib.dettach_pax + if ent._dettach_pax then dettach_pax_f = ent._dettach_pax end + dettach_pax_f(ent, pax_obj) + end + ent._is_flying = 0 + + local dettach_f = automobiles_lib.dettach_driver + if ent._dettach then dettach_f = ent._dettach end + dettach_f(ent, player) + end + if fields.lights then + if ent._show_lights == true then + ent._show_lights = false + else + ent._show_lights = true + end + end + if fields.yaw then + if ent._yaw_by_mouse == true then + ent._yaw_by_mouse = false + else + ent._yaw_by_mouse = true + end + end + if fields.one_hand then + if ent._one_hand == true then + ent._one_hand = false + else + ent._one_hand = true + core.chat_send_player(name,core.colorize('#00ff00', S(" >>> Use AUX or key \"E\" to open the menu"))) + end + end + end + end + minetest.close_formspec(name, "automobiles_lib:driver_main") + end +end) diff --git a/mods/automobiles_pck/automobiles_lib/fuel_management.lua b/mods/automobiles_pck/automobiles_lib/fuel_management.lua new file mode 100755 index 0000000..dd298d5 --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/fuel_management.lua @@ -0,0 +1,44 @@ +-- +-- fuel +-- + +function automobiles_lib.contains(table, val) + for k,v in pairs(table) do + if k == val then + return v + end + end + return false +end + +function automobiles_lib.loadFuel(self, player_name, free, max_fuel) + free = free or false + local player = minetest.get_player_by_name(player_name) + local inv = player:get_inventory() + + local itmstck=player:get_wielded_item() + local item_name = "" + if itmstck then item_name = itmstck:get_name() end + + local fuel = automobiles_lib.contains(automobiles_lib.fuel, item_name) + --minetest.chat_send_all(dump(fuel)) + if fuel or free == true then + local stack = ItemStack(item_name .. " 1") + if self._energy < max_fuel then + itmstck:set_count(1) + + if free == false then inv:remove_item("main", itmstck) end + if fuel then + self._energy = self._energy + fuel + end + if self._energy > max_fuel then self._energy = max_fuel end + automobiles_lib.last_fuel_display = 0 + if self._energy == max_fuel then minetest.chat_send_player(player_name, "Full tank!") end + end + + return true + end + + return false +end + diff --git a/mods/automobiles_pck/automobiles_lib/ground_detection.lua b/mods/automobiles_pck/automobiles_lib/ground_detection.lua new file mode 100644 index 0000000..5961710 --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/ground_detection.lua @@ -0,0 +1,278 @@ +function automobiles_lib.putAngleOnRange(angle) + local n_angle = angle/360 + n_angle = (n_angle - math.floor(n_angle))*360 + if n_angle < -180 then n_angle = n_angle + 360 end + if n_angle > 180 then n_angle = n_angle - 360 end + return n_angle +end + +function automobiles_lib.pid_controller(current_value, setpoint, last_error, delta_t, kp, ki, kd) + kp = kp or 0 + ki = ki or 0.00000000000001 + kd = kd or 0.05 + delta_t = delta_t or 0.100; + + ti = kp/ki + td = kd/kp + + local _error = setpoint - current_value + local derivative = _error - last_error + --local output = kpv*erro + (kpv/Tiv)*I + kpv*Tdv*((erro - erro_passado)/delta_t); + if integrative == nil then integrative = 0 end + integrative = integrative + (((_error + last_error)/delta_t)/2); + local output = kp*_error + (kp/ti)*integrative + kp * td*((_error - last_error)/delta_t) + last_error = _error + return output, last_error + +end + +-- Função para calcular ângulos de pitch e roll +local function get_vehicle_pitch_roll(pos, wheels, yaw) + local world = vector.new() + --core.chat_send_all(dump(wheels)) + + --rotacionando as posições das rodas + for i = 1,4,1 do + local orig_x = wheels[i].x + local orig_z = wheels[i].z + wheels[i].x = (orig_x * math.cos(yaw)) - (orig_z * math.sin(yaw)) + wheels[i].z = (orig_x * math.sin(yaw)) + (orig_z * math.cos(yaw)) + end + --core.chat_send_all(dump(wheels)) + + local points = {} + + -- Obter altura do terreno para cada roda + for i, wheel in ipairs(wheels) do + world.x = pos.x + wheel.x + world.y = pos.y + wheel.y + world.z = pos.z + wheel.z + local height = automobiles_lib.get_obstacle({x=world.x,y=world.y,z=world.z}).y or 0 + table.insert(points, {x = world.x, y = height, z = world.z}) + end + + -- Calcular os coeficientes do plano Ax + By + Cz + D = 0 + local x1, y1, z1 = points[1].x, points[1].y, points[1].z + local x2, y2, z2 = points[2].x, points[2].y, points[2].z + local x3, y3, z3 = points[3].x, points[3].y, points[3].z + local x4, y4, z4 = points[4].x, points[4].y, points[4].z + + -- Criamos dois vetores a partir das quatro rodas + local v1 = {x = x2 - x1, y = y2 - y1, z = z2 - z1} + local v2 = {x = x3 - x1, y = y3 - y1, z = z3 - z1} + local v3 = {x = x4 - x1, y = y4 - y1, z = z4 - z1} + + -- Tiramos a média do produto vetorial entre os três vetores + local normal1 = { + x = v1.y * v2.z - v1.z * v2.y, + y = v1.z * v2.x - v1.x * v2.z, + z = v1.x * v2.y - v1.y * v2.x + } + + local normal2 = { + x = v1.y * v3.z - v1.z * v3.y, + y = v1.z * v3.x - v1.x * v3.z, + z = v1.x * v3.y - v1.y * v3.x + } + + -- Média das duas normais para melhor precisão + local normal = { + x = (normal1.x + normal2.x) / 2, + y = (normal1.y + normal2.y) / 2, + z = (normal1.z + normal2.z) / 2 + } + + -- Normalizar o vetor normal + local magnitude = math.sqrt(normal.x^2 + normal.y^2 + normal.z^2) + if magnitude == 0 then + return 0, 0 -- Retorna ângulos neutros se o cálculo falhar + end + + normal.x = normal.x / magnitude + normal.y = normal.y / magnitude + normal.z = normal.z / magnitude + --core.chat_send_all("normal2 "..dump(normal).."\nmagnitude: "..magnitude) + + -- Criar um vetor de direção do veículo (da traseira para a frente) + local forward = { + x = (wheels[1].x + wheels[2].x) / 2 - (wheels[3].x + wheels[4].x) / 2, + z = (wheels[1].z + wheels[2].z) / 2 - (wheels[3].z + wheels[4].z) / 2 + } + + -- Normalizar o vetor de direção + local magnitude_forward = math.sqrt(forward.x^2 + forward.z^2) + forward.x = forward.x / magnitude_forward + forward.z = forward.z / magnitude_forward + + -- Descobrir se o veículo está apontando para frente ou para trás no eixo Z + local direction_z = forward.z >= 0 and -1 or 1 + -- Descobrir se o veículo está apontando para direita/esquerda no eixo X + local direction_x = forward.x >= 0 and -1 or 1 + + -- Verificar qual eixo está "apontado para frente" + local dominantX = math.abs(forward.x) > math.abs(forward.z) + + local pitch, roll + local m, n + + if dominantX then + -- Calcular ângulos de pitch e roll + m = normal.x/normal.y + pitch = math.atan(m) * direction_x + if pitch ~= pitch then pitch = 0 end + n = normal.z/normal.y + roll = math.atan(n) * direction_x + if roll ~= roll then roll = 0 end + else + -- Calcular ângulos de pitch e roll + m = normal.z/normal.y + pitch = math.atan(m) * direction_z + if pitch ~= pitch then pitch = 0 end + n = normal.x/normal.y + roll = math.atan(n) * direction_z * -1 + if roll ~= roll then roll = 0 end + end + + --core.chat_send_all(dump("pitch "..math.deg(pitch).." - roll "..math.deg(roll))) + + return pitch, roll +end + +local function get_nodedef_field(nodename, fieldname) + if not minetest.registered_nodes[nodename] then + return nil + end + return minetest.registered_nodes[nodename][fieldname] +end + +--lets assume that the rear axis is at object center, so we will use the distance only for front wheels +function automobiles_lib.ground_get_distances(self, radius, axis_distance) + --local mid_axis = (axis_length / 2)/10 + local hip = axis_distance + --minetest.chat_send_all("entre-eixo "..hip) + local pitch = self._pitch --+90 for the calculations + + local yaw = self.object:get_yaw() + local deg_yaw = math.deg(yaw) + local yaw_turns = math.floor(deg_yaw / 360) + deg_yaw = deg_yaw - (yaw_turns * 360) + yaw = math.rad(deg_yaw) + + local pos = self.object:get_pos() + local front_wheel_x = self._front_wheel_xpos / 10 + if math.abs(front_wheel_x) < 0.01 then front_wheel_x = 0.01 end --pra não anular as normals + local rear_wheel_x = self._rear_wheel_xpos / 10 + if math.abs(rear_wheel_x) < 0.01 then rear_wheel_x = 0.01 end --pra não anular as normals + + local wheels = { + {x = -front_wheel_x, y = 0, z = axis_distance}, -- Roda frontal esquerda + {x = front_wheel_x, y = 0, z = axis_distance}, -- Roda frontal direita + {x = -rear_wheel_x, y = 0, z = -0}, -- Roda traseira esquerda + {x = rear_wheel_x, y = 0, z = -0} -- Roda traseira direita + } + + --retornando pitch e roll + local pitch, roll = get_vehicle_pitch_roll(pos, wheels, yaw) + + if not self._last_pitch then self._last_pitch = pitch end + +--[[ +* `minetest.raycast(pos1, pos2, objects, liquids)`: returns `Raycast` + * Creates a `Raycast` object. + * `pos1`: start of the ray + * `pos2`: end of the ray + * `objects`: if false, only nodes will be returned. Default is `true`. + * `liquids`: if false, liquid nodes won't be returned. Default is `false`. +]]-- + + + if 1 then + local pos_y_elevation = 1.6 + local pos_elevation = (math.tan(pitch)*axis_distance) + pos_y_elevation + --core.chat_send_all(dump(pos_elevation)) + local f_x, f_z = automobiles_lib.get_xz_from_hipotenuse(pos.x, pos.z, yaw, axis_distance) + local f_y = pos.y + pos_elevation + local end_pos = {x=f_x, y=f_y, z=f_z} + local initial_pos = vector.new(pos) + initial_pos.y = initial_pos.y + pos_elevation + + local cast = minetest.raycast(initial_pos, end_pos, true, false) + local thing = cast:next() + while thing do + if thing.type == "node" then + local pos = thing.intersection_point + if pos then + local nodename = minetest.get_node(thing.under).name + local drawtype = get_nodedef_field(nodename, "drawtype") + + if drawtype ~= "plantlike" then + self.object:set_acceleration({x=0,y=0,z=0}) + local oldvel = self.object:get_velocity() + self.object:add_velocity(vector.subtract(vector.new(), oldvel)) + pitch = math.rad(0) + break + end + end + end + thing = cast:next() + end + + end + + self._pitch = pitch -- math.rad(90) + self._roll = roll -- math.rad(90) + --core.chat_send_all(dump("pitch "..pitch.." - roll "..roll)) + +end + +function automobiles_lib.get_obstacle(ref_pos, ammount) + ammount = ammount or -3 + --lets clone the table + local retval = {x=ref_pos.x, y=ref_pos.y, z=ref_pos.z} + --minetest.chat_send_all("aa y: " .. dump(retval.y)) + local i_pos = {x=ref_pos.x, y=ref_pos.y + 1, z=ref_pos.z} + --minetest.chat_send_all("bb y: " .. dump(i_pos.y)) + + local y = automobiles_lib.eval_interception(i_pos, {x=i_pos.x, y=ref_pos.y + ammount, z=i_pos.z}) + if y then + retval.y = y + end + + --minetest.chat_send_all("y: " .. dump(ref_pos.y) .. " ye: ".. dump(retval.y)) + return retval +end + +function automobiles_lib.eval_interception(initial_pos, end_pos) + local ret_y = nil + local cast = minetest.raycast(initial_pos, end_pos, true, false) + local thing = cast:next() + while thing do + if thing.type == "node" then + local pos = thing.intersection_point + if pos then + local nodename = minetest.get_node(thing.under).name + local drawtype = get_nodedef_field(nodename, "drawtype") + + if drawtype ~= "plantlike" and drawtype ~= nil then + if initial_pos.y >= pos.y then + ret_y = pos.y + --minetest.chat_send_all("ray intercection: " .. dump(pos.y) .. " -- " .. nodename) + end + break + end + end + end + thing = cast:next() + end + return ret_y +end + +function automobiles_lib.get_node_below(pos, dist) + local node = minetest.get_node(pos) + local pos_below = pos + pos_below.y = pos_below.y - (dist + 0.1) + local node_below = minetest.get_node(pos_below) + return node_below +end + + diff --git a/mods/automobiles_pck/automobiles_lib/init.lua b/mods/automobiles_pck/automobiles_lib/init.lua new file mode 100755 index 0000000..cd373e3 --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/init.lua @@ -0,0 +1,937 @@ +-- Minetest 5.4.1 : automobiles + +automobiles_lib = { + storage = minetest.get_mod_storage() +} + +automobiles_lib.S = nil + +if(minetest.get_translator ~= nil) then + automobiles_lib.S = minetest.get_translator(minetest.get_current_modname()) + +else + automobiles_lib.S = function ( s ) return s end + +end + +local S = automobiles_lib.S +local storage = automobiles_lib.storage + +automobiles_lib.is_minetest = core.get_modpath("player_api") +automobiles_lib.is_mcl = core.get_modpath("mcl_player") +automobiles_lib.is_repixture = core.get_modpath("rp_player") + +automobiles_lib.fuel = {['biofuel:biofuel'] = 1,['biofuel:bottle_fuel'] = 1, + ['biofuel:phial_fuel'] = 0.25, ['biofuel:fuel_can'] = 10, + ['airutils:biofuel'] = 1,} + +automobiles_lib.gravity = 9.8 +automobiles_lib.ideal_step = 0.2 +automobiles_lib.is_creative = minetest.settings:get_bool("creative_mode", false) +automobiles_lib.can_collect_car = minetest.settings:get_bool("collect_automobiles", true) + +automobiles_lib.is_drift_game = false +automobiles_lib.extra_drift = false +if minetest.registered_nodes["dg_mapgen:stone"] then + automobiles_lib.is_drift_game = true + automobiles_lib.extra_drift = true +end + +local load_noob_mode = core.settings:get_bool("noob_mode", false) -- or storage:get_int("noob_mode") +automobiles_lib.noob_mode = false +automobiles_lib.extra_stepheight = 0 +-- 1 == true ---- 2 == false +if load_noob_mode == true then + automobiles_lib.load_noob_mode = true + automobiles_lib.extra_stepheight = 1 +end + +local new_speed_limit = core.settings:get("speed_limit") +automobiles_lib.speed_limit = tonumber(new_speed_limit) or 500 +automobiles_lib.speed_limit = math.floor(automobiles_lib.speed_limit) + +local motorcycle_anim_mode = minetest.settings:get_bool("motorcycle_anim_mode", true) +automobiles_lib.mot_anim_mode = true +if motorcycle_anim_mode == false or automobiles_lib.is_mcl then --disable for mcl too -- TODO + automobiles_lib.mot_anim_mode = false +end + + +--cars colors +automobiles_lib.colors ={ + black='#2b2b2b', + blue='#0063b0', + brown='#8c5922', + cyan='#07B6BC', + dark_green='#567a42', + dark_grey='#6d6d6d', + green='#4ee34c', + grey='#9f9f9f', + magenta='#ff0098', + orange='#ff8b0e', + pink='#ff62c6', + red='#dc1818', + violet='#a437ff', + white='#FFFFFF', + yellow='#ffe400', + -- NEW: Mineclonia colors that were missing (thanks PsyMops) + light_blue = "#258ec9", -- Light blue dye + lime = "#60ac19", -- Lime dye (bright green) + purple = "#6821a0", -- Purple dye (similar to violet) + silver = "#818177", -- Silver/light grey dye +} + +local eye_height_plus_value = 6.5 +local base_eie_height = -4 +if automobiles_lib.is_mcl then + base_eie_height = -5.5 +end + +-- +-- helpers and co. +-- + +function automobiles_lib.get_hipotenuse_value(point1, point2) + return math.sqrt((point1.x - point2.x) ^ 2 + (point1.y - point2.y) ^ 2 + (point1.z - point2.z) ^ 2) +end + +function automobiles_lib.dot(v1,v2) + return (v1.x*v2.x)+(v1.y*v2.y)+(v1.z*v2.z) +end + +function automobiles_lib.sign(n) + return n>=0 and 1 or -1 +end + +function automobiles_lib.minmax(v,m) + return math.min(math.abs(v),m)*minekart.sign(v) +end + +function automobiles_lib.properties_copy(origin_table) + local tablecopy = {} + for k, v in pairs(origin_table) do + tablecopy[k] = v + end + return tablecopy +end + +local function smoke_particle(self, pos) + minetest.add_particle({ + pos = pos, + velocity = {x = 0, y = 0, z = 0}, + acceleration = {x = 0, y = 0, z = 0}, + expirationtime = 0.25, + size = 2.8*(self._vehicle_scale or 1), + collisiondetection = false, + collision_removal = false, + vertical = false, + texture = "automobiles_smoke.png", + }) +end + +function automobiles_lib.add_smoke(self, pos, yaw, rear_wheel_xpos) + local direction = yaw + + --right + local move = rear_wheel_xpos/10 + local smk_pos = vector.new(pos) + smk_pos.x = smk_pos.x + move * math.cos(direction) + smk_pos.z = smk_pos.z + move * math.sin(direction) + + smoke_particle(self, smk_pos) + + --left + direction = direction - math.rad(180) + smk_pos = vector.new(pos) + smk_pos.x = smk_pos.x + move * math.cos(direction) + smk_pos.z = smk_pos.z + move * math.sin(direction) + + smoke_particle(self, smk_pos) +end + +--returns 0 for old, 1 for new +function automobiles_lib.detect_player_api(player) + local player_proterties = player:get_properties() + --local mesh = "character.b3d" + --if player_proterties.mesh == mesh then + if core.get_modpath("player_api") then + local models = player_api.registered_models + local character = models[player_proterties.mesh] + --core.chat_send_all(dump(character)); + if character and character.animations and character.animations.sit then + if character.animations.sit.eye_height then + --core.chat_send_all(dump(character.animations.sit.eye_height)); + if character.animations.sit.eye_height == 0.8 then + --core.chat_send_all("new model"); + return 1 + else + --core.chat_send_all("new height"); + return 2 --strange bug with armor ands skins returning 1.47 + end + else + --core.chat_send_all("old model"); + return 0 + end + end + elseif core.get_modpath("mcl_player") then + return 1 + end + + return 0 +end + +function automobiles_lib.seats_create(self) + if self.object then + local pos = self.object:get_pos() + self._passengers_base = {} + self._passengers = {} + if self._seat_pos then + local max_seats = table.getn(self._seat_pos) + for i=1, max_seats do + self._passengers_base[i] = minetest.add_entity(pos,'automobiles_lib:pivot_mesh') + if self._passengers_base[i] then + if not self._seats_rot then + self._passengers_base[i]:set_attach(self.object,'',self._seat_pos[i],{x=0,y=0,z=0}) + else + self._passengers_base[i]:set_attach(self.object,'',self._seat_pos[i],{x=0,y=self._seats_rot[i],z=0}) + end + end + end + + self.driver_seat = self._passengers_base[1] --sets pilot seat reference + self.passenger_seat = self._passengers_base[2] --sets copilot seat reference + end + end +end + +function automobiles_lib.sit(player) + --set_animation(frame_range, frame_speed, frame_blend, frame_loop) + player:set_animation({x = 81, y = 160},30, 0, true) + if core.get_modpath("emote") then emote.start(player:get_player_name(), "sit") end +end + +-- attach player +function automobiles_lib.attach_driver(self, player) + local name = player:get_player_name() + self.driver_name = name + if not self.driver_seat then return end + + -- attach the driver + player:set_attach(self.driver_seat, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + local eye_y = base_eie_height + if automobiles_lib.detect_player_api(player) == 1 then + eye_y = eye_y + eye_height_plus_value + end + eye_y = eye_y*self._vehicle_scale + + player:set_eye_offset({x = 0, y = eye_y, z = 0}, {x = 0, y = eye_y, z = -30}) + + if automobiles_lib.is_minetest then + player_api.player_attached[name] = true + player_api.set_animation(player, "sit") + elseif automobiles_lib.is_mcl then + mcl_player.player_attached[name] = true + mcl_player.player_set_animation(player, "sit" , 30) + automobiles_lib.sit(player) + end + + -- make the driver sit + minetest.after(1, function() + if player then + --minetest.chat_send_all("okay") + automobiles_lib.sit(player) + --apply_physics_override(player, {speed=0,gravity=0,jump=0}) + end + end) +end + +function automobiles_lib.dettach_driver(self, player) + local name = self.driver_name + + --self._engine_running = false + + -- driver clicked the object => driver gets off the vehicle + self.driver_name = nil + + if self._engine_running then + self._engine_running = false + end + -- sound and animation + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + self.sound_handle = nil + end + + -- detach the player + if player.set_detach then + --automobiles_lib.remove_hud(player) + + --player:set_properties({physical=true}) + player:set_detach() + player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0}) + + if automobiles_lib.is_minetest then + if player_api.player_attached[name] then + player_api.player_attached[name] = nil + end + player_api.set_animation(player, "stand") + elseif automobiles_lib.is_mcl then + if mcl_player.player_attached[name] then + mcl_player.player_attached[name] = nil + end + mcl_player.player_set_animation(player, "stand") + end + + end + self.driver = nil +end + +-- attach passenger +function automobiles_lib.attach_pax(self, player, onside) + local onside = onside or false + local name = player:get_player_name() + + local eye_y = base_eie_height + if automobiles_lib.detect_player_api(player) == 1 then + eye_y = eye_y + eye_height_plus_value + end + eye_y = eye_y*self._vehicle_scale + + if self._passenger == nil then + self._passenger = name + + -- attach the pax + player:set_attach(self.passenger_seat, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + player:set_eye_offset({x = 0, y = eye_y, z = 0}, {x = 0, y = eye_y, z = -30}) + if automobiles_lib.is_minetest then + player_api.player_attached[name] = true + player_api.set_animation(player, "sit") + elseif automobiles_lib.is_mcl then + mcl_player.player_attached[name] = true + mcl_player.player_set_animation(player, "sit" , 30) + automobiles_lib.sit(player) + end + + -- make the pax sit + minetest.after(0.2, function() + if player then + --minetest.chat_send_all("okay") + automobiles_lib.sit(player) + --apply_physics_override(player, {speed=0,gravity=0,jump=0}) + end + end) + else + --randomize the seat + local max_seats = table.getn(self._seat_pos) --driver and front passenger + + t = {} -- new array + for i=1, max_seats do --(the first are for the driver + t[i] = i + end + + for i = 1, #t*2 do + local a = math.random(#t) + local b = math.random(#t) + t[a],t[b] = t[b],t[a] + end + + for k,v in ipairs(t) do + i = t[k] + if self._passengers[i] == nil and i > 2 then + --core.chat_send_all(self.driver_name) + self._passengers[i] = name + player:set_attach(self._passengers_base[i], "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + player:set_eye_offset({x = 0, y = eye_y, z = 0}, {x = 0, y = 3, z = -30}) + if automobiles_lib.is_minetest then + player_api.player_attached[name] = true + player_api.set_animation(player, "sit") + elseif automobiles_lib.is_mcl then + mcl_player.player_attached[name] = true + mcl_player.player_set_animation(player, "sit" , 30) + automobiles_lib.sit(player) + end + + -- make the pax sit + minetest.after(0.2, function() + if player then + --minetest.chat_send_all("okay") + automobiles_lib.sit(player) + --apply_physics_override(player, {speed=0,gravity=0,jump=0}) + end + end) + break + end + end + + end +end + +function automobiles_lib.dettach_pax(self, player) + if not player then return end + local name = player:get_player_name() --self._passenger + + -- passenger clicked the object => driver gets off the vehicle + if self._passenger == name then + self._passenger = nil + self._passengers[2] = nil + else + local max_seats = table.getn(self._seat_pos) + for i = max_seats,1,-1 + do + if self._passengers[i] == name then + self._passengers[i] = nil + break + end + end + end + + -- detach the player + if player then + local pos = player:get_pos() + player:set_detach() + + if automobiles_lib.is_minetest then + if player_api.player_attached[name] then + player_api.player_attached[name] = nil + end + player_api.set_animation(player, "stand") + elseif automobiles_lib.is_mcl then + if mcl_player.player_attached[name] then + mcl_player.player_attached[name] = nil + end + mcl_player.player_set_animation(player, "stand") + end + + player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0}) + --remove_physics_override(player, {speed=1,gravity=1,jump=1}) + end +end + +function automobiles_lib.get_gauge_angle(value, initial_angle) + initial_angle = initial_angle or 90 + local angle = value * 18 + angle = angle - initial_angle + angle = angle * -1 + return angle +end + +function automobiles_lib.setText(self, vehicle_name) + local properties = self.object:get_properties() + local formatted = "" + if self.hp_max then + formatted = S(" Current hp: ") .. string.format( + "%.2f", self.hp_max + ) + end + if properties then + properties.infotext = S("Nice @1 of @2.@3", vehicle_name, self.owner, formatted) + self.object:set_properties(properties) + end +end + +function automobiles_lib.get_xz_from_hipotenuse(orig_x, orig_z, yaw, distance) + --cara, o minetest é bizarro, ele considera o eixo no sentido ANTI-HORÁRIO... Então pra equação funcionar, subtrair o angulo de 360 antes + yaw = math.rad(360) - yaw + local z = (math.cos(yaw)*distance) + orig_z + local x = (math.sin(yaw)*distance) + orig_x + return x, z +end + +function automobiles_lib.remove_light(self) + if self._light_old_pos then + --force the remotion of the last light + minetest.add_node(self._light_old_pos, {name="air"}) + self._light_old_pos = nil + end +end + +function automobiles_lib.swap_node(self, pos) + local target_pos = pos + local have_air = false + local node = nil + local count = 0 + while have_air == false and count <= 3 do + node = minetest.get_node(target_pos) + if node.name == "air" then + have_air = true + break + end + count = count + 1 + target_pos.y = target_pos.y + 1 + end + + if have_air then + minetest.set_node(target_pos, {name='automobiles_lib:light'}) + automobiles_lib.remove_light(self) + self._light_old_pos = target_pos + --remove after one second + --[[minetest.after(1,function(target_pos) + local node = minetest.get_node_or_nil(target_pos) + if node and node.name == "automobiles_lib:light" then + minetest.swap_node(target_pos, {name="air"}) + end + end, target_pos)]]-- + + return true + end + return false +end + +function automobiles_lib.put_light(self) + local pos = self.object:get_pos() + pos.y = pos.y + 1 + local yaw = self.object:get_yaw() + local lx, lz = automobiles_lib.get_xz_from_hipotenuse(pos.x, pos.z, yaw, 10) + local light_pos = {x=lx, y=pos.y, z=lz} + + local cast = minetest.raycast(pos, light_pos, false, false) + local thing = cast:next() + local was_set = false + while thing do + if thing.type == "node" then + local ipos = thing.intersection_point + if ipos then + was_set = automobiles_lib.swap_node(self, ipos) + end + end + thing = cast:next() + end + if was_set == false then + local n = minetest.get_node_or_nil(light_pos) + if n and n.name == 'air' then + automobiles_lib.swap_node(self, light_pos) + end + end + + + --[[local n = minetest.get_node_or_nil(light_pos) + --minetest.chat_send_player(name, n.name) + if n and n.name == 'air' then + minetest.set_node(pos, {name='automobiles_lib:light'}) + --local timer = minetest.get_node_timer(pos) + --timer:set(10, 0) + minetest.after(0.3,function(pos) + local node = minetest.get_node_or_nil(pos) + if node and node.name == "automobiles_lib:light" then + minetest.swap_node(pos, {name="air"}) + end + end, pos) + end]]-- + +end + +function automobiles_lib.seats_destroy(self) + local max_seats = table.getn(self._passengers_base) + for i=1, max_seats do + if self._passengers_base[i] then self._passengers_base[i]:remove() end + end +end + +function automobiles_lib.destroy(self, puncher) + automobiles_lib.remove_light(self) + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + self.sound_handle = nil + end + + if self.driver_name then + -- detach the driver first (puncher must be driver) + if puncher then + puncher:set_detach() + puncher:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + + if automobiles_lib.is_minetest then + if player_api.player_attached[self.driver_name] then + player_api.player_attached[self.driver_name] = nil + end + player_api.set_animation(player, "stand") + elseif automobiles_lib.is_mcl then + if mcl_player.player_attached[self.driver_name] then + mcl_player.player_attached[self.driver_name] = nil + end + mcl_player.player_set_animation(player, "stand") + end + end + self.driver_name = nil + end + + local pos = self.object:get_pos() + + if self.front_suspension then self.front_suspension:remove() end + if self.lf_wheel then self.lf_wheel:remove() end + if self.rf_wheel then self.rf_wheel:remove() end + if self.rear_suspension then self.rear_suspension:remove() end + if self.lr_wheel then self.lr_wheel:remove() end + if self.rr_wheel then self.rr_wheel:remove() end + if self.steering then self.steering:remove() end + if self.steering_axis then self.steering_axis:remove() end + if self.driver_seat then self.driver_seat:remove() end + if self.passenger_seat then self.passenger_seat:remove() end + if self.fuel_gauge then self.fuel_gauge:remove() end + if self.lights then self.lights:remove() end + if self.r_lights then self.r_lights:remove() end + if self.reverse_lights then self.reverse_lights:remove() end + if self.turn_l_light then self.turn_l_light:remove() end + if self.turn_r_light then self.turn_r_light:remove() end + if self.rag then self.rag:remove() end --for buggy + if self.back_seat then self.back_seat:remove() end --for catrelle + if self.instruments then self.instruments:remove() end --for delorean + if self.normal_kit then self.normal_kit:remove() end + if self.rag_rect then self.rag_rect:remove() end --for roadster + + + automobiles_lib.seats_destroy(self) + automobiles_lib.destroy_inventory(self) + + pos.y=pos.y+2 + + if automobiles_lib.can_collect_car == false then + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:engine') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},'automobiles_lib:wheel') + else + local lua_ent = self.object:get_luaentity() + local staticdata = lua_ent:get_staticdata(self) + local obj_name = lua_ent.name + local player = puncher + + local stack = ItemStack(obj_name) + local stack_meta = stack:get_meta() + stack_meta:set_string("staticdata", staticdata) + + if player then + local inv = player:get_inventory() + if inv then + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5}, stack) + end + end + else + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5}, stack) + end + end + + self.object:remove() +end + +function automobiles_lib.engine_set_sound_and_animation(self, _longit_speed) + --minetest.chat_send_all('test1 ' .. dump(self._engine_running) ) + local abs_curr_long_speed = math.abs(self._longit_speed) + local abs_long_speed = math.abs(_longit_speed) + local scale = self._vehicle_power_scale + local range_spacing = 0.01 + if self.sound_handle then + if (abs_curr_long_speed*scale > (abs_long_speed + range_spacing)*scale) + or ((abs_curr_long_speed + range_spacing)*scale < abs_long_speed*scale) then + --minetest.chat_send_all('test2') + automobiles_lib.engineSoundPlay(self) + end + end +end + +function automobiles_lib.engineSoundPlay(self) + --sound + if self.sound_handle then minetest.sound_stop(self.sound_handle) end + if self.object then + local base_pitch = 1 + if self._base_pitch then base_pitch = self._base_pitch end + + local divisor = 6 --3 states, so 6 to make it more smooth + local multiplier = self._transmission_state or 1 + local snd_pitch = base_pitch + ((base_pitch/divisor)*multiplier) + ((self._longit_speed/10)/2) + if self._transmission_state == 1 then + snd_pitch = base_pitch + (self._longit_speed/10) + end + + self.sound_handle = minetest.sound_play({name = self._engine_sound}, + {object = self.object, gain = 4, + pitch = snd_pitch, + max_hear_distance = 15, + loop = true,}) + end +end + +minetest.register_node("automobiles_lib:light", { + drawtype = "airlike", + --tile_images = {"automobiles_light.png"}, + inventory_image = minetest.inventorycube("automobiles_light.png"), + paramtype = "light", + walkable = false, + is_ground_content = true, + light_propagates = true, + sunlight_propagates = true, + light_source = 14, + selection_box = { + type = "fixed", + fixed = {0, 0, 0, 0, 0, 0}, + }, +}) + +function automobiles_lib.set_paint(self, puncher, itmstck) + local is_admin = false + is_admin = minetest.check_player_privs(puncher, {server=true}) + if not (self.owner == puncher:get_player_name() or is_admin == true) then + return false + end + + local item_name = "" + if itmstck then item_name = itmstck:get_name() end + + if item_name == "bike:painter" then + --painting with bike painter + local meta = itmstck:get_meta() + local colstr = meta:get_string("paint_color") + automobiles_lib.paint(self, colstr) + return true + else + --painting with dyes + local split = string.split(item_name, ":") + local color, indx, _ + if split[1] then _,indx = split[1]:find('dye') end + --minetest.chat_send_all("item " .. dump(item_name)) + if indx then + --[[for clr,_ in pairs(automobiles_lib.colors) do + local _,x = split[2]:find(clr) + if x then color = clr end + end]]-- + --lets paint!!!! + local color = split[2] --(item_name:sub(indx+1)):gsub(":", "") + local colstr = automobiles_lib.colors[color] + --minetest.chat_send_all(color ..' '.. dump(colstr)) + if colstr then + automobiles_lib.paint(self, colstr) + itmstck:set_count(itmstck:get_count()-1) + puncher:set_wielded_item(itmstck) + return true + end + -- end painting + end + end + return false +end + +--painting +function automobiles_lib.paint(self, colstr, target_texture, second_painting_texture) + target_texture = target_texture or "automobiles_painting.png" + second_painting_texture = second_painting_texture or "automobiles_painting2.png" + if colstr then + self._color = colstr + local l_textures = self.initial_properties.textures + for _, texture in ipairs(l_textures) do + local indx = texture:find(target_texture) + if indx then + l_textures[_] = target_texture.."^[multiply:".. colstr + end + indx = texture:find(second_painting_texture) + if indx then + l_textures[_] = second_painting_texture.."^[multiply:".. colstr + end + end + self.object:set_properties({textures=l_textures}) + end +end + +function automobiles_lib.paint_with_mask(self, colstr, mask_colstr, target_texture, mask_texture) + --"("..steampunk_blimp.canvas_texture.."^[mask:steampunk_blimp_rotor_mask2.png)^(default_wood.png^[mask:steampunk_blimp_rotor_mask.png)" + + target_texture = target_texture or "automobiles_painting.png" + if colstr then + self._color = colstr + self._det_color = mask_colstr + local l_textures = self.initial_properties.textures + for _, texture in ipairs(l_textures) do + local indx = texture:find(target_texture) + if indx then + --"("..target_texture.."^[mask:"..mask_texture..")" + l_textures[_] = "("..target_texture.."^[multiply:".. colstr..")^("..target_texture.."^[multiply:".. mask_colstr.."^[mask:"..mask_texture..")" + end + end + self.object:set_properties({textures=l_textures}) + end +end + +-- very basic transmission emulation for the car +function automobiles_lib.get_transmission_state(self, curr_speed, max_speed) + local retVal = 1 + max_speed = max_speed or 100 + max_speed = max_speed*self._vehicle_scale + curr_speed = curr_speed*self._vehicle_scale + if curr_speed >= (max_speed/4) then retVal = 2 end + if curr_speed >= (max_speed/2) then retVal = 3 end + return retVal +end + +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "physics_lib.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "custom_physics.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "control.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "painter.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "inventory_management.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "formspecs.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "entities.lua") + +-- engine +minetest.register_craftitem("automobiles_lib:engine",{ + description = S("Car Engine"), + inventory_image = "automobiles_engine.png", +}) + +-- engine +minetest.register_craftitem("automobiles_lib:wheel",{ + description = S("Car Wheel"), + inventory_image = "automobiles_wheel_icon.png", +}) + +if minetest.get_modpath("default") then + minetest.register_craft({ + output = "automobiles_lib:engine", + recipe = { + {"default:steel_ingot","default:steel_ingot","default:steel_ingot"}, + {"default:steelblock","default:mese_block", "default:steelblock"}, + } + }) + minetest.register_craft({ + output = "automobiles_lib:wheel", + recipe = { + {"default:tin_ingot", "default:steel_ingot", "default:tin_ingot"}, + {"default:steel_ingot","default:steelblock", "default:steel_ingot"}, + {"default:tin_ingot", "default:steel_ingot", "default:tin_ingot"}, + } + }) +end + +minetest.register_entity('automobiles_lib:wheel',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_wheel.b3d", + backface_culling = false, + textures = {"automobiles_black.png", "automobiles_metal.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_privilege("valet_parking", { + description = S("Gives a valet parking priv for a player"), + give_to_singleplayer = true +}) + +minetest.register_chatcommand("transfer_vehicle", { + params = "", + description = S("Transfer the property of a vehicle to another player"), + privs = {interact=true}, + func = function(name, param) + local player = minetest.get_player_by_name(name) + local target_player = minetest.get_player_by_name(param) + local attached_to = player:get_attach() + + if attached_to ~= nil then + if target_player ~= nil then + local seat = attached_to:get_attach() + if seat ~= nil then + local entity = seat:get_luaentity() + if entity then + if entity.owner == name or minetest.check_player_privs(name, {protection_bypass=true}) then + entity.owner = param + minetest.chat_send_player(name,core.colorize('#00ff00', S(" >>> This vehicle now is property of: ")..param)) + automobiles_lib.setText(entity, "vehicle") + else + minetest.chat_send_player(name,core.colorize('#ff0000', S(" >>> only the owner or moderators can transfer this vehicle"))) + end + end + end + else + minetest.chat_send_player(name,core.colorize('#ff0000', S(" >>> the target player must be logged in"))) + end + else + minetest.chat_send_player(name,core.colorize('#ff0000', S(" >>> you are not inside a vehicle to perform the command"))) + end + end +}) + +--[[minetest.register_chatcommand("noobfy_the_vehicles", { + params = "", + description = S("Enable/disable the NOOB mode for the vehicles"), + privs = {server=true}, + func = function(name, param) + local command = param + + if command == "false" then + automobiles_lib.noob_mode = false + automobiles_lib.extra_stepheight = 0 + minetest.chat_send_player(name, S(">>> Noob mode is disabled - A restart is required to changes take full effect")) + else + automobiles_lib.noob_mode = true + automobiles_lib.extra_stepheight = 1 + minetest.chat_send_player(name, S(">>> Noob mode is enabled - A restart is required to changes take full effect")) + end + local save = 2 + if automobiles_lib.noob_mode == true then save = 1 end + storage:set_int("noob_mode", save) + end, +})]]-- + +-- Give to new player +if automobiles_lib.is_drift_game == true then + minetest.register_on_joinplayer(function(player) + local inv = player:get_inventory() + local car = "automobiles_beetle:beetle" + if core.get_modpath("automobiles_beetle") and not inv:contains_item("main", car) then inv:add_item("main", car) end + car = "automobiles_buggy:buggy" + if core.get_modpath("automobiles_buggy") and not inv:contains_item("main", car) then inv:add_item("main", car) end + car = "automobiles_catrelle:catrelle_4f" + if core.get_modpath("automobiles_catrelle") and not inv:contains_item("main", car) then inv:add_item("main", car) end + car = "automobiles_coupe:coupe" + if core.get_modpath("automobiles_coupe") and not inv:contains_item("main", car) then inv:add_item("main", car) end + car = "automobiles_delorean:delorean" + if core.get_modpath("automobiles_delorean") and not inv:contains_item("main", car) then inv:add_item("main", car) end + car = "automobiles_delorean:time_machine" + if core.get_modpath("automobiles_delorean") and not inv:contains_item("main", car) then inv:add_item("main", car) end + car = "automobiles_trans_am:trans_am" + if core.get_modpath("automobiles_trans_am") and not inv:contains_item("main", car) then inv:add_item("main", car) end + car = "automobiles_beetle:beetle_conv" + if core.get_modpath("automobiles_beetle") and not inv:contains_item("main", car) then inv:add_item("main", car) end + end) +end + +local old_entities = { + "automobiles_buggy:pivot_mesh", + "automobiles_buggy:pointer", + "automobiles_catrelle:pivot_mesh", + "automobiles_catrelle:pointer", + "automobiles_catrelle:catrelle_tl", + "automobiles_coupe:pivot_mesh", + "automobiles_coupe:pointer", + "automobiles_delorean:pivot_mesh", + "automobiles_delorean:pointer", + "automobiles_roadster:pivot_mesh", + "automobiles_trans_am:pivot_mesh", + "automobiles_trans_am:pointer", + "automobiles_buggy:steering", + "automobiles_vespa:pivot_mesh", + "automobiles_motorcycle:pivot_mesh", +} +for _,entity_name in ipairs(old_entities) do + minetest.register_entity(":"..entity_name, { + on_activate = function(self, staticdata) + self.object:remove() + end, + }) +end diff --git a/mods/automobiles_pck/automobiles_lib/inventory_management.lua b/mods/automobiles_pck/automobiles_lib/inventory_management.lua new file mode 100644 index 0000000..27f14b3 --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/inventory_management.lua @@ -0,0 +1,208 @@ +local storage = automobiles_lib.storage +automobiles_lib.modname = core.get_current_modname() + +--function to format formspec for mineclone. In case of minetest, just returns an empty string +local function get_itemslot_bg(a, b, c, d) + if automobiles_lib.is_mcl then + if mcl_formspec then + return mcl_formspec.get_itemslot_bg(a,b,c,d) + end + end + return "" +end + +local function get_formspec_by_size(self, size) + local background = "" + local hotbar = "" + local is_minetest_game = automobiles_lib.is_minetest or false + if is_minetest_game then + background = background .. default.gui_bg .. default.gui_bg_img .. default.gui_slots + hotbar = default.get_hotbar_bg(0,4.85) + end + local default_inventory_formspecs = { + ["2"]="size[8,6]".. background .. + "list[detached:" .. self._inv_id .. ";main;3.0,0;3,1;]" .. get_itemslot_bg(3.0, 0, 2, 1) .. + "list[current_player;main;0,2;8,4;]" .. get_itemslot_bg(0, 2, 8, 4) .. + "listring[]", + + ["3"]="size[8,6]".. background .. + "list[detached:" .. self._inv_id .. ";main;2.5,0;3,1;]" .. get_itemslot_bg(2.5, 0, 3, 1) .. + "list[current_player;main;0,2;8,4;]" .. get_itemslot_bg(0, 2, 8, 4) .. + "listring[]", + + ["4"]="size[8,6]".. background .. + "list[detached:" .. self._inv_id .. ";main;2,0;4,1;]" .. get_itemslot_bg(2.0, 0, 4, 1) .. + "list[current_player;main;0,2;8,4;]" .. get_itemslot_bg(0, 2, 8, 4) .. + "listring[]", + + ["6"]="size[8,6]".. background .. + "list[detached:" .. self._inv_id .. ";main;1,0;6,1;]".. get_itemslot_bg(1.0, 0, 6, 1) .. + "list[current_player;main;0,2;8,4;]" .. get_itemslot_bg(0, 2, 8, 4) .. + "listring[]", + + ["8"]="size[8,6]".. background .. + "list[detached:" .. self._inv_id .. ";main;0,0;8,1;]".. get_itemslot_bg(0, 0, 8, 1) .. + "list[current_player;main;0,2;8,4;]" .. get_itemslot_bg(0, 2, 8, 4) .. + "listring[]", + + ["12"]="size[8,7]".. background .. + "list[detached:" .. self._inv_id .. ";main;1,0;6,2;]".. get_itemslot_bg(1, 0, 6, 2) .. + "list[current_player;main;0,3;8,4;]" .. get_itemslot_bg(0, 3, 8, 4) .. + "listring[]", + + ["16"]="size[8,7]".. background .. + "list[detached:" .. self._inv_id .. ";main;0,0;8,2;]".. get_itemslot_bg(0, 0, 8, 2) .. + "list[current_player;main;0,3;8,4;]" .. get_itemslot_bg(0, 3, 8, 4) .. + "listring[]", + + ["24"]="size[8,8]".. background .. + "list[detached:" .. self._inv_id .. ";main;0,0;8,3;]".. get_itemslot_bg(0, 0, 8, 3) .. + "list[current_player;main;0,4;8,4;]" .. get_itemslot_bg(0, 4, 8, 4) .. + "listring[]", + + ["32"]="size[8,9]".. background .. + "list[detached:" .. self._inv_id .. ";main;0,0.3;8,4;]".. get_itemslot_bg(0, 0.3, 8, 4) .. + "list[current_player;main;0,5;8,4;]".. get_itemslot_bg(0, 5, 8, 4) .. + "listring[]" .. + hotbar, + + ["50"]="size[10,10]".. background .. + "list[detached:" .. self._inv_id .. ";main;0,0;10,5;]".. get_itemslot_bg(0, 0, 10, 5) .. + "list[current_player;main;1,6;8,4;]" .. get_itemslot_bg(1, 6, 8, 4) .. + "listring[]", + } + + local formspec = default_inventory_formspecs[tostring(size)] + return formspec +end + +local function inventory_id(maker_name) + local id= automobiles_lib.modname .. "_" .. maker_name .. "_" + for i=0,5 do + id=id..(math.random(0,9)) + end + return id +end + +function automobiles_lib.load_inventory(self) + if self._inv then + local inv_content = minetest.deserialize(storage:get_string(self._inv_id)) + if inv_content then + self._inv:set_list("main", inv_content) + end + end +end + +function automobiles_lib.save_inventory(self) + if self._inv then + local inv_content = self._inv:get_list("main") + if inv_content then + for k, v in pairs(inv_content) do + inv_content[k] = v:to_string() + end + + local inv_content = minetest.serialize(inv_content) + storage:set_string(self._inv_id, inv_content) + end + end +end + +function automobiles_lib.remove_inventory(self) + local inventory = automobiles_lib.get_inventory(self) + if inventory then + if inventory:is_empty("main") then + return minetest.remove_detached_inventory(self._inv_id) + else + local inv_content = inventory:get_list("main") + if inv_content then + local pos = self.object:get_pos() + for k, v in pairs(inv_content) do + local count = 0 + for i = 0,v:get_count()-1,1 + do + minetest.add_item({x=pos.x+math.random()-0.5,y=pos.y,z=pos.z+math.random()-0.5},v:get_name()) + count = count + 1 + if count >= 5 then break end + end + end + end + return minetest.remove_detached_inventory(self._inv_id) + end + end + return false +end + +function automobiles_lib.destroy_inventory(self) + automobiles_lib.remove_inventory(self) + storage:set_string(self._inv_id, nil) +end + +--show inventory form to user +function automobiles_lib.show_vehicle_trunk_formspec(self, player, size) + if size then + local form = get_formspec_by_size(self, size) + if form then + minetest.show_formspec(player:get_player_name(), automobiles_lib.modname .. ":inventory", + form + ) + end + end +end + +function automobiles_lib.create_inventory(self, size, owner) + owner = owner or "" + if owner == "" then owner = self.owner end + if owner ~= nil and owner ~= "" then + if self._inv_id == "" then + self._inv_id = inventory_id(owner) + end + local vehicle_inv = minetest.create_detached_inventory(self._inv_id, { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + return count -- allow moving + end, + + allow_put = function(inv, listname, index, stack, player) + return stack:get_count() -- allow putting + end, + + allow_take = function(inv, listname, index, stack, player) + return stack:get_count() -- allow taking + end, + on_put = function(inv, toList, toIndex, stack, player) + automobiles_lib.save_inventory(self) + end, + on_take = function(inv, toList, toIndex, stack, player) + automobiles_lib.save_inventory(self) + end, + on_move = function(inv, from_list, from_index, to_list, to_index, count, player) + automobiles_lib.save_inventory(self) + end, + }) + if size >= 8 then + if vehicle_inv:set_size("main", size) then + vehicle_inv:set_width("main", 8) + end + else + vehicle_inv:set_size("main", size) + end + self._inv = vehicle_inv + automobiles_lib.load_inventory(self) + end +end + +function automobiles_lib.get_inventory(self) + if self._inv then + return minetest.get_inventory({type="detached", name=self._inv_id}) + end + return nil +end + +function automobiles_lib.list_inventory(self) + local inventory = automobiles_lib.get_inventory(self) + if inventory then + local list = inventory.get_list("main") + + minetest.chat_send_all(dump(list)) + end +end + diff --git a/mods/automobiles_pck/automobiles_lib/locale/automobiles_lib.de.tr b/mods/automobiles_pck/automobiles_lib/locale/automobiles_lib.de.tr new file mode 100644 index 0000000..de54b3a --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/locale/automobiles_lib.de.tr @@ -0,0 +1,25 @@ +# textdomain: automobiles_lib +### init.lua ### +Go Offboard=Aussteigen +Lights=Lichter +Direction by mouse=Lenken mit Maus + Current hp: = Aktuelle Lp: +Nice @1 of @2.@3=Schöne(r) @1 von @2.@3 +Car Engine=Motor +Car Wheel=Autoreifen +Gives a valet parking priv for a player=Gibt einen Parkservice für einen Spieler +Transfer the property of a vehicle to another player=Überträgt das Eigentum des Fahrzeuges an einem anderen Spieler + >>> This vehicle now is property of: = >>> Dieses Fahrzeug ist nun Eigentum von: + >>> only the owner or moderators can transfer this vehicle= >>> Nur der Eigentümer oder Moderator kann das Eigentum des Fahrzeuges übertragen + >>> the target player must be logged in= >>> der Zielspieler muß dafür eingeloggt sein. + >>> you are not inside a vehicle to perform the command= >>> du sitzt in keinem Fahrzeug um das Kommando auszuführen +Enable/disable the NOOB mode for the vehicles=Ein/Ausschalten des NOOB Moduses für die Fahrzeuge +>>> Noob mode is disabled - A restart is required to changes take full effect= >>> Noob Modus ist ausgeschalten - Ein Neustart für die Änderungen ist erforderlich +>>> Noob mode is enabled - A restart is required to changes take full effect= >>> Noob Modus ist eingeschalten - Ein Neustart für die Änderungen ist erforderlich +Preview=Vorschau +Set Hex=Gib Hexzahl +Set Color=Gib Farbe +Cancel=Abbrechen +### painter.lua ### +Automobiles Painter= Automobil Pinsel +Only the owner can paint this entity.=Nur der Eigentümer kann dieses Objekt einfärben. diff --git a/mods/automobiles_pck/automobiles_lib/locale/automobiles_lib.eo.tr b/mods/automobiles_pck/automobiles_lib/locale/automobiles_lib.eo.tr new file mode 100644 index 0000000..218c20b --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/locale/automobiles_lib.eo.tr @@ -0,0 +1,25 @@ +# textdomain: automobiles_lib +### init.lua ### +Go Offboard= +Lights= +Direction by mouse= + Current hp: = +Nice @1 of @2.@3= +Car Engine=Aŭta Motoro +Car Wheel=Aŭta Rado +Gives a valet parking priv for a player= +Transfer the property of a vehicle to another player= + >>> This vehicle now is property of: = + >>> only the owner or moderators can transfer this vehicle= + >>> the target player must be logged in= + >>> you are not inside a vehicle to perform the command= +Enable/disable the NOOB mode for the vehicles= +>>> Noob mode is disabled - A restart is required to changes take full effect= +>>> Noob mode is enabled - A restart is required to changes take full effect= +Preview= +Set Hex= +Set Color= +Cancel= +### painter.lua ### +Automobiles Painter=Aŭta Pentrilo +Only the owner can paint this entity.= diff --git a/mods/automobiles_pck/automobiles_lib/locale/template.txt b/mods/automobiles_pck/automobiles_lib/locale/template.txt new file mode 100644 index 0000000..995b522 --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/locale/template.txt @@ -0,0 +1,25 @@ +# textdomain: automobiles_lib +### init.lua ### +Go Offboard= +Lights= +Direction by mouse= + Current hp: = +Nice @1 of @2.@3= +Car Engine= +Car Wheel= +Gives a valet parking priv for a player= +Transfer the property of a vehicle to another player= + >>> This vehicle now is property of: = + >>> only the owner or moderators can transfer this vehicle= + >>> the target player must be logged in= + >>> you are not inside a vehicle to perform the command= +Enable/disable the NOOB mode for the vehicles= +>>> Noob mode is disabled - A restart is required to changes take full effect= +>>> Noob mode is enabled - A restart is required to changes take full effect= +Preview= +Set Hex= +Set Color= +Cancel= +### painter.lua ### +Automobiles Painter= +Only the owner can paint this entity.= diff --git a/mods/automobiles_pck/automobiles_lib/mod.conf b/mods/automobiles_pck/automobiles_lib/mod.conf new file mode 100755 index 0000000..1eaca23 --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/mod.conf @@ -0,0 +1,3 @@ +name = automobiles_lib +depends= +optional_depends=player_api, mcl_formspec, mcl_player, emote, biofuel, dg_mapgen diff --git a/mods/automobiles_pck/automobiles_lib/models/automobiles_pivot_mesh.b3d b/mods/automobiles_pck/automobiles_lib/models/automobiles_pivot_mesh.b3d new file mode 100755 index 0000000..ccf1db3 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/models/automobiles_pivot_mesh.b3d differ diff --git a/mods/automobiles_pck/automobiles_lib/models/automobiles_pointer.b3d b/mods/automobiles_pck/automobiles_lib/models/automobiles_pointer.b3d new file mode 100755 index 0000000..c692261 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/models/automobiles_pointer.b3d differ diff --git a/mods/automobiles_pck/automobiles_lib/models/automobiles_wheel.b3d b/mods/automobiles_pck/automobiles_lib/models/automobiles_wheel.b3d new file mode 100755 index 0000000..de0283d Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/models/automobiles_wheel.b3d differ diff --git a/mods/automobiles_pck/automobiles_lib/painter.lua b/mods/automobiles_pck/automobiles_lib/painter.lua new file mode 100644 index 0000000..c5048d2 --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/painter.lua @@ -0,0 +1,181 @@ +--[[ +Copyright (C) 2022 Alexsandro Percy +Copyright (C) 2018 Hume2 + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +]]-- + +local S = automobiles_lib.S + +local function is_hex(color) + if not color or color:len() ~= 7 then return end + return color:match("#%x%x%x%x%x%x") +end + +-- hex translation +local function hex_to_rgb(hex_value) + hex_value = hex_value:gsub("#","") + local rgb = { + r = tonumber("0x"..hex_value:sub(1,2)), + g = tonumber("0x"..hex_value:sub(3,4)), + b = tonumber("0x"..hex_value:sub(5,6)), + } + return rgb +end + +local function rgb_to_hex(rgb) + return string.format("#%02X%02X%02X", rgb.r, rgb.g, rgb.b) +end + +-- Painter formspec +local function painter_form(player, rgb) + local color = rgb_to_hex(rgb) + minetest.show_formspec(player:get_player_name(), "automobiles_lib:painter", + -- Init formspec + "formspec_version[3]" .. -- Minetest 5.2+ + "size[5.6,5.2;true]" .. + "position[0.5,0.45]" .. + + -- Color preview + "image[0.2,0.2;2,2;automobiles_painting.png^[colorize:" .. color .. ":255]" .. + "label[0.3,1.2;" .. S("Preview") .. "]" .. + + -- Hex field + "field_close_on_enter[hex;false]" .. + "field[2.4,0.2;3,0.8;hex;;" .. color .. "]" .. + "button[2.4,1;3,0.8;set_hex;" .. S("Set Hex") .. "]" .. + + -- RGB sliders + "container[0,2.4]" .. + "scrollbaroptions[min=0;max=255;smallstep=20]" .. + + "box[0.4,0;4.77,0.38;red]" .. + "label[0.2,0.2;-]" .. + "scrollbar[0.4,0;4.8,0.4;horizontal;r;" .. rgb.r .."]" .. + "label[5.2,0.2;+]" .. + + "box[0.4,0.6;4.77,0.38;green]" .. + "label[0.2,0.8;-]" .. + "scrollbar[0.4,0.6;4.8,0.4;horizontal;g;" .. rgb.g .."]" .. + "label[5.2,0.8;+]" .. + + "box[0.4,1.2;4.77,0.38;blue]" .. + "label[0.2,1.4;-]" .. + "scrollbar[0.4,1.2;4.8,0.4;horizontal;b;" .. rgb.b .. "]" .. + "label[5.2,1.4;+]" .. + + "container_end[]" .. + + -- Bottom buttons + "button_exit[0.2,4.2;2.8,0.8;set_color;" .. S("Set Color") .. "]" .. + "button_exit[3.2,4.2;2.2,0.8;quit;" .. S("Cancel") .. "]" + ) +end + +local automobiles_being_painted = {} +local formspec_timers = {} + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "automobiles_lib:painter" then + if formspec_timers[player] then + formspec_timers[player]:cancel() + formspec_timers[player] = nil + end + + local function parse_scrollbar_field(value) + value = value or "" + local num = math.floor(tonumber((value:gsub(".*:", ""))) or 0) + if num > 255 or num < 0 then num = 0 end + return num + end + + local rgb = { + r = parse_scrollbar_field(fields.r), + g = parse_scrollbar_field(fields.g), + b = parse_scrollbar_field(fields.b), + } + + if fields.set_hex or fields.key_enter then + if is_hex(fields.hex) then + painter_form(player, hex_to_rgb(fields.hex)) + else + painter_form(player, rgb) + end + elseif fields.set_color then + local object_ref = automobiles_being_painted[player] + if object_ref and object_ref:get_pos() then + local luaentity = object_ref:get_luaentity() + luaentity:_change_color(rgb_to_hex(rgb)) + end + automobiles_being_painted[player] = nil + elseif fields.r and fields.r:find("^CHG") or + fields.g and fields.g:find("^CHG") or + fields.b and fields.b:find("^CHG") then -- Has a scrollbar changed? + formspec_timers[player] = minetest.after(0.2, function(itemstack, name) + local player = minetest.get_player_by_name(name) + if player then + painter_form(player, rgb) + end + formspec_timers[player] = nil + end, itemstack, player:get_player_name()) + end + + if fields.quit then + automobiles_being_painted[player] = nil + end + return true + end +end) + + +-- Make the actual thingy +minetest.register_tool("automobiles_lib:painter", { + description = S("Automobiles Painter"), + inventory_image = "automobiles_painter.png", + wield_scale = {x = 2, y = 2, z = 1}, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type == "object" and not pointed_thing.ref:is_player() then + local luaentity = pointed_thing.ref:get_luaentity() + if luaentity and type(luaentity._change_color) == "function" then + local player_name = user:get_player_name() + if not luaentity.owner or luaentity.owner == player_name then + automobiles_being_painted[user] = pointed_thing.ref + local color = luaentity._color + local rgb = is_hex(color) and hex_to_rgb(color) or {r = 0, g = 0, b = 0} + painter_form(user, rgb) + else + minetest.chat_send_player(player_name, S("Only the owner can paint this entity.")) + end + end + end + end +}) + +minetest.register_on_leaveplayer(function(player, timed_out) + automobiles_being_painted[player] = nil +end) + +minetest.register_craft({ + output = "automobiles_lib:painter", + recipe = { + {"", "default:steel_ingot", ""}, + {"dye:red", "dye:green", "dye:blue"}, + {"", "default:steel_ingot", ""}, + }, +}) diff --git a/mods/automobiles_pck/automobiles_lib/physics_lib.lua b/mods/automobiles_pck/automobiles_lib/physics_lib.lua new file mode 100755 index 0000000..abc1ad8 --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/physics_lib.lua @@ -0,0 +1,175 @@ +local abs = math.abs +local pi = math.pi +local floor = math.floor +local ceil = math.ceil +local random = math.random +local sqrt = math.sqrt +local max = math.max +local min = math.min +local tan = math.tan +local pow = math.pow + +local sign = function(x) + return (x<0) and -1 or 1 +end + +function automobiles_lib.rot_to_dir(rot) -- keep rot within <-pi/2,pi/2> + local dir = minetest.yaw_to_dir(rot.y) + dir.y = dir.y+tan(rot.x)*vector.length(dir) + return vector.normalize(dir) +end + +function automobiles_lib.dir_to_rot(v,rot) + rot = rot or {x=0,y=0,z=0} + return {x = (v.x==0 and v.y==0 and v.z==0) and rot.x or math.atan2(v.y,vector.length({x=v.x,y=0,z=v.z})), + y = (v.x==0 and v.z==0) and rot.y or minetest.dir_to_yaw(v), + z=rot.z} +end + +function automobiles_lib.pos_shift(pos,vec) -- vec components can be omitted e.g. vec={y=1} + vec.x=vec.x or 0 + vec.y=vec.y or 0 + vec.z=vec.z or 0 + return {x=pos.x+vec.x, + y=pos.y+vec.y, + z=pos.z+vec.z} +end + +function automobiles_lib.get_stand_pos(thing) -- thing can be luaentity or objectref. + local pos = {} + local colbox = {} + if type(thing) == 'table' then + pos = thing.object:get_pos() + colbox = thing.object:get_properties().collisionbox + elseif type(thing) == 'userdata' then + pos = thing:get_pos() + colbox = thing:get_properties().collisionbox + else + return false + end + return automobiles_lib.pos_shift(pos,{y=colbox[2]+0.01}), pos +end + +function automobiles_lib.get_node_pos(pos) + return { + x=floor(pos.x+0.5), + y=floor(pos.y+0.5), + z=floor(pos.z+0.5), + } +end + +function automobiles_lib.nodeatpos(pos) + local node = minetest.get_node_or_nil(pos) + if node then return minetest.registered_nodes[node.name] end +end + +function automobiles_lib.minmax(v,m) + return min(abs(v),m)*sign(v) +end + +function automobiles_lib.set_acceleration(thing,vec,limit) + limit = limit or 100 + if type(thing) == 'table' then thing=thing.object end + vec.x=automobiles_lib.minmax(vec.x,limit) + vec.y=automobiles_lib.minmax(vec.y,limit) + vec.z=automobiles_lib.minmax(vec.z,limit) + + thing:set_acceleration(vec) +end + +function automobiles_lib.actfunc(self, staticdata, dtime_s) + + self.logic = self.logic or self.brainfunc + self.physics = self.physics or automobiles_lib.physics + + self.lqueue = {} + self.hqueue = {} + self.nearby_objects = {} + self.nearby_players = {} + self.pos_history = {} + self.path_dir = 1 + self.time_total = 0 + self.water_drag = self.water_drag or 1 + + local sdata = minetest.deserialize(staticdata) + if sdata then + for k,v in pairs(sdata) do + self[k] = v + end + end + + if self.textures==nil then + local prop_tex = self.object:get_properties().textures + if prop_tex then self.textures=prop_tex end + end + + if not self.memory then -- this is the initial activation + self.memory = {} + + -- texture variation + if #self.textures > 1 then self.texture_no = random(#self.textures) end + end + + if self.timeout and ((self.timeout>0 and dtime_s > self.timeout and next(self.memory)==nil) or + (self.timeout<0 and dtime_s > abs(self.timeout))) then + self.object:remove() + end + + -- apply texture + if self.textures and self.texture_no then + local props = {} + props.textures = {self.textures[self.texture_no]} + self.object:set_properties(props) + end + +--hp + self.max_hp = self.max_hp or 10 + self.hp = self.hp or self.max_hp +--armor + if type(self.armor_groups) ~= 'table' then + self.armor_groups={} + end + self.armor_groups.immortal = 1 + self.object:set_armor_groups(self.armor_groups) + + self.buoyancy = self.buoyancy or 0 + self.oxygen = self.oxygen or self.lung_capacity + self.lastvelocity = {x=0,y=0,z=0} +end + +function automobiles_lib.get_box_height(self) + if type(self) == 'table' then self = self.object end + local colbox = self:get_properties().collisionbox + local height = 0.1 + if colbox then height = colbox[5]-colbox[2] end + + return height > 0 and height or 0.1 +end + +function automobiles_lib.stepfunc(self,dtime,colinfo) + self.dtime = math.min(dtime,0.2) + self.colinfo = colinfo + self.height = automobiles_lib.get_box_height(self) + +-- physics comes first + local vel = self.object:get_velocity() + + if colinfo then + self.isonground = colinfo.touching_ground + else + if self.lastvelocity.y==0 and vel.y==0 then + self.isonground = true + else + self.isonground = false + end + end + + self:physics() + + if self.logic then + self:logic() + end + + self.lastvelocity = self.object:get_velocity() + self.time_total=self.time_total+self.dtime +end diff --git a/mods/automobiles_pck/automobiles_lib/settingtypes.txt b/mods/automobiles_pck/automobiles_lib/settingtypes.txt new file mode 100644 index 0000000..ce793b2 --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/settingtypes.txt @@ -0,0 +1,8 @@ +# all settings for client menu or in minetest.conf on servers + + +# make cars collectable +collect_automobiles (Collect vehicles to inventory) bool true +noob_mode (make automobiles climb entire blocks) bool false +motorcycle_anim_mode (enable motorcycle pilot animations) bool true +speed_limit (limit all vehicles to a speed - useful for lag servers) int 500 diff --git a/mods/automobiles_pck/automobiles_lib/sounds/automobiles_collision.ogg b/mods/automobiles_pck/automobiles_lib/sounds/automobiles_collision.ogg new file mode 100755 index 0000000..b15fbb1 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/sounds/automobiles_collision.ogg differ diff --git a/mods/automobiles_pck/automobiles_lib/sounds/automobiles_drifting.ogg b/mods/automobiles_pck/automobiles_lib/sounds/automobiles_drifting.ogg new file mode 100644 index 0000000..13f64e2 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/sounds/automobiles_drifting.ogg differ diff --git a/mods/automobiles_pck/automobiles_lib/sounds/automobiles_engine.ogg b/mods/automobiles_pck/automobiles_lib/sounds/automobiles_engine.ogg new file mode 100644 index 0000000..f9a9cc4 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/sounds/automobiles_engine.ogg differ diff --git a/mods/automobiles_pck/automobiles_lib/sounds/automobiles_horn.ogg b/mods/automobiles_pck/automobiles_lib/sounds/automobiles_horn.ogg new file mode 100644 index 0000000..88306b3 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/sounds/automobiles_horn.ogg differ diff --git a/mods/automobiles_pck/automobiles_lib/sounds/horn_licence.txt b/mods/automobiles_pck/automobiles_lib/sounds/horn_licence.txt new file mode 100644 index 0000000..a3c9d21 --- /dev/null +++ b/mods/automobiles_pck/automobiles_lib/sounds/horn_licence.txt @@ -0,0 +1 @@ +horn - SoundEffects by : https://youtu.be/FQc5zRy6wBU diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_alpha.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_alpha.png new file mode 100755 index 0000000..b09a735 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_alpha.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_black.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_black.png new file mode 100755 index 0000000..5d3d38c Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_black.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_dark_grey.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_dark_grey.png new file mode 100755 index 0000000..17f1fbd Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_dark_grey.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_engine.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_engine.png new file mode 100755 index 0000000..3e41a07 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_engine.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_front_lights.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_front_lights.png new file mode 100755 index 0000000..6c7d532 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_front_lights.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_glass.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_glass.png new file mode 100755 index 0000000..3ec645a Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_glass.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_grey.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_grey.png new file mode 100755 index 0000000..af9db27 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_grey.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_light.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_light.png new file mode 100644 index 0000000..334cb07 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_light.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_metal.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_metal.png new file mode 100755 index 0000000..336ba1c Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_metal.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_metal2.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_metal2.png new file mode 100755 index 0000000..fd66f38 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_metal2.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_painter.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_painter.png new file mode 100644 index 0000000..b67670a Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_painter.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_painting.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_painting.png new file mode 100755 index 0000000..12a349f Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_painting.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_painting2.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_painting2.png new file mode 100755 index 0000000..1b64e35 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_painting2.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_rear_lights.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_rear_lights.png new file mode 100644 index 0000000..d78b416 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_rear_lights.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_rear_lights_full.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_rear_lights_full.png new file mode 100644 index 0000000..4b47e67 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_rear_lights_full.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_rear_lights_off.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_rear_lights_off.png new file mode 100644 index 0000000..68ab0e3 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_rear_lights_off.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_red.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_red.png new file mode 100755 index 0000000..e5b86ba Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_red.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_smoke.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_smoke.png new file mode 100644 index 0000000..7690d01 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_smoke.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_target.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_target.png new file mode 100644 index 0000000..d1a399c Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_target.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_turn.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_turn.png new file mode 100755 index 0000000..6d979eb Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_turn.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_turn_on.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_turn_on.png new file mode 100644 index 0000000..e13a732 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_turn_on.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_wheel_icon.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_wheel_icon.png new file mode 100755 index 0000000..e7a1861 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_wheel_icon.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_white.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_white.png new file mode 100755 index 0000000..12a349f Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_white.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_wood.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_wood.png new file mode 100755 index 0000000..f7cc961 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_wood.png differ diff --git a/mods/automobiles_pck/automobiles_lib/textures/automobiles_wood2.png b/mods/automobiles_pck/automobiles_lib/textures/automobiles_wood2.png new file mode 100755 index 0000000..7143f96 Binary files /dev/null and b/mods/automobiles_pck/automobiles_lib/textures/automobiles_wood2.png differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/README.md b/mods/automobiles_pck/automobiles_motorcycle/README.md new file mode 100755 index 0000000..3761188 --- /dev/null +++ b/mods/automobiles_pck/automobiles_motorcycle/README.md @@ -0,0 +1,7 @@ +## Motorcycle + +This mod adds a motorcycle to Minetest. + +## Licenses +- Code: see [LICENSE](/LICENSE) +- Media: see [license_media.txt](/license_media.txt) diff --git a/mods/automobiles_pck/automobiles_motorcycle/init.lua b/mods/automobiles_pck/automobiles_motorcycle/init.lua new file mode 100755 index 0000000..c882e48 --- /dev/null +++ b/mods/automobiles_pck/automobiles_motorcycle/init.lua @@ -0,0 +1,32 @@ +-- +-- constants +-- +motorcycle={} +motorcycle._LONGIT_DRAG_FACTOR = 0.14*0.14 +motorcycle._LATER_DRAG_FACTOR = 25.0 +motorcycle.gravity = automobiles_lib.gravity +motorcycle.max_speed = 20 +motorcycle.max_acc_factor = 8 + +motorcycle.front_wheel_xpos = 0 +motorcycle.rear_wheel_xpos = 0 + +if(minetest.get_translator ~= nil) then + motorcycle.S = minetest.get_translator(minetest.get_current_modname()) + +else + motorcycle.S = function ( s ) return s end + +end + +local S = motorcycle.S + +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "custom_physics.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "control.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") +dofile(minetest.get_modpath("automobiles_motorcycle") .. DIR_DELIM .. "motorcycle_player.lua") +dofile(minetest.get_modpath("automobiles_motorcycle") .. DIR_DELIM .. "motorcycle_entities.lua") +dofile(minetest.get_modpath("automobiles_motorcycle") .. DIR_DELIM .. "motorcycle_crafts.lua") + + diff --git a/mods/automobiles_pck/automobiles_motorcycle/locale/automobiles_motorcycle.de.tr b/mods/automobiles_pck/automobiles_motorcycle/locale/automobiles_motorcycle.de.tr new file mode 100644 index 0000000..64ec749 --- /dev/null +++ b/mods/automobiles_pck/automobiles_motorcycle/locale/automobiles_motorcycle.de.tr @@ -0,0 +1,8 @@ +# textdomain: automobiles_motorcycle +### motorcycle_crafts.lua ### +Motorcycle Body=Motorrad Fahrgestell +Motorcycle Wheel=Motorrad Reifen +Motorcycle=Motorrad +A very nice motorcycle!=Ein sehr schönes Motorrad! +Go Offboard=Aussteigen +Direction by mouse=Lenke mit Maus diff --git a/mods/automobiles_pck/automobiles_motorcycle/locale/automobiles_motorcycle.eo.tr b/mods/automobiles_pck/automobiles_motorcycle/locale/automobiles_motorcycle.eo.tr new file mode 100644 index 0000000..8d9b098 --- /dev/null +++ b/mods/automobiles_pck/automobiles_motorcycle/locale/automobiles_motorcycle.eo.tr @@ -0,0 +1,8 @@ +# textdomain: automobiles_motorcycle +### motorcycle_crafts.lua ### +Motorcycle Body=Motorcikla Korpo +Motorcycle Wheel=Motorcikla Rado +Motorcycle=Motorciklo +A very nice motorcycle!= +Go Offboard= +Direction by mouse= diff --git a/mods/automobiles_pck/automobiles_motorcycle/locale/template.txt b/mods/automobiles_pck/automobiles_motorcycle/locale/template.txt new file mode 100644 index 0000000..e60ac42 --- /dev/null +++ b/mods/automobiles_pck/automobiles_motorcycle/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: automobiles_motorcycle +### motorcycle_crafts.lua ### +Motorcycle Body= +Motorcycle Wheel= +Motorcycle= +A very nice motorcycle!= +Go Offboard= +Direction by mouse= diff --git a/mods/automobiles_pck/automobiles_motorcycle/mod.conf b/mods/automobiles_pck/automobiles_motorcycle/mod.conf new file mode 100755 index 0000000..744a2d9 --- /dev/null +++ b/mods/automobiles_pck/automobiles_motorcycle/mod.conf @@ -0,0 +1,5 @@ +name=automobiles_motorcycle +title=Motorcycle +description=A motorcycle +author=apercy +depends=automobiles_lib diff --git a/mods/automobiles_pck/automobiles_motorcycle/models/automobiles_motorcycle_body.b3d b/mods/automobiles_pck/automobiles_motorcycle/models/automobiles_motorcycle_body.b3d new file mode 100755 index 0000000..8e04ebf Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/models/automobiles_motorcycle_body.b3d differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/models/automobiles_motorcycle_lights.b3d b/mods/automobiles_pck/automobiles_motorcycle/models/automobiles_motorcycle_lights.b3d new file mode 100755 index 0000000..1f117a2 Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/models/automobiles_motorcycle_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/models/automobiles_motorcycle_r_lights.b3d b/mods/automobiles_pck/automobiles_motorcycle/models/automobiles_motorcycle_r_lights.b3d new file mode 100755 index 0000000..97dd44d Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/models/automobiles_motorcycle_r_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/motorcycle_crafts.lua b/mods/automobiles_pck/automobiles_motorcycle/motorcycle_crafts.lua new file mode 100644 index 0000000..9008999 --- /dev/null +++ b/mods/automobiles_pck/automobiles_motorcycle/motorcycle_crafts.lua @@ -0,0 +1,79 @@ +local S = motorcycle.S +-- +-- items +-- + +-- body +minetest.register_craftitem("automobiles_motorcycle:body",{ + description = S("Motorcycle Body"), + inventory_image = "automobiles_motorcycle_body.png", +}) +-- wheel +minetest.register_craftitem("automobiles_motorcycle:wheel",{ + description = S("Motorcycle Wheel"), + inventory_image = "automobiles_motorcycle_wheel_icon.png", +}) + +-- motorcycle +minetest.register_tool("automobiles_motorcycle:motorcycle", { + description = S("Motorcycle"), + inventory_image = "automobiles_motorcycle.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_motorcycle:motorcycle", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 50 --reset hp + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, S("Motorcycle")) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) + +-- +-- crafting +-- +if minetest.get_modpath("default") then + minetest.register_craft({ + output = "automobiles_motorcycle:motorcycle", + recipe = { + {"automobiles_motorcycle:wheel", "automobiles_motorcycle:body", "automobiles_motorcycle:wheel"}, + } + }) + minetest.register_craft({ + output = "automobiles_motorcycle:body", + recipe = { + {"default:glass" ,"","default:steel_ingot"}, + {"default:steel_ingot","","default:steel_ingot"}, + {"default:steel_ingot","automobiles_lib:engine", "default:steel_ingot"}, + } + }) + minetest.register_craft({ + output = "automobiles_motorcycle:wheel", + recipe = { + {"default:steel_ingot", "default:tin_ingot", "default:steel_ingot"}, + {"default:steel_ingot","default:steelblock", "default:steel_ingot"}, + {"default:steel_ingot", "default:tin_ingot", "default:steel_ingot"}, + } + }) +end diff --git a/mods/automobiles_pck/automobiles_motorcycle/motorcycle_entities.lua b/mods/automobiles_pck/automobiles_motorcycle/motorcycle_entities.lua new file mode 100755 index 0000000..25dd7b1 --- /dev/null +++ b/mods/automobiles_pck/automobiles_motorcycle/motorcycle_entities.lua @@ -0,0 +1,283 @@ +-- +-- entity +-- + + +minetest.register_entity('automobiles_motorcycle:front_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "sprite", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + +minetest.register_entity('automobiles_motorcycle:rear_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + pointable=false, + visual = "sprite", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_motorcycle:lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_motorcycle_lights.b3d", + textures = {"automobiles_grey.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_motorcycle:r_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_motorcycle_r_lights.b3d", + textures = {"automobiles_red.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity("automobiles_motorcycle:motorcycle", { + initial_properties = { + physical = true, + collide_with_objects = true, + collisionbox = {-0.1, -0.4, -0.1, 0.1, 1, 0.1}, + selectionbox = {-1, 1, -1, 1, -1, 1}, + stepheight = 0.8 + automobiles_lib.extra_stepheight, + visual = "mesh", + mesh = "automobiles_motorcycle_body.b3d", + backface_culling = false, + textures = { + "automobiles_black.png", --bancos + "automobiles_black.png", --chassis + "automobiles_black.png", --suspensao traseira + "automobiles_metal.png", --metais + "automobiles_painting.png", --paralamas + "automobiles_black.png", --preto + "automobiles_motorcycle_wheel.png", --rodas + "automobiles_metal.png", --escapamento + "automobiles_black.png", --saida escape + "automobiles_metal.png", --motor + "automobiles_painting.png", --paralamas 2 + "automobiles_painting.png", --carenagens + "automobiles_blue.png", --frontlights + "automobiles_red.png", --ref + }, + }, + textures = {}, + driver_name = nil, + sound_handle = nil, + owner = "", + static_save = true, + infotext = "A very nice motorcycle!", + hp = 50, + buoyancy = 2, + physics = automobiles_lib.physics, + lastvelocity = vector.new(), + time_total = 0, + _passenger = nil, + _color = "#444444", + _steering_angle = 0, + _engine_running = false, + _last_checkpoint = "", + _total_laps = -1, + _race_id = "", + _energy = 1, + _last_time_collision_snd = 0, + _last_time_drift_snd = 0, + _last_time_command = 0, + _roll = math.rad(0), + _pitch = 0, + _longit_speed = 0, + _show_rag = false, + _show_lights = false, + _light_old_pos = nil, + _last_ground_check = 0, + _last_light_move = 0, + _last_engine_sound_update = 0, + _turn_light_timer = 0, + _inv = nil, + _inv_id = "", + _change_color = automobiles_lib.paint, + _intensity = 2, + _trunk_slots = 0, + _engine_sound = "motorcycle_engine", + _max_fuel = 5, + _base_pitch = 0.5, + + _vehicle_name = "Motorcycle", + _drive_wheel_pos = {x=-4.26,y=6.01,z=14.18}, + _drive_wheel_angle = 0, + _seat_pos = {{x=0.0,y=-1.1,z=5.5},{x=0.0,y=-0.3,z=0.09}}, + + _front_suspension_ent = 'automobiles_motorcycle:front_suspension', + _front_suspension_pos = {x=0,y=1.5,z=17}, + --_front_wheel_ent = 'automobiles_lib:wheel', + _front_wheel_xpos = 0, + _front_wheel_frames = {x = 1, y = 49}, + _rear_suspension_ent = 'automobiles_motorcycle:rear_suspension', + _rear_suspension_pos = {x=0,y=1.5,z=0}, + --_rear_wheel_ent = 'automobiles_lib:wheel', + _rear_wheel_xpos = 0, + _rear_wheel_frames = {x = 1, y = 49}, + + --_fuel_gauge_pos = {x=0,y=6.2,z=15.8}, + _front_lights = 'automobiles_motorcycle:lights', + _rear_lights = 'automobiles_motorcycle:r_lights', + + _LONGIT_DRAG_FACTOR = 0.14*0.14, + _LATER_DRAG_FACTOR = 25.0, + _max_acc_factor = 8, + _max_speed = 20, + _min_later_speed = 5, + _have_transmission = false, + _is_motorcycle = true, + _consumption_divisor = 100000, + + _attach = motorcycle.attach_driver_stand, + _dettach = motorcycle.dettach_driver_stand, + _attach_pax = motorcycle.attach_pax_stand, + _dettach_pax = motorcycle.dettach_pax_stand, + + get_staticdata = automobiles_lib.get_staticdata, + + on_deactivate = function(self) + automobiles_lib.save_inventory(self) + end, + + on_activate = function(self, staticdata, dtime_s) + automobiles_lib.on_activate(self, staticdata, dtime_s) + + self.object:set_bone_position("guidao", {x=0, y=0, z=17.5}, {x=30, y=180, z=0}) + self.lights:set_bone_position("guidao", {x=0, y=0, z=17.5}, {x=30, y=180, z=0}) + + self.object:set_animation(self._rear_wheel_frames, 0, 0, true) + end, + + on_step = function(self, dtime) + automobiles_lib.on_step(self, dtime) + self._stopped_roll = 0 + + local angle_factor = self._steering_angle / 10 + local anim_speed = self._longit_speed * (10 - angle_factor) + --core.chat_send_all(dump(anim_speed)) + self.object:set_animation_frame_speed(anim_speed) + --whell turn + self.object:set_bone_position("eixo_direcao", {x=0, y=0, z=0}, {x=0, y=-self._steering_angle-angle_factor, z=0}) + self.lights:set_bone_position("eixo_direcao", {x=0, y=0, z=0}, {x=0, y=-self._steering_angle-angle_factor, z=0}) + + local player = nil + local is_attached = false + if self.driver_name then + player = minetest.get_player_by_name(self.driver_name) + + if player then + local player_attach = player:get_attach() + if player_attach then + if self.driver_seat then + if player_attach == self.driver_seat or player_attach == self.object then is_attached = true end + end + end + + local steering_angle_max = 30 + -- -30 direita -> steering_angle_max + -- +30 esquerda + local arm_range = 2 + local range = steering_angle_max * 2 + local armZ = -((self._steering_angle+steering_angle_max) * arm_range) / 60 + + local left_arm_override = { + position = { vec={x=3.0, y=5, z=-armZ-2}, absolute = true}, + rotation = { vec={x=math.rad(60-(self._steering_angle/2)), y=0, z=0}, interpolation = 1, absolute = false } + } + local right_arm_override = { + position = { vec={x=-3.0, y=5, z=armZ}, absolute = true}, + rotation = { vec={x=math.rad(60+(self._steering_angle/2)), y=0, z=0}, interpolation = 1, absolute = false } + } + if automobiles_lib.mot_anim_mode then + player:set_bone_override("Arm_Left", left_arm_override) + player:set_bone_override("Arm_Right", right_arm_override) + end + + --player:set_bone_position("Arm_Left", {x=3.0, y=5, z=-arm_range-armZ}, {x=240-(self._steering_angle/2), y=0, z=0}) + --player:set_bone_position("Arm_Right", {x=-3.0, y=5, z=armZ}, {x=240+(self._steering_angle/2), y=0, z=0}) + --[[if self.driver_mesh and automobiles_lib.mot_anim_mode then + self.driver_mesh:set_bone_position("Arm_Left", {x=3.0, y=5, z=-armZ-2}, {x=180+60-(self._steering_angle/2), y=0, z=0}) + self.driver_mesh:set_bone_position("Arm_Right", {x=-3.0, y=5, z=armZ}, {x=180+60+(self._steering_angle/2), y=0, z=0}) + end]]-- + end + end + + if is_attached == false then + self._stopped_roll = math.rad(-12) + self.object:set_bone_position("descanso", {x=0, y=-2.55, z=5.9}, {x=-90, y=0, z=0}) + else + self.object:set_bone_position("descanso", {x=0, y=-2.55, z=5.9}, {x=0, y=0, z=0}) + end + + end, + + on_punch = automobiles_lib.on_punch, + on_rightclick = automobiles_lib.on_rightclick, +}) + + diff --git a/mods/automobiles_pck/automobiles_motorcycle/motorcycle_player.lua b/mods/automobiles_pck/automobiles_motorcycle/motorcycle_player.lua new file mode 100644 index 0000000..3e518bc --- /dev/null +++ b/mods/automobiles_pck/automobiles_motorcycle/motorcycle_player.lua @@ -0,0 +1,264 @@ +minetest.register_entity('automobiles_motorcycle:player_mesh',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "character.b3d", + textures = {"character.png"}, + is_visible = false, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +-- attach player +function motorcycle.attach_driver_stand(self, player) + local name = player:get_player_name() + self.driver_name = name + + --[[ + self.driver_properties = player:get_properties() + self.driver_properties.selectionbox = nil + self.driver_properties.pointable = false + self.driver_properties.show_on_minimap = false + self.driver_properties.static_save = nil + self.driver_properties.makes_footstep_sound = nil + --minetest.chat_send_all(dump(self.driver_properties)) + ]]-- + -- attach the driver + local x_pos = 0 --WHY?! because after the 5.9.1 version the motorcycle got an strange shaking. But when I move it from the center, it ceases. Then I use the camera center bug. + --player:set_attach(self.driver_seat, "", {x = x_pos, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + player:set_attach(self.object, "", self._seat_pos[1], {x = 0, y = 0, z = 0}) + --player:set_eye_offset({x = 0, y = 0, z = 1.5}, {x = 0, y = 3, z = -30}) + player:set_eye_offset({x = self._seat_pos[1].x, y = 0, z = self._seat_pos[1].z}, {x = 0, y = 3, z = -30}) + if automobiles_lib.is_minetest then + player_api.player_attached[name] = true + elseif automobiles_lib.is_mcl then + mcl_player.player_attached[name] = true + end + + -- makes it "invisible" + --player:set_properties({mesh = "automobiles_pivot_mesh.b3d"}) + + + --create the dummy mesh + local pos = player:get_pos() + --[[local driver_mesh=minetest.add_entity(pos,'automobiles_motorcycle:player_mesh') + driver_mesh:set_attach(player,'',{x=x_pos*-1,y=-0.0,z=0.0},{x=0,y=0,z=0}) + self.driver_mesh = driver_mesh + self.driver_mesh:set_properties({is_visible=false}) + + --position the dummy arms and legs + self.driver_mesh:set_properties(self.driver_properties) ]]-- + + --[[self.driver_mesh:set_bone_override("Leg_Left", { + position = {vec = {x=1.0, y=0, z=0}, absolute = true}, + rotation = {vec = {x=math.rad(-12), y=0, z=math.rad(190)}, absolute = true} + }) + self.driver_mesh:set_bone_override("Leg_Right", { + position = {vec = {x=-1.0, y=0, z=0}, absolute = true}, + rotation = {vec = {x=math.rad(-12), y=0, z=math.rad(-190)}, absolute = true} + })]]-- + if automobiles_lib.mot_anim_mode then + --[[self.driver_mesh:set_bone_position("Leg_Left", {x=1.1, y=0, z=0}, {x=-12, y=0, z=190}) + self.driver_mesh:set_bone_position("Leg_Right", {x=-1.1, y=0, z=0}, {x=-12, y=0, z=-190})]]-- + local left_leg_override = { + position = { vec={x=1.1, y=0, z=0}, absolute = true}, + rotation = { vec={x=math.rad(12),y=0,z=math.rad(-10)}, interpolation = 1, absolute = false } + } + local right_leg_override = { + position = { vec={x=-1.1, y=0, z=0}, absolute = true}, + rotation = { vec={x=math.rad(12),y=0,z=math.rad(10)}, interpolation = 1, absolute = false } + } + player:set_bone_override("Leg_Left", left_leg_override) + player:set_bone_override("Leg_Right", right_leg_override) + end + --[[self.driver_mesh:set_properties({ + is_visible=true, + })]]-- +end + +function motorcycle.dettach_driver_stand(self, player) + local name = self.driver_name + + --self._engine_running = false + + -- driver clicked the object => driver gets off the vehicle + self.driver_name = nil + + if self._engine_running then + self._engine_running = false + end + -- sound and animation + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + self.sound_handle = nil + end + + -- detach the player + if player then + --automobiles_lib.remove_hud(player) + + player:set_detach() + player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0}) + + if automobiles_lib.is_minetest then + if player_api.player_attached[name] then + player_api.player_attached[name] = nil + end + player_api.set_animation(player, "stand") + elseif automobiles_lib.is_mcl then + if mcl_player.player_attached[name] then + mcl_player.player_attached[name] = nil + end + mcl_player.player_set_animation(player, "stand") + end + + + --[[if self.driver_properties then + player:set_properties({mesh = self.driver_properties.mesh}) + self.driver_properties = nil + end]]-- + player:set_bone_override("Leg_Left", {}) + player:set_bone_override("Leg_Right", {}) + player:set_bone_override("Arm_Left", {}) + player:set_bone_override("Arm_Right", {}) + end + + --player:set_properties({visual_size = {x=1, y=1}}) + if self.driver_mesh then + self.driver_mesh:set_properties({is_visible=false}) + self.driver_mesh:remove() + end + self.driver = nil +end + +-- attach passenger +function motorcycle.attach_pax_stand(self, player) + local onside = onside or false + local name = player:get_player_name() + + --[[self.pax_properties = player:get_properties() + self.pax_properties.selectionbox = nil + self.pax_properties.pointable = false + self.pax_properties.show_on_minimap = false + self.pax_properties.static_save = nil + self.pax_properties.makes_footstep_sound = nil]]-- + + if self._passenger == nil then + self._passenger = name + + -- attach the driver + local x_pos = 0 --WHY?! because after the 5.9.1 version the motorcycle got an strange shaking. But when I move it from the center, it ceases. Then I use the camera center bug. + --player:set_attach(self.passenger_seat, "", {x = x_pos, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + player:set_attach(self.object, "", self._seat_pos[2], {x = 0, y = 0, z = 0}) + --player:set_eye_offset({x = 0, y = 3, z = 0}, {x = 0, y = 3, z = -30}) + player:set_eye_offset({x = self._seat_pos[2].x, y = 3, z = self._seat_pos[2].z}, {x = 0, y = 3, z = -30}) + if automobiles_lib.is_minetest then + player_api.player_attached[name] = true + elseif automobiles_lib.is_mcl then + mcl_player.player_attached[name] = true + end + + -- makes it "invisible" + --player:set_properties({mesh = "automobiles_pivot_mesh.b3d"}) + + --create the dummy mesh + --[[local pos = player:get_pos() + local pax_mesh=minetest.add_entity(pos,'automobiles_motorcycle:player_mesh') + pax_mesh:set_attach(player,'',{x=x_pos*-1,y=-0.0,z=0.0},{x=0,y=0,z=0}) + self.pax_mesh = pax_mesh + self.pax_mesh:set_properties({is_visible=false}) + + --position the dummy arms and legs + self.pax_mesh:set_properties(self.pax_properties)]]-- + if automobiles_lib.mot_anim_mode then + local left_leg_override = { + position = { vec={x=1.1, y=0, z=0}, absolute = true}, + rotation = { vec={x=math.rad(12),y=0,z=math.rad(-10)}, interpolation = 1, absolute = false } + } + local right_leg_override = { + position = { vec={x=-1.1, y=0, z=0}, absolute = true}, + rotation = { vec={x=math.rad(12),y=0,z=math.rad(10)}, interpolation = 1, absolute = false } + } + player:set_bone_override("Leg_Left", left_leg_override) + player:set_bone_override("Leg_Right", right_leg_override) + + --[[self.pax_mesh:set_bone_position("Leg_Left", {x=1.1, y=0, z=0}, {x=180+12, y=0, z=10}) + self.pax_mesh:set_bone_position("Leg_Right", {x=-1.1, y=0, z=0}, {x=180+12, y=0, z=-10})]]-- + + local left_arm_override = { + position = { vec={x=3.0, y=5, z=0}, absolute = true}, + rotation = { vec={x=math.rad(45),y=0,z=math.rad(10)}, interpolation = 1, absolute = false } + } + local right_arm_override = { + position = { vec={x=-3.0, y=5, z=0}, absolute = true}, + rotation = { vec={x=math.rad(45),y=0,z=math.rad(-10)}, interpolation = 1, absolute = false } + } + player:set_bone_override("Arm_Left", left_arm_override) + player:set_bone_override("Arm_Right", right_arm_override) + + --[[self.pax_mesh:set_bone_position("Arm_Left", {x=3.0, y=5, z=0}, {x=180+45, y=0, z=0}) + self.pax_mesh:set_bone_position("Arm_Right", {x=-3.0, y=5, z=0}, {x=180+45, y=0, z=0})]]-- + end + --[[self.pax_mesh:set_properties({ + is_visible=true, + })]]-- + end + +end + +function motorcycle.dettach_pax_stand(self, player) + if not player then return end + local name = player:get_player_name() --self._passenger + + -- passenger clicked the object => driver gets off the vehicle + if self._passenger == name then + self._passenger = nil + end + + -- detach the player + if player then + --player:set_properties({physical=true}) + player:set_detach() + player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0}) + + if automobiles_lib.is_minetest then + if player_api.player_attached[name] then + player_api.player_attached[name] = nil + end + player_api.set_animation(player, "stand") + elseif automobiles_lib.is_mcl then + if mcl_player.player_attached[name] then + mcl_player.player_attached[name] = nil + end + mcl_player.player_set_animation(player, "stand") + end + + --[[if self.pax_properties then + player:set_properties({mesh = self.pax_properties.mesh}) + self.pax_properties = nil + end]]-- + player:set_bone_override("Leg_Left", {}) + player:set_bone_override("Leg_Right", {}) + player:set_bone_override("Arm_Left", {}) + player:set_bone_override("Arm_Right", {}) + end + --player:set_properties({visual_size = {x=1, y=1}}) + if self.pax_mesh then + self.pax_mesh:set_properties({is_visible=false}) + self.pax_mesh:remove() + end +end + + diff --git a/mods/automobiles_pck/automobiles_motorcycle/sounds/motorcycle_engine.ogg b/mods/automobiles_pck/automobiles_motorcycle/sounds/motorcycle_engine.ogg new file mode 100644 index 0000000..a776126 Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/sounds/motorcycle_engine.ogg differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle.png b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle.png new file mode 100755 index 0000000..945b400 Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle.png differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_body.png b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_body.png new file mode 100755 index 0000000..d818bd6 Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_body.png differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_fuel.png b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_fuel.png new file mode 100755 index 0000000..089e6c4 Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_fuel.png differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_lights.png b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_lights.png new file mode 100755 index 0000000..299f2c9 Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_lights.png differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_rear_lights.png b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_rear_lights.png new file mode 100644 index 0000000..d78b416 Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_rear_lights.png differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_rear_lights_full.png b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_rear_lights_full.png new file mode 100644 index 0000000..4b47e67 Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_rear_lights_full.png differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_rear_lights_off.png b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_rear_lights_off.png new file mode 100644 index 0000000..68ab0e3 Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_rear_lights_off.png differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_wheel.png b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_wheel.png new file mode 100755 index 0000000..3b7c5b3 Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_wheel.png differ diff --git a/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_wheel_icon.png b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_wheel_icon.png new file mode 100755 index 0000000..9b7e8ef Binary files /dev/null and b/mods/automobiles_pck/automobiles_motorcycle/textures/automobiles_motorcycle_wheel_icon.png differ diff --git a/mods/automobiles_pck/automobiles_roadster/README.md b/mods/automobiles_pck/automobiles_roadster/README.md new file mode 100755 index 0000000..56795c9 --- /dev/null +++ b/mods/automobiles_pck/automobiles_roadster/README.md @@ -0,0 +1,10 @@ +## Roadster + +This mod adds a roadster automobile to Minetest. + +## Licenses +- Code: see [LICENSE](/LICENSE) +- Media: see [license_media.txt](/license_media.txt) + +## Screenshot +![roadster](/automobiles_roadster/screenshot.jpg) diff --git a/mods/automobiles_pck/automobiles_roadster/init.lua b/mods/automobiles_pck/automobiles_roadster/init.lua new file mode 100755 index 0000000..5446425 --- /dev/null +++ b/mods/automobiles_pck/automobiles_roadster/init.lua @@ -0,0 +1,71 @@ +-- +-- constants +-- +roadster={} +roadster.LONGIT_DRAG_FACTOR = 0.16*0.16 +roadster.LATER_DRAG_FACTOR = 30.0 +roadster.gravity = automobiles_lib.gravity +roadster.max_speed = 12 +roadster.max_acc_factor = 5 + +roadster.S = nil + +if(minetest.get_translator ~= nil) then + roadster.S = minetest.get_translator(minetest.get_current_modname()) + +else + roadster.S = function ( s ) return s end + +end + +local S = roadster.S + +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "custom_physics.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "control.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") +dofile(minetest.get_modpath("automobiles_roadster") .. DIR_DELIM .. "roadster_forms.lua") +dofile(minetest.get_modpath("automobiles_roadster") .. DIR_DELIM .. "roadster_entities.lua") +dofile(minetest.get_modpath("automobiles_roadster") .. DIR_DELIM .. "roadster_crafts.lua") + + +-- --minetest.add_entity(e_pos, "automobiles_roadster:target") +minetest.register_node("automobiles_roadster:display_target", { + tiles = {"automobiles_red.png"}, + use_texture_alpha = "true", + walkable = false, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-.05,-.05,-.05, .05,.05,.05}, + }, + }, + selection_box = { + type = "regular", + }, + paramtype = "light", + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "", +}) + +minetest.register_entity("automobiles_roadster:target", { + physical = false, + collisionbox = {0, 0, 0, 0, 0, 0}, + visual = "wielditem", + -- wielditem seems to be scaled to 1.5 times original node size + visual_size = {x = 0.67, y = 0.67}, + textures = {"automobiles_roadster:display_target"}, + timer = 0, + glow = 10, + + on_step = function(self, dtime) + + self.timer = self.timer + dtime + + -- remove after set number of seconds + if self.timer > 1 then + self.object:remove() + end + end, +}) diff --git a/mods/automobiles_pck/automobiles_roadster/locale/automobiles_roadster.de.tr b/mods/automobiles_pck/automobiles_roadster/locale/automobiles_roadster.de.tr new file mode 100644 index 0000000..2a6c8ba --- /dev/null +++ b/mods/automobiles_pck/automobiles_roadster/locale/automobiles_roadster.de.tr @@ -0,0 +1,9 @@ +# textdomain: automobiles_roadster +### roadster_crafts.lua ### +Roadster Body=Roadster Karrosserie +Roadster Wheel=Roadster Rad +Roadster=Roadster +Go Offboard=Aussteigen +Close/Open Ragtop=Öffne/Schließe Sonnendach +Lights=Lichter +Direction by mouse=Lenken mit Maus diff --git a/mods/automobiles_pck/automobiles_roadster/locale/automobiles_roadster.eo.tr b/mods/automobiles_pck/automobiles_roadster/locale/automobiles_roadster.eo.tr new file mode 100644 index 0000000..1f03ae4 --- /dev/null +++ b/mods/automobiles_pck/automobiles_roadster/locale/automobiles_roadster.eo.tr @@ -0,0 +1,9 @@ +# textdomain: automobiles_roadster +### roadster_crafts.lua ### +Roadster Body=Korpo de Roadster +Roadster Wheel=Rado de Roadster +Roadster=Roadster +Go Offboard= +Close/Open Ragtop= +Lights= +Direction by mouse= diff --git a/mods/automobiles_pck/automobiles_roadster/locale/template.txt b/mods/automobiles_pck/automobiles_roadster/locale/template.txt new file mode 100644 index 0000000..f0fc62d --- /dev/null +++ b/mods/automobiles_pck/automobiles_roadster/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: automobiles_roadster +### roadster_crafts.lua ### +Roadster Body= +Roadster Wheel= +Roadster= +Go Offboard= +Close/Open Ragtop= +Lights= +Direction by mouse= diff --git a/mods/automobiles_pck/automobiles_roadster/mod.conf b/mods/automobiles_pck/automobiles_roadster/mod.conf new file mode 100755 index 0000000..99a91e7 --- /dev/null +++ b/mods/automobiles_pck/automobiles_roadster/mod.conf @@ -0,0 +1,5 @@ +name=automobiles_roadster +title=Roadster +description=A roadster automobile +author=apercy +depends=automobiles_lib diff --git a/mods/automobiles_pck/automobiles_roadster/models/_automobiles_roadster_wheel.b3d b/mods/automobiles_pck/automobiles_roadster/models/_automobiles_roadster_wheel.b3d new file mode 100755 index 0000000..3337d76 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/models/_automobiles_roadster_wheel.b3d differ diff --git a/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster.b3d b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster.b3d new file mode 100755 index 0000000..21928f8 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster.b3d differ diff --git a/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_front_suspension.b3d b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_front_suspension.b3d new file mode 100755 index 0000000..cb8f6da Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_front_suspension.b3d differ diff --git a/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_lights.b3d b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_lights.b3d new file mode 100755 index 0000000..675a13d Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_rear_suspension.b3d b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_rear_suspension.b3d new file mode 100755 index 0000000..c6d4320 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_rear_suspension.b3d differ diff --git a/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_steering.b3d b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_steering.b3d new file mode 100755 index 0000000..8861cd7 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_steering.b3d differ diff --git a/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_top1.b3d b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_top1.b3d new file mode 100755 index 0000000..24fc68f Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_top1.b3d differ diff --git a/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_top2.b3d b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_top2.b3d new file mode 100755 index 0000000..697ee22 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_top2.b3d differ diff --git a/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_wheel.b3d b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_wheel.b3d new file mode 100755 index 0000000..f3226fd Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/models/automobiles_roadster_wheel.b3d differ diff --git a/mods/automobiles_pck/automobiles_roadster/roadster_crafts.lua b/mods/automobiles_pck/automobiles_roadster/roadster_crafts.lua new file mode 100644 index 0000000..e0dc6a5 --- /dev/null +++ b/mods/automobiles_pck/automobiles_roadster/roadster_crafts.lua @@ -0,0 +1,81 @@ +local S = roadster.S + +-- +-- items +-- + +-- body +minetest.register_craftitem("automobiles_roadster:roadster_body",{ + description = S("Roadster Body"), + inventory_image = "roadster_body.png", +}) +-- wheel +minetest.register_craftitem("automobiles_roadster:wheel",{ + description = S("Roadster Wheel"), + inventory_image = "roadster_wheel.png", +}) + +-- roadster +minetest.register_tool("automobiles_roadster:roadster", { + description = S("Roadster"), + inventory_image = "automobiles_roadster.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_roadster:roadster", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 50 --reset hp + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, S("Roadster")) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) + +-- +-- crafting +-- +if minetest.get_modpath("default") then + minetest.register_craft({ + output = "automobiles_roadster:roadster", + recipe = { + {"automobiles_roadster:wheel", "automobiles_lib:engine", "automobiles_roadster:wheel"}, + {"automobiles_roadster:wheel","automobiles_roadster:roadster_body", "automobiles_roadster:wheel"}, + } + }) + minetest.register_craft({ + output = "automobiles_roadster:roadster_body", + recipe = { + {"default:glass" ,"","default:steel_ingot"}, + {"default:steel_ingot","default:steelblock","default:steel_ingot"}, + {"group:wood","group:wood", "group:wood"}, + } + }) + minetest.register_craft({ + output = "automobiles_roadster:wheel", + recipe = { + {"group:wood", "default:stick", "group:wood"}, + {"default:stick","group:wood", "default:stick"}, + {"group:wood", "default:stick", "group:wood"}, + } + }) +end diff --git a/mods/automobiles_pck/automobiles_roadster/roadster_entities.lua b/mods/automobiles_pck/automobiles_roadster/roadster_entities.lua new file mode 100755 index 0000000..15211a1 --- /dev/null +++ b/mods/automobiles_pck/automobiles_roadster/roadster_entities.lua @@ -0,0 +1,311 @@ +-- +-- entity +-- + +minetest.register_entity('automobiles_roadster:front_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "mesh", + mesh = "automobiles_roadster_front_suspension.b3d", + textures = {"automobiles_black.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + +minetest.register_entity('automobiles_roadster:rear_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + pointable=false, + visual = "mesh", + mesh = "automobiles_roadster_rear_suspension.b3d", + textures = {"automobiles_black.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_roadster:lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 15, + visual = "mesh", + mesh = "automobiles_roadster_lights.b3d", + textures = {"automobiles_roadster_lights.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_roadster:wheel',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_roadster_wheel.b3d", + backface_culling = false, + textures = {"automobiles_black.png", "automobiles_wood2.png", "automobiles_roadster_wheel.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_roadster:top1',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_roadster_top1.b3d", + backface_culling = false, + textures = {"automobiles_metal.png", "automobiles_black.png", "automobiles_alpha.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_roadster:top2',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_roadster_top2.b3d", + backface_culling = false, + textures = {"automobiles_metal.png", "automobiles_black.png", "automobiles_alpha.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_roadster:steering',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_roadster_steering.b3d", + textures = {"automobiles_metal.png", "automobiles_wood2.png", "automobiles_metal.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_roadster:pointer',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_pointer.b3d", + visual_size = {x = 1, y = 1, z = 1}, + textures = {"automobiles_white.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, +}) + +minetest.register_entity("automobiles_roadster:roadster", { + initial_properties = { + physical = true, + collide_with_objects = true, + collisionbox = {-0.1, -0.5, -0.1, 0.1, 1, 0.1}, + selectionbox = {-1.5, 0.0, -1.5, 1.5, 2, 1.5}, + stepheight = 0.6 + automobiles_lib.extra_stepheight, + visual = "mesh", + mesh = "automobiles_roadster.b3d", + textures = { + "automobiles_metal2.png", --parabrisa movel + "automobiles_glass.png", --vidro do parabrisa movel + "automobiles_painting.png", --portas + "automobiles_black.png", --portas interno + "automobiles_wood.png", --assoalho + "automobiles_black.png", --bancos + "automobiles_painting.png", --pintura + "automobiles_black.png", --chassis + "automobiles_metal2.png", --carcaça farol + "automobiles_black.png", --grade do radiador + "automobiles_black.png", --forração interna + "automobiles_metal.png", --lente do farol + "automobiles_wood.png", --parede de fogo + "automobiles_roadster_fuel.png", --combustivel + "automobiles_metal2.png", --parabrisa fixo + "automobiles_glass.png", --vidro do parabrisa fixo + "automobiles_black.png", --paralamas + "automobiles_metal2.png", --carenagem do radiador + "automobiles_painting.png", --tanque de combustivel + }, + }, + textures = {}, + driver_name = nil, + sound_handle = nil, + owner = "", + static_save = true, + infotext = "A very nice roadster!", + hp = 50, + buoyancy = 2, + physics = automobiles_lib.physics, + lastvelocity = vector.new(), + time_total = 0, + _passenger = nil, + _color = "#0063b0", + _steering_angle = 0, + _engine_running = false, + _last_checkpoint = "", + _total_laps = -1, + _race_id = "", + _energy = 1, + _last_time_collision_snd = 0, + _last_time_drift_snd = 0, + _last_time_command = 0, + _roll = math.rad(0), + _pitch = 0, + _longit_speed = 0, + _show_rag = true, + _show_lights = false, + _light_old_pos = nil, + _last_ground_check = 0, + _last_light_move = 0, + _last_engine_sound_update = 0, + _inv = nil, + _inv_id = "", + _change_color = automobiles_lib.paint, + _intensity = 4, + _trunk_slots = 8, + _engine_sound = "roadster_engine", + _max_fuel = 10, + _formspec_function = roadster.driver_formspec, + _destroy_function = roadster.destroy, + + _vehicle_name = "Roadster", + _drive_wheel_pos = {x=-4.25,y=12,z=14}, + _drive_wheel_angle = 70, + _steering_ent = 'automobiles_roadster:steering', + _rag_extended_ent = 'automobiles_roadster:top1', + _rag_retracted_ent = 'automobiles_roadster:top2', + _windshield_pos = {x=0, z=15.8317, y=15.0394}, + _windshield_ext_rotation = {x=145, y=0, z=0}, + _seat_pos = {{x=-4.25,y=7.12,z=9.5},{x=4.25,y=7.12,z=9.5}}, + + _front_suspension_ent = 'automobiles_roadster:front_suspension', + _front_suspension_pos = {x=0,y=0,z=24.22}, + _front_wheel_ent = 'automobiles_roadster:wheel', + _front_wheel_xpos = 10.26, + _front_wheel_frames = {x = 1, y = 24}, + _rear_suspension_ent = 'automobiles_roadster:rear_suspension', + _rear_suspension_pos = {x=0,y=0,z=0}, + _rear_wheel_ent = 'automobiles_roadster:wheel', + _rear_wheel_xpos = 10.26, + _rear_wheel_frames = {x = 1, y = 24}, + _wheel_compensation = 0.5, + + _fuel_gauge_pos = {x=0,y=8.04,z=17.84}, + _gauge_pointer_ent = 'automobiles_roadster:pointer', + _front_lights = 'automobiles_roadster:lights', + + _horn_sound = 'roadster_horn', + + _LONGIT_DRAG_FACTOR = 0.16*0.16, + _LATER_DRAG_FACTOR = 20.0, + _max_acc_factor = 5, + _max_speed = 12, + _min_later_speed = 5, + _consumption_divisor = 60000, + + get_staticdata = automobiles_lib.get_staticdata, + + on_deactivate = function(self) + automobiles_lib.save_inventory(self) + end, + + on_activate = automobiles_lib.on_activate, + + on_step = automobiles_lib.on_step, + + on_punch = automobiles_lib.on_punch, + on_rightclick = automobiles_lib.on_rightclick, +}) + + diff --git a/mods/automobiles_pck/automobiles_roadster/roadster_forms.lua b/mods/automobiles_pck/automobiles_roadster/roadster_forms.lua new file mode 100644 index 0000000..26149e1 --- /dev/null +++ b/mods/automobiles_pck/automobiles_roadster/roadster_forms.lua @@ -0,0 +1,79 @@ +local S = roadster.S + +function roadster.driver_formspec(name) + local player = minetest.get_player_by_name(name) + local vehicle_obj = automobiles_lib.getCarFromPlayer(player) + if vehicle_obj == nil then + return + end + local ent = vehicle_obj:get_luaentity() + + local yaw = "false" + local one_hand = "false" + if ent._yaw_by_mouse then yaw = "true" end + if ent._one_hand then one_hand = "true" end + + local basic_form = table.concat({ + "formspec_version[3]", + "size[6,7]", + }, "") + + basic_form = basic_form.."button[1,1.0;4,1;go_out;" .. S("Go Offboard") .. "]" + basic_form = basic_form.."button[1,2.5;4,1;top;" .. S("Close/Open Ragtop") .. "]" + basic_form = basic_form.."button[1,4.0;4,1;lights;" .. S("Lights") .. "]" + basic_form = basic_form.."checkbox[1,5.5;yaw;" .. S("Direction by mouse") .. ";"..yaw.."]" + basic_form = basic_form.."checkbox[1,6.2;one_hand;" .. S("One Hand Driving\n(open menu using AUX)") .. ";"..one_hand.."]" + + minetest.show_formspec(name, "roadster:driver_main", basic_form) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "roadster:driver_main" then + local name = player:get_player_name() + local car_obj = automobiles_lib.getCarFromPlayer(player) + if car_obj then + local ent = car_obj:get_luaentity() + if ent then + if fields.top then + if ent._show_rag == true then + ent._show_rag = false + else + ent._show_rag = true + end + end + if fields.go_out then + + if ent._passenger then --any pax? + local pax_obj = minetest.get_player_by_name(ent._passenger) + automobiles_lib.dettach_pax(ent, pax_obj) + end + + automobiles_lib.dettach_driver(ent, player) + end + if fields.lights then + if ent._show_lights == true then + ent._show_lights = false + else + ent._show_lights = true + end + end + if fields.yaw then + if ent._yaw_by_mouse == true then + ent._yaw_by_mouse = false + else + ent._yaw_by_mouse = true + end + end + if fields.one_hand then + if ent._one_hand == true then + ent._one_hand = false + else + ent._one_hand = true + core.chat_send_player(name,core.colorize('#00ff00', S(" >>> Use AUX or key \"E\" to open the menu"))) + end + end + end + end + minetest.close_formspec(name, "roadster:driver_main") + end +end) diff --git a/mods/automobiles_pck/automobiles_roadster/screenshot.jpg b/mods/automobiles_pck/automobiles_roadster/screenshot.jpg new file mode 100644 index 0000000..8d40147 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/screenshot.jpg differ diff --git a/mods/automobiles_pck/automobiles_roadster/sounds/roadster_engine.ogg b/mods/automobiles_pck/automobiles_roadster/sounds/roadster_engine.ogg new file mode 100644 index 0000000..6694ae8 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/sounds/roadster_engine.ogg differ diff --git a/mods/automobiles_pck/automobiles_roadster/sounds/roadster_horn.ogg b/mods/automobiles_pck/automobiles_roadster/sounds/roadster_horn.ogg new file mode 100644 index 0000000..0456ad3 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/sounds/roadster_horn.ogg differ diff --git a/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster.png b/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster.png new file mode 100755 index 0000000..2c120c0 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster.png differ diff --git a/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster_fuel.png b/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster_fuel.png new file mode 100755 index 0000000..1b92ca5 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster_fuel.png differ diff --git a/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster_lights.png b/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster_lights.png new file mode 100755 index 0000000..9381ad0 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster_lights.png differ diff --git a/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster_metal2.png b/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster_metal2.png new file mode 100755 index 0000000..fd66f38 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster_metal2.png differ diff --git a/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster_wheel.png b/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster_wheel.png new file mode 100755 index 0000000..2da7c85 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/textures/automobiles_roadster_wheel.png differ diff --git a/mods/automobiles_pck/automobiles_roadster/textures/roadster_body.png b/mods/automobiles_pck/automobiles_roadster/textures/roadster_body.png new file mode 100755 index 0000000..e8cc895 Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/textures/roadster_body.png differ diff --git a/mods/automobiles_pck/automobiles_roadster/textures/roadster_wheel.png b/mods/automobiles_pck/automobiles_roadster/textures/roadster_wheel.png new file mode 100755 index 0000000..4785a2e Binary files /dev/null and b/mods/automobiles_pck/automobiles_roadster/textures/roadster_wheel.png differ diff --git a/mods/automobiles_pck/automobiles_trans_am/README.md b/mods/automobiles_pck/automobiles_trans_am/README.md new file mode 100755 index 0000000..a4c3424 --- /dev/null +++ b/mods/automobiles_pck/automobiles_trans_am/README.md @@ -0,0 +1,10 @@ +## Trans AMm + +This mod adds a Trans Am automobile to Minetest. + +## Licenses +- Code: see [LICENSE](/LICENSE) +- Media: Model made by myself; licence CC0 + +## Screenshot +![trans_am](/automobiles_trans_am/screenshot.jpg) diff --git a/mods/automobiles_pck/automobiles_trans_am/crafts.lua b/mods/automobiles_pck/automobiles_trans_am/crafts.lua new file mode 100644 index 0000000..3e59dbe --- /dev/null +++ b/mods/automobiles_pck/automobiles_trans_am/crafts.lua @@ -0,0 +1,71 @@ +local S = trans_am.S + +-- +-- items +-- + +-- body +minetest.register_craftitem("automobiles_trans_am:trans_am_body",{ + description = S("Trans Am Body"), + inventory_image = "automobiles_trans_am_body.png", +}) + +-- trans_am +minetest.register_tool("automobiles_trans_am:trans_am", { + description = S("Trans Am"), + inventory_image = "automobiles_trans_am.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_trans_am:trans_am", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 50 --reset hp + ent._trans_am_type = 0 + --minetest.chat_send_all("owner: " .. ent.owner) + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, S("Trans Am")) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) + + +-- +-- crafting +-- +if minetest.get_modpath("default") then + minetest.register_craft({ + output = "automobiles_trans_am:trans_am", + recipe = { + {"automobiles_lib:wheel", "automobiles_lib:engine", "automobiles_lib:wheel"}, + {"automobiles_lib:wheel","automobiles_trans_am:trans_am_body", "automobiles_lib:wheel"}, + } + }) + minetest.register_craft({ + output = "automobiles_trans_am:trans_am_body", + recipe = { + {"default:glass","default:mese","default:steel_ingot"}, + {"default:steel_ingot","default:steelblock","default:steel_ingot"}, + {"default:steelblock","default:steelblock", "default:steelblock"}, + } + }) +end diff --git a/mods/automobiles_pck/automobiles_trans_am/entities.lua b/mods/automobiles_pck/automobiles_trans_am/entities.lua new file mode 100755 index 0000000..34c80c0 --- /dev/null +++ b/mods/automobiles_pck/automobiles_trans_am/entities.lua @@ -0,0 +1,379 @@ +-- +-- entity +-- +local S = trans_am.S + +minetest.register_entity('automobiles_trans_am:wheel',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "automobiles_trans_am_wheel.b3d", + backface_culling = false, + textures = {"automobiles_black.png", "automobiles_metal.png", "automobiles_trans_am_wheel.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_trans_am:front_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "sprite", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + +minetest.register_entity('automobiles_trans_am:rear_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + pointable=false, + visual = "sprite", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_trans_am:f_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_trans_am_f_lights.b3d", + textures = {"automobiles_grey.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_trans_am:r_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_trans_am_r_lights.b3d", + textures = {"automobiles_rear_lights_off.png"}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_trans_am:reverse_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_trans_am_rear_lights.b3d", + textures = {"automobiles_grey.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_trans_am:turn_left_light',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_trans_am_l_turn_light.b3d", + textures = {"automobiles_rear_lights_off.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_trans_am:turn_right_light',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_trans_am_r_turn_light.b3d", + textures = {"automobiles_rear_lights_off.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +function trans_am.paint(self, colstr) + automobiles_lib.paint_with_mask(self, colstr, self._det_color, "automobiles_trans_am_painting.png", "automobiles_trans_am_marks.png") + local l_textures = self.initial_properties.textures + + --paint details + local target_texture = "automobiles_painting.png" + local accessorie_texture = "automobiles_painting2.png" + for _, texture in ipairs(l_textures) do + local indx = texture:find(target_texture) + if indx then + l_textures[_] = target_texture.."^[multiply:".. self._det_color --apply the deatil color color + end + local indx = texture:find(accessorie_texture) + if indx then + l_textures[_] = accessorie_texture.."^[multiply:".. colstr --here changes the main color + end + end + self.object:set_properties({textures=l_textures}) +end + +function trans_am.set_paint(self, puncher, itmstck) + local is_admin = false + is_admin = minetest.check_player_privs(puncher, {server=true}) + if not (self.owner == puncher:get_player_name() or is_admin == true) then + return + end + + local item_name = "" + if itmstck then item_name = itmstck:get_name() end + + if item_name == "bike:painter" then + --painting with bike painter + local meta = itmstck:get_meta() + local colstr = meta:get_string("paint_color") + self._det_color = colstr + trans_am.paint(self, self._color) + return true + else + --painting with dyes + local split = string.split(item_name, ":") + local color, indx, _ + if split[1] then _,indx = split[1]:find('dye') end + if indx then + for clr,_ in pairs(automobiles_lib.colors) do + local _,x = split[2]:find(clr) + if x then color = clr end + end + --lets paint!!!! + --local color = item_name:sub(indx+1) + local colstr = automobiles_lib.colors[color] + --minetest.chat_send_all(color ..' '.. dump(colstr)) + if colstr then + self._det_color = colstr + trans_am.paint(self, self._color) + itmstck:set_count(itmstck:get_count()-1) + puncher:set_wielded_item(itmstck) + return true + end + -- end painting + end + end + return false +end + +minetest.register_entity("automobiles_trans_am:trans_am", { + initial_properties = { + physical = true, + collide_with_objects = true, + collisionbox = {-0.1, -0.2, -0.1, 0.1, 1.8, 0.1}, + selectionbox = {-2.0, 0.0, -2.0, 2.0, 2, 2.0}, + stepheight = 0.65 + automobiles_lib.extra_stepheight, + visual = "mesh", + mesh = "automobiles_trans_am_body.b3d", + textures = { + "automobiles_black.png", --bancos + "automobiles_painting2.png", -- scoop + "automobiles_black.png", --lights + "automobiles_trans_am_glasses.png", --vidros + "automobiles_trans_am_painting.png", --pintura grade frontal + "automobiles_black.png", --detalhe grade frontal + "automobiles_painting.png", --detalhe grade frontal + "automobiles_black.png", --interior + "automobiles_black.png", --painel + "automobiles_painting.png", --fundo painel + "automobiles_trans_am_fuel.png", --combustivel + "automobiles_trans_am_painting.png", --pintura do carro + "automobiles_trans_am_painting.png", --pintura das portas + "automobiles_black.png", --forração portas e volante + "automobiles_metal.png", --espelhos + "automobiles_trans_am_painting.png", --spoilers + "automobiles_painting2.png", --tomadas de ar laterais + "automobiles_black.png", --assoalho + "automobiles_red.png", --bancos + "automobiles_trans_am_painting.png", --pintura + }, + }, + textures = {}, + driver_name = nil, + sound_handle = nil, + owner = "", + static_save = true, + infotext = S("A very nice Trans Am!"), + hp = 50, + buoyancy = 2, + physics = automobiles_lib.physics, + lastvelocity = vector.new(), + time_total = 0, + _passenger = nil, + _color = "#222222", + _det_color = "#BDA050", + _steering_angle = 0, + _engine_running = false, + _last_checkpoint = "", + _total_laps = -1, + _race_id = "", + _energy = 1, + _last_time_collision_snd = 0, + _last_time_drift_snd = 0, + _last_time_command = 0, + _roll = math.rad(0), + _pitch = 0, + _longit_speed = 0, + _show_rag = true, + _show_lights = false, + _light_old_pos = nil, + _last_ground_check = 0, + _last_light_move = 0, + _last_engine_sound_update = 0, + _turn_light_timer = 0, + _inv = nil, + _inv_id = "", + _change_color = trans_am.paint, + _intensity = 4, + _car_gravity = -automobiles_lib.gravity, + --acc control + _transmission_state = 1, + _painting_function = trans_am.set_paint, + _trunk_slots = 12, + _engine_sound = "trans_am_engine", + _max_fuel = 10, + + _vehicle_name = "Trans Am", + _painting_load = trans_am.paint, + _drive_wheel_pos = {x=-4.0, y=6.50, z=15.06}, + _drive_wheel_angle = 15, + _seat_pos = {{x=-4.0,y=0.8,z=9},{x=4.0,y=0.8,z=9}}, + + _front_suspension_ent = 'automobiles_trans_am:front_suspension', + _front_suspension_pos = {x=0,y=1.5,z=27.0}, + _front_wheel_ent = 'automobiles_trans_am:wheel', + _front_wheel_xpos = 9.5, + _front_wheel_frames = {x = 1, y = 49}, + _rear_suspension_ent = 'automobiles_trans_am:rear_suspension', + _rear_suspension_pos = {x=0,y=1.5,z=0}, + _rear_wheel_ent = 'automobiles_trans_am:wheel', + _rear_wheel_xpos = 9.5, + _rear_wheel_frames = {x = 1, y = 49}, + + _fuel_gauge_pos = {x=-4,y=6.8,z=16.6}, + _front_lights = 'automobiles_trans_am:f_lights', + _rear_lights = 'automobiles_trans_am:r_lights', + _reverse_lights = 'automobiles_trans_am:reverse_lights', + _turn_left_lights = 'automobiles_trans_am:turn_left_light', + _turn_right_lights = 'automobiles_trans_am:turn_right_light', + + _LONGIT_DRAG_FACTOR = 0.12*0.12, + _LATER_DRAG_FACTOR = 6.0, + _max_acc_factor = 12, + _max_speed = 40, + _min_later_speed = 4.5, + _consumption_divisor = 40000, + + _wheel_compensation = 0.8, + + get_staticdata = automobiles_lib.get_staticdata, + + on_deactivate = function(self) + automobiles_lib.save_inventory(self) + end, + + on_activate = automobiles_lib.on_activate, + + on_step = automobiles_lib.on_step, + + on_punch = automobiles_lib.on_punch, + on_rightclick = automobiles_lib.on_rightclick, +}) + + diff --git a/mods/automobiles_pck/automobiles_trans_am/init.lua b/mods/automobiles_pck/automobiles_trans_am/init.lua new file mode 100755 index 0000000..66e1e5f --- /dev/null +++ b/mods/automobiles_pck/automobiles_trans_am/init.lua @@ -0,0 +1,26 @@ +-- +-- constants +-- +trans_am={} +trans_am.gravity = automobiles_lib.gravity + +trans_am.S = nil + +if(minetest.get_translator ~= nil) then + trans_am.S = minetest.get_translator(minetest.get_current_modname()) + +else + trans_am.S = function ( s ) return s end + +end + +local S = trans_am.S + +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "custom_physics.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "control.lua") +dofile(minetest.get_modpath("automobiles_trans_am") .. DIR_DELIM .. "entities.lua") +dofile(minetest.get_modpath("automobiles_trans_am") .. DIR_DELIM .. "crafts.lua") + + diff --git a/mods/automobiles_pck/automobiles_trans_am/locale/automobiles_trans_am.de.tr b/mods/automobiles_pck/automobiles_trans_am/locale/automobiles_trans_am.de.tr new file mode 100644 index 0000000..a685fd3 --- /dev/null +++ b/mods/automobiles_pck/automobiles_trans_am/locale/automobiles_trans_am.de.tr @@ -0,0 +1,5 @@ +# textdomain: automobiles_trans_am +### crafts.lua ### +Trans Am Body=Trans Am Karrosserie +Trans Am=Trans Am +A very nice Trans Am!=Ein sehr schöner Trans Am! diff --git a/mods/automobiles_pck/automobiles_trans_am/locale/automobiles_trans_am.eo.tr b/mods/automobiles_pck/automobiles_trans_am/locale/automobiles_trans_am.eo.tr new file mode 100644 index 0000000..221808f --- /dev/null +++ b/mods/automobiles_pck/automobiles_trans_am/locale/automobiles_trans_am.eo.tr @@ -0,0 +1,5 @@ +# textdomain: automobiles_trans_am +### crafts.lua ### +Trans Am Body=Korpo de Trans Am +Trans Am=Trans Am +A very nice Trans Am!= diff --git a/mods/automobiles_pck/automobiles_trans_am/locale/template.txt b/mods/automobiles_pck/automobiles_trans_am/locale/template.txt new file mode 100644 index 0000000..1e9c549 --- /dev/null +++ b/mods/automobiles_pck/automobiles_trans_am/locale/template.txt @@ -0,0 +1,5 @@ +# textdomain: automobiles_trans_am +### crafts.lua ### +Trans Am Body= +Trans Am= +A very nice Trans Am!= diff --git a/mods/automobiles_pck/automobiles_trans_am/mod.conf b/mods/automobiles_pck/automobiles_trans_am/mod.conf new file mode 100755 index 0000000..b2fb820 --- /dev/null +++ b/mods/automobiles_pck/automobiles_trans_am/mod.conf @@ -0,0 +1,5 @@ +name=automobiles_trans_am +title=Trans Am +description=A Trans AM car to escape from the Smokey Bear +author=apercy +depends=automobiles_lib diff --git a/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_body.b3d b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_body.b3d new file mode 100755 index 0000000..d88dfeb Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_body.b3d differ diff --git a/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_f_lights.b3d b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_f_lights.b3d new file mode 100755 index 0000000..4f47599 Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_f_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_l_turn_light.b3d b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_l_turn_light.b3d new file mode 100755 index 0000000..b56d9f6 Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_l_turn_light.b3d differ diff --git a/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_r_lights.b3d b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_r_lights.b3d new file mode 100755 index 0000000..0382b43 Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_r_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_r_turn_light.b3d b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_r_turn_light.b3d new file mode 100755 index 0000000..bee6176 Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_r_turn_light.b3d differ diff --git a/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_rear_lights.b3d b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_rear_lights.b3d new file mode 100755 index 0000000..5dac2b6 Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_rear_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_wheel.b3d b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_wheel.b3d new file mode 100755 index 0000000..15d59f0 Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/models/automobiles_trans_am_wheel.b3d differ diff --git a/mods/automobiles_pck/automobiles_trans_am/sounds/trans_am_engine.ogg b/mods/automobiles_pck/automobiles_trans_am/sounds/trans_am_engine.ogg new file mode 100644 index 0000000..90e8d93 Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/sounds/trans_am_engine.ogg differ diff --git a/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am.png b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am.png new file mode 100755 index 0000000..cd35e2d Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am.png differ diff --git a/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_body.png b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_body.png new file mode 100755 index 0000000..68595eb Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_body.png differ diff --git a/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_fuel.png b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_fuel.png new file mode 100755 index 0000000..b708f31 Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_fuel.png differ diff --git a/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_glasses.png b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_glasses.png new file mode 100755 index 0000000..7fe8e5e Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_glasses.png differ diff --git a/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_lights.png b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_lights.png new file mode 100755 index 0000000..6c7d532 Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_lights.png differ diff --git a/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_marks.png b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_marks.png new file mode 100755 index 0000000..eff61df Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_marks.png differ diff --git a/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_painting.png b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_painting.png new file mode 100755 index 0000000..df1e943 Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_painting.png differ diff --git a/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_wheel.png b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_wheel.png new file mode 100755 index 0000000..d27e85b Binary files /dev/null and b/mods/automobiles_pck/automobiles_trans_am/textures/automobiles_trans_am_wheel.png differ diff --git a/mods/automobiles_pck/automobiles_vespa/README.md b/mods/automobiles_pck/automobiles_vespa/README.md new file mode 100755 index 0000000..c5588da --- /dev/null +++ b/mods/automobiles_pck/automobiles_vespa/README.md @@ -0,0 +1,7 @@ +## Vespa + +This mod adds a vespa motorcycle to Minetest. + +## Licenses +- Code: see [LICENSE](/LICENSE) +- Media: see [license_media.txt](/license_media.txt) diff --git a/mods/automobiles_pck/automobiles_vespa/init.lua b/mods/automobiles_pck/automobiles_vespa/init.lua new file mode 100755 index 0000000..d039d25 --- /dev/null +++ b/mods/automobiles_pck/automobiles_vespa/init.lua @@ -0,0 +1,26 @@ +-- +-- constants +-- +vespa={} +vespa.gravity = automobiles_lib.gravity + +vespa.S = nil + +if(minetest.get_translator ~= nil) then + vespa.S = minetest.get_translator(minetest.get_current_modname()) + +else + vespa.S = function ( s ) return s end + +end + +local S = vespa.S + +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "custom_physics.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "control.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "fuel_management.lua") +dofile(minetest.get_modpath("automobiles_lib") .. DIR_DELIM .. "ground_detection.lua") +dofile(minetest.get_modpath("automobiles_vespa") .. DIR_DELIM .. "vespa_player.lua") +dofile(minetest.get_modpath("automobiles_vespa") .. DIR_DELIM .. "vespa_entities.lua") +dofile(minetest.get_modpath("automobiles_vespa") .. DIR_DELIM .. "vespa_crafts.lua") + diff --git a/mods/automobiles_pck/automobiles_vespa/locale/automobiles_vespa.de.tr b/mods/automobiles_pck/automobiles_vespa/locale/automobiles_vespa.de.tr new file mode 100644 index 0000000..bfdb9b6 --- /dev/null +++ b/mods/automobiles_pck/automobiles_vespa/locale/automobiles_vespa.de.tr @@ -0,0 +1,9 @@ +# textdomain: automobiles_vespa +### motorcycle_crafts.lua ### +Vespa Body=Vespa Karrosserie +Vespa Wheel=Vesta Rad +Vespa=Vespa +A very nice vespa!=Eine sehr schöne Vespa! +Out of fuel=Kein Sprit mehr +Go Offboard=Aussteigen +Direction by mouse=Lenken mit Maus diff --git a/mods/automobiles_pck/automobiles_vespa/locale/automobiles_vespa.eo.tr b/mods/automobiles_pck/automobiles_vespa/locale/automobiles_vespa.eo.tr new file mode 100644 index 0000000..8b069dc --- /dev/null +++ b/mods/automobiles_pck/automobiles_vespa/locale/automobiles_vespa.eo.tr @@ -0,0 +1,9 @@ +# textdomain: automobiles_vespa +### motorcycle_crafts.lua ### +Vespa Body=Vespa Korpo +Vespa Wheel=Vespa Rado +Vespa=Vespa +A very nice vespa!= +Out of fuel= +Go Offboard= +Direction by mouse= diff --git a/mods/automobiles_pck/automobiles_vespa/locale/template.txt b/mods/automobiles_pck/automobiles_vespa/locale/template.txt new file mode 100644 index 0000000..84f5a74 --- /dev/null +++ b/mods/automobiles_pck/automobiles_vespa/locale/template.txt @@ -0,0 +1,9 @@ +# textdomain: automobiles_vespa +### motorcycle_crafts.lua ### +Vespa Body= +Vespa Wheel= +Vespa= +A very nice vespa!= +Out of fuel= +Go Offboard= +Direction by mouse= diff --git a/mods/automobiles_pck/automobiles_vespa/mod.conf b/mods/automobiles_pck/automobiles_vespa/mod.conf new file mode 100755 index 0000000..a8ecc3e --- /dev/null +++ b/mods/automobiles_pck/automobiles_vespa/mod.conf @@ -0,0 +1,5 @@ +name=automobiles_vespa +title=Vespa +description=A Vespa motorcycle +author=apercy +depends=automobiles_lib diff --git a/mods/automobiles_pck/automobiles_vespa/models/automobiles_vespa_body.b3d b/mods/automobiles_pck/automobiles_vespa/models/automobiles_vespa_body.b3d new file mode 100755 index 0000000..aa1b6ae Binary files /dev/null and b/mods/automobiles_pck/automobiles_vespa/models/automobiles_vespa_body.b3d differ diff --git a/mods/automobiles_pck/automobiles_vespa/models/automobiles_vespa_lights.b3d b/mods/automobiles_pck/automobiles_vespa/models/automobiles_vespa_lights.b3d new file mode 100755 index 0000000..d73a364 Binary files /dev/null and b/mods/automobiles_pck/automobiles_vespa/models/automobiles_vespa_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_vespa/models/automobiles_vespa_r_lights.b3d b/mods/automobiles_pck/automobiles_vespa/models/automobiles_vespa_r_lights.b3d new file mode 100755 index 0000000..6599478 Binary files /dev/null and b/mods/automobiles_pck/automobiles_vespa/models/automobiles_vespa_r_lights.b3d differ diff --git a/mods/automobiles_pck/automobiles_vespa/sounds/vespa_engine.ogg b/mods/automobiles_pck/automobiles_vespa/sounds/vespa_engine.ogg new file mode 100644 index 0000000..441853e Binary files /dev/null and b/mods/automobiles_pck/automobiles_vespa/sounds/vespa_engine.ogg differ diff --git a/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa.png b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa.png new file mode 100755 index 0000000..e8a1f61 Binary files /dev/null and b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa.png differ diff --git a/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_body.png b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_body.png new file mode 100755 index 0000000..9e1d6ec Binary files /dev/null and b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_body.png differ diff --git a/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_lights.png b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_lights.png new file mode 100755 index 0000000..299f2c9 Binary files /dev/null and b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_lights.png differ diff --git a/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_rear_lights.png b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_rear_lights.png new file mode 100644 index 0000000..d78b416 Binary files /dev/null and b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_rear_lights.png differ diff --git a/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_rear_lights_full.png b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_rear_lights_full.png new file mode 100644 index 0000000..4b47e67 Binary files /dev/null and b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_rear_lights_full.png differ diff --git a/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_rear_lights_off.png b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_rear_lights_off.png new file mode 100644 index 0000000..68ab0e3 Binary files /dev/null and b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_rear_lights_off.png differ diff --git a/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_wheel_icon.png b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_wheel_icon.png new file mode 100755 index 0000000..48dea9e Binary files /dev/null and b/mods/automobiles_pck/automobiles_vespa/textures/automobiles_vespa_wheel_icon.png differ diff --git a/mods/automobiles_pck/automobiles_vespa/vespa_crafts.lua b/mods/automobiles_pck/automobiles_vespa/vespa_crafts.lua new file mode 100755 index 0000000..7958b73 --- /dev/null +++ b/mods/automobiles_pck/automobiles_vespa/vespa_crafts.lua @@ -0,0 +1,80 @@ +local S = vespa.S + +-- +-- items +-- + +-- body +minetest.register_craftitem("automobiles_vespa:body",{ + description = S("Vespa Body"), + inventory_image = "automobiles_vespa_body.png", +}) +-- wheel +minetest.register_craftitem("automobiles_vespa:wheel",{ + description = S("Vespa Wheel"), + inventory_image = "automobiles_vespa_wheel_icon.png", +}) + +-- vespa +minetest.register_tool("automobiles_vespa:vespa", { + description = S("Vespa"), + inventory_image = "automobiles_vespa.png", + liquids_pointable = false, + stack_max = 1, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local stack_meta = itemstack:get_meta() + local staticdata = stack_meta:get_string("staticdata") + + local pointed_pos = pointed_thing.above + --pointed_pos.y=pointed_pos.y+0.2 + local car = minetest.add_entity(pointed_pos, "automobiles_vespa:vespa", staticdata) + if car and placer then + local ent = car:get_luaentity() + local owner = placer:get_player_name() + if ent then + ent.owner = owner + ent.hp = 50 --reset hp + car:set_yaw(placer:get_look_horizontal()) + itemstack:take_item() + ent.object:set_acceleration({x=0,y=-automobiles_lib.gravity,z=0}) + automobiles_lib.setText(ent, S("Vespa")) + automobiles_lib.create_inventory(ent, ent._trunk_slots, owner) + end + end + + return itemstack + end, +}) + +-- +-- crafting +-- +if minetest.get_modpath("default") then + minetest.register_craft({ + output = "automobiles_vespa:vespa", + recipe = { + {"automobiles_vespa:wheel", "automobiles_vespa:body", "automobiles_vespa:wheel"}, + } + }) + minetest.register_craft({ + output = "automobiles_vespa:body", + recipe = { + {"default:tin_ingot","",""}, + {"default:tin_ingot","","default:tin_ingot"}, + {"default:tin_ingot","automobiles_lib:engine", "default:tin_ingot"}, + } + }) + minetest.register_craft({ + output = "automobiles_vespa:wheel", + recipe = { + {"default:tin_ingot", "", "default:tin_ingot"}, + {"","default:steelblock", ""}, + {"default:tin_ingot", "", "default:tin_ingot"}, + } + }) +end diff --git a/mods/automobiles_pck/automobiles_vespa/vespa_entities.lua b/mods/automobiles_pck/automobiles_vespa/vespa_entities.lua new file mode 100755 index 0000000..8342cc9 --- /dev/null +++ b/mods/automobiles_pck/automobiles_vespa/vespa_entities.lua @@ -0,0 +1,278 @@ +-- +-- entity +-- + + +minetest.register_entity('automobiles_vespa:front_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + collisionbox = {-0.5, 0, -0.5, 0.5, 1, 0.5}, + pointable=false, + visual = "sprite", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + + --[[on_step = function(self, dtime, moveresult) + minetest.chat_send_all(dump(moveresult)) + end,]]-- + +}) + +minetest.register_entity('automobiles_vespa:rear_suspension',{ +initial_properties = { + physical = true, + collide_with_objects=true, + pointable=false, + visual = "sprite", + textures = {"automobiles_alpha.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_vespa:lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_vespa_lights.b3d", + textures = {"automobiles_grey.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity('automobiles_vespa:r_lights',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + glow = 0, + visual = "mesh", + mesh = "automobiles_vespa_r_lights.b3d", + textures = {"automobiles_red.png",}, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +minetest.register_entity("automobiles_vespa:vespa", { + initial_properties = { + physical = true, + collide_with_objects = true, + collisionbox = {-0.1, -0.24, -0.1, 0.1, 1, 0.1}, + selectionbox = {-1.0, 0.0, -1.0, 1.0, 1, 1.0}, + stepheight = 0.65 + automobiles_lib.extra_stepheight, + visual = "mesh", + mesh = "automobiles_vespa_body.b3d", + backface_culling = false, + textures = { + "automobiles_black.png", --bancos + "automobiles_black.png", --escapamento + "automobiles_metal.png", --eixo motor + "automobiles_black.png", --motor + "automobiles_painting.png", --pintura guidão e paralama + "automobiles_black.png", --pneus + "automobiles_metal.png", --rodas e aros + "automobiles_painting.png", --pintura + "automobiles_metal.png", --cromo + }, + }, + textures = {}, + driver_name = nil, + sound_handle = nil, + owner = "", + static_save = true, + infotext = "A very nice vespa!", + hp = 50, + buoyancy = 2, + physics = automobiles_lib.physics, + lastvelocity = vector.new(), + time_total = 0, + _passenger = nil, + _color = "#dc1818", + _steering_angle = 0, + _engine_running = false, + _last_checkpoint = "", + _total_laps = -1, + _race_id = "", + _energy = 1, + _last_time_collision_snd = 0, + _last_time_drift_snd = 0, + _last_time_command = 0, + _roll = math.rad(0), + _pitch = 0, + _longit_speed = 0, + _show_rag = false, + _show_lights = false, + _light_old_pos = nil, + _last_ground_check = 0, + _last_light_move = 0, + _last_engine_sound_update = 0, + _turn_light_timer = 0, + _inv = nil, + _inv_id = "", + _change_color = automobiles_lib.paint, + _intensity = 2, + _trunk_slots = 0, + _engine_sound = "vespa_engine", + _max_fuel = 3, + _base_pitch = 0.7, + + _vehicle_name = "Vespa", + _drive_wheel_pos = {x=-4.26,y=6.01,z=14.18}, + _drive_wheel_angle = 0, + _seat_pos = {{x=0.0,y=-1.1,z=5.5},{x=0.0,y=1,z=0.09}}, + + _front_suspension_ent = 'automobiles_vespa:front_suspension', + _front_suspension_pos = {x=0,y=1.5,z=14.5}, + --_front_wheel_ent = 'automobiles_lib:wheel', + _front_wheel_xpos = 0, + _front_wheel_frames = {x = 1, y = 49}, + _rear_suspension_ent = 'automobiles_vespa:rear_suspension', + _rear_suspension_pos = {x=0,y=1.5,z=0}, + --_rear_wheel_ent = 'automobiles_lib:wheel', + _rear_wheel_xpos = 0, + _rear_wheel_frames = {x = 1, y = 49}, + + _front_lights = 'automobiles_vespa:lights', + _rear_lights = 'automobiles_vespa:r_lights', + + _LONGIT_DRAG_FACTOR = 0.15*0.15, + _LATER_DRAG_FACTOR = 25.0, + _max_acc_factor = 6, + _max_speed = 14, + _min_later_speed = 5, + _have_transmission = false, + _is_motorcycle = true, + _consumption_divisor = 150000, + + _attach = vespa.attach_driver_stand, + _dettach = vespa.dettach_driver_stand, + _attach_pax = vespa.attach_pax_stand, + _dettach_pax = vespa.dettach_pax_stand, + + get_staticdata = automobiles_lib.get_staticdata, + + on_deactivate = function(self) + automobiles_lib.save_inventory(self) + end, + + on_activate = function(self, staticdata, dtime_s) + automobiles_lib.on_activate(self, staticdata, dtime_s) + + self.object:set_bone_position("guidao", {x=0, y=0, z=14}, {x=22, y=180, z=0}) + self.lights:set_bone_position("guidao", {x=0, y=0, z=14}, {x=22, y=180, z=0}) + + self.object:set_animation(self._rear_wheel_frames, 0, 0, true) + end, + + on_step = function(self, dtime) + automobiles_lib.on_step(self, dtime) + + local angle_factor = self._steering_angle / 10 + local anim_speed = self._longit_speed * (15 - angle_factor) + --core.chat_send_all(dump(anim_speed)) + self.object:set_animation_frame_speed(anim_speed) + --whell turn + self.object:set_bone_position("eixo_direcao", {x=0, y=0, z=0}, {x=0, y=-self._steering_angle-angle_factor, z=0}) + self.lights:set_bone_position("eixo_direcao", {x=0, y=0, z=0}, {x=0, y=-self._steering_angle-angle_factor, z=0}) + + local player = nil + local is_attached = false + if self.driver_name then + player = minetest.get_player_by_name(self.driver_name) + + if player then + local player_attach = player:get_attach() + if player_attach then + if self.driver_seat then + if player_attach == self.driver_seat or player_attach == self.object then is_attached = true end + end + end + + local steering_angle_max = 30 + -- -30 direita -> steering_angle_max + -- +30 esquerda + local arm_range = 2 + local range = steering_angle_max * 2 + local armZ = -((self._steering_angle+steering_angle_max) * arm_range) / 60 + + local left_arm_override = { + position = { vec={x=3.0, y=5, z=-arm_range-armZ}, absolute = true}, + rotation = { vec={x=math.rad(70-(self._steering_angle/2)), y=0, z=0}, interpolation = 1, absolute = false } + } + local right_arm_override = { + position = { vec={x=-3.0, y=5, z=armZ}, absolute = true}, + rotation = { vec={x=math.rad(70+(self._steering_angle/2)), y=0, z=0}, interpolation = 1, absolute = false } + } + if automobiles_lib.mot_anim_mode then + player:set_bone_override("Arm_Left", left_arm_override) + player:set_bone_override("Arm_Right", right_arm_override) + end + + --player:set_bone_position("Arm_Left", {x=3.0, y=5, z=-arm_range-armZ}, {x=240-(self._steering_angle/2), y=0, z=0}) + --player:set_bone_position("Arm_Right", {x=-3.0, y=5, z=armZ}, {x=240+(self._steering_angle/2), y=0, z=0}) + --[[if self.driver_mesh and automobiles_lib.mot_anim_mode then + self.driver_mesh:set_bone_position("Arm_Left", {x=3.0, y=5, z=-armZ-0.5}, {x=180+76-(self._steering_angle/2), y=0, z=0}) + self.driver_mesh:set_bone_position("Arm_Right", {x=-3.0, y=5, z=armZ+1.5}, {x=180+76+(self._steering_angle/2), y=0, z=0}) + end]]-- + + end + end + + if is_attached == false then + --core.chat_send_all("false") + self.object:set_bone_position("descanso", {x=0, y=-0.4, z=6.2}, {x=-90, y=0, z=0}) + else + --core.chat_send_all("true") + self.object:set_bone_position("descanso", {x=0, y=-0.4, z=6.2}, {x=0, y=0, z=0}) + end + + end, + + on_punch = automobiles_lib.on_punch, + on_rightclick = automobiles_lib.on_rightclick, +}) + + diff --git a/mods/automobiles_pck/automobiles_vespa/vespa_player.lua b/mods/automobiles_pck/automobiles_vespa/vespa_player.lua new file mode 100644 index 0000000..298f6f2 --- /dev/null +++ b/mods/automobiles_pck/automobiles_vespa/vespa_player.lua @@ -0,0 +1,253 @@ +minetest.register_entity('automobiles_vespa:player_mesh',{ +initial_properties = { + physical = false, + collide_with_objects=false, + pointable=false, + visual = "mesh", + mesh = "character.b3d", + textures = {"character.png"}, + is_visible = false, + }, + + on_activate = function(self,std) + self.sdata = minetest.deserialize(std) or {} + if self.sdata.remove then self.object:remove() end + end, + + get_staticdata=function(self) + self.sdata.remove=true + return minetest.serialize(self.sdata) + end, + +}) + +-- attach player +function vespa.attach_driver_stand(self, player) + local name = player:get_player_name() + self.driver_name = name + --[[self.driver_properties = player:get_properties() + self.driver_properties.selectionbox = nil + self.driver_properties.pointable = false + self.driver_properties.show_on_minimap = false + self.driver_properties.static_save = nil + self.driver_properties.makes_footstep_sound = nil]]-- + --minetest.chat_send_all(dump(self.driver_properties)) + + -- attach the driver + local x_pos = 0 --WHY?! because after the 5.9.1 version the motorcycle got an strange shaking. But when I move it from the center, it ceases. Then I use the camera center bug. + --player:set_attach(self.driver_seat, "", {x = x_pos, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + player:set_attach(self.object, "", self._seat_pos[1], {x = 0, y = 0, z = 0}) + --player:set_eye_offset({x = 0, y = 0, z = 1.5}, {x = 0, y = 3, z = -30}) + player:set_eye_offset({x = self._seat_pos[1].x, y = 0, z = self._seat_pos[1].z}, {x = 0, y = 3, z = -30}) + if automobiles_lib.is_minetest then + player_api.player_attached[name] = true + elseif automobiles_lib.is_mcl then + mcl_player.player_attached[name] = true + end + + -- makes it "invisible" + --player:set_properties({mesh = "automobiles_pivot_mesh.b3d"}) + + + --create the dummy mesh + --[[local pos = player:get_pos() + local driver_mesh=minetest.add_entity(pos,'automobiles_vespa:player_mesh') + driver_mesh:set_attach(player,'',{x=x_pos*-1,y=-0.0,z=0.0},{x=0,y=0,z=0}) + self.driver_mesh = driver_mesh + self.driver_mesh:set_properties({is_visible=false})]]-- + + --position the dummy arms and legs + --self.driver_mesh:set_properties(self.driver_properties) + if automobiles_lib.mot_anim_mode then + --self.driver_mesh:set_bone_position("Leg_Left", {x=1.1, y=1, z=0}, {x=180+12, y=0, z=7}) + --self.driver_mesh:set_bone_position("Leg_Right", {x=-1.1, y=1, z=0}, {x=180+12, y=0, z=-7}) + local left_leg_override = { + position = { vec={x=1.1, y=1, z=0}, absolute = true}, + rotation = { vec={x=math.rad(12),y=0,z=math.rad(-7)}, interpolation = 1, absolute = false } + } + local right_leg_override = { + position = { vec={x=-1.1, y=1, z=0}, absolute = true}, + rotation = { vec={x=math.rad(12),y=0,z=math.rad(7)}, interpolation = 1, absolute = false } + } + player:set_bone_override("Leg_Left", left_leg_override) + player:set_bone_override("Leg_Right", right_leg_override) + end + --[[self.driver_mesh:set_properties({ + is_visible=true, + })]]-- +end + +function vespa.dettach_driver_stand(self, player) + local name = self.driver_name + + --self._engine_running = false + + -- driver clicked the object => driver gets off the vehicle + self.driver_name = nil + + if self._engine_running then + self._engine_running = false + end + -- sound and animation + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + self.sound_handle = nil + end + + -- detach the player + if player then + --automobiles_lib.remove_hud(player) + + player:set_detach() + player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0}) + if automobiles_lib.is_minetest then + if player_api.player_attached[name] then + player_api.player_attached[name] = nil + end + player_api.set_animation(player, "stand") + elseif automobiles_lib.is_mcl then + if mcl_player.player_attached[name] then + mcl_player.player_attached[name] = nil + end + mcl_player.player_set_animation(player, "stand") + end + + + --[[if self.driver_properties then + player:set_properties({mesh = self.driver_properties.mesh}) + self.driver_properties = nil + end]]-- + player:set_bone_override("Leg_Left", {}) + player:set_bone_override("Leg_Right", {}) + player:set_bone_override("Arm_Left", {}) + player:set_bone_override("Arm_Right", {}) + end + + --player:set_properties({visual_size = {x=1, y=1}}) + if self.driver_mesh then + self.driver_mesh:set_properties({is_visible=false}) + self.driver_mesh:remove() + end + self.driver = nil +end + +-- attach passenger +function vespa.attach_pax_stand(self, player) + local onside = onside or false + local name = player:get_player_name() + + --[[self.pax_properties = player:get_properties() + self.pax_properties.selectionbox = nil + self.pax_properties.pointable = false + self.pax_properties.show_on_minimap = false + self.pax_properties.static_save = nil + self.pax_properties.makes_footstep_sound = nil]]-- + + if self._passenger == nil then + self._passenger = name + + -- attach the driver + local x_pos = 0 --WHY?! because after the 5.9.1 version the motorcycle got an strange shaking. But when I move it from the center, it ceases. Then I use the camera center bug. + --player:set_attach(self.passenger_seat, "", {x = x_pos, y = 0, z = 0}, {x = 0, y = 0, z = 0}) + player:set_attach(self.object, "", self._seat_pos[2], {x = 0, y = 0, z = 0}) + --player:set_eye_offset({x = 0, y = 3, z = 0}, {x = 0, y = 3, z = -30}) + player:set_eye_offset({x = self._seat_pos[2].x, y = 3, z = self._seat_pos[2].z}, {x = 0, y = 3, z = -30}) + if automobiles_lib.is_minetest then + player_api.player_attached[name] = true + elseif automobiles_lib.is_mcl then + mcl_player.player_attached[name] = true + end + + -- makes it "invisible" + --player:set_properties({mesh = "automobiles_pivot_mesh.b3d"}) + + --create the dummy mesh + --[[local pos = player:get_pos() + local pax_mesh=minetest.add_entity(pos,'automobiles_vespa:player_mesh') + pax_mesh:set_attach(player,'',{x=x_pos*-1,y=-0.0,z=0.0},{x=0,y=0,z=0}) + self.pax_mesh = pax_mesh + self.pax_mesh:set_properties({is_visible=false})]]-- + + --position the dummy arms and legs + --self.pax_mesh:set_properties(self.pax_properties) + if automobiles_lib.mot_anim_mode then + --[[self.pax_mesh:set_bone_position("Leg_Left", {x=1.1, y=0, z=0}, {x=180+12, y=0, z=15}) + self.pax_mesh:set_bone_position("Leg_Right", {x=-1.1, y=0, z=0}, {x=180+12, y=0, z=-15}) + + self.pax_mesh:set_bone_position("Arm_Left", {x=3.0, y=5, z=0}, {x=180+45, y=0, z=0}) + self.pax_mesh:set_bone_position("Arm_Right", {x=-3.0, y=5, z=0}, {x=180+45, y=0, z=0})]]-- + + local left_leg_override = { + position = { vec={x=1.1, y=0, z=0}, absolute = true}, + rotation = { vec={x=math.rad(12),y=0,z=math.rad(-15)}, interpolation = 1, absolute = false } + } + local right_leg_override = { + position = { vec={x=-1.1, y=0, z=0}, absolute = true}, + rotation = { vec={x=math.rad(12),y=0,z=math.rad(15)}, interpolation = 1, absolute = false } + } + player:set_bone_override("Leg_Left", left_leg_override) + player:set_bone_override("Leg_Right", right_leg_override) + + local left_arm_override = { + position = { vec={x=3.0, y=5, z=0}, absolute = true}, + rotation = { vec={x=math.rad(45),y=0,z=0}, interpolation = 1, absolute = false } + } + local right_arm_override = { + position = { vec={x=-3.0, y=5, z=0}, absolute = true}, + rotation = { vec={x=math.rad(45),y=0,z=0}, interpolation = 1, absolute = false } + } + player:set_bone_override("Arm_Left", left_arm_override) + player:set_bone_override("Arm_Right", right_arm_override) + + end + --[[self.pax_mesh:set_properties({ + is_visible=true, + })]]-- + end + +end + +function vespa.dettach_pax_stand(self, player) + if not player then return end + local name = player:get_player_name() --self._passenger + + -- passenger clicked the object => driver gets off the vehicle + if self._passenger == name then + self._passenger = nil + end + + -- detach the player + if player then + --player:set_properties({physical=true}) + player:set_detach() + player:set_eye_offset({x=0,y=0,z=0},{x=0,y=0,z=0}) + + if automobiles_lib.is_minetest then + if player_api.player_attached[name] then + player_api.player_attached[name] = nil + end + player_api.set_animation(player, "stand") + elseif automobiles_lib.is_mcl then + if mcl_player.player_attached[name] then + mcl_player.player_attached[name] = nil + end + mcl_player.player_set_animation(player, "stand") + end + + --[[if self.pax_properties then + player:set_properties({mesh = self.pax_properties.mesh}) + self.pax_properties = nil + end]]-- + player:set_bone_override("Leg_Left", {}) + player:set_bone_override("Leg_Right", {}) + player:set_bone_override("Arm_Left", {}) + player:set_bone_override("Arm_Right", {}) + end + --player:set_properties({visual_size = {x=1, y=1}}) + if self.pax_mesh then + self.pax_mesh:set_properties({is_visible=false}) + self.pax_mesh:remove() + end +end + + diff --git a/mods/automobiles_pck/license_media.txt b/mods/automobiles_pck/license_media.txt new file mode 100755 index 0000000..888cf00 --- /dev/null +++ b/mods/automobiles_pck/license_media.txt @@ -0,0 +1,68 @@ +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + +1. Definitions + + "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined below) for the purposes of this License. + "Creative Commons Compatible License" means a license that is listed at https://creativecommons.org/compatiblelicenses that has been approved by Creative Commons as being essentially equivalent to this License, including, at a minimum, because that license: (i) contains terms that have the same purpose, meaning and effect as the License Elements of this License; and, (ii) explicitly permits the relicensing of adaptations of works made available under that license under this License or a Creative Commons jurisdiction license with the same License Elements as this License. + "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. + "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike. + "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; + to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; + to Distribute and Publicly Perform the Work including as incorporated in Collections; and, + to Distribute and Publicly Perform Adaptations. + + For the avoidance of doubt: + Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, + Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(c), as requested. + You may Distribute or Publicly Perform an Adaptation only under the terms of: (i) this License; (ii) a later version of this License with the same License Elements as this License; (iii) a Creative Commons jurisdiction license (either this or a later license version) that contains the same License Elements as this License (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible License. If you license the Adaptation under one of the licenses mentioned in (iv), you must comply with the terms of that license. If you license the Adaptation under the terms of any of the licenses mentioned in (i), (ii) or (iii) (the "Applicable License"), you must comply with the terms of the Applicable License generally and the following provisions: (I) You must include a copy of, or the URI for, the Applicable License with every copy of each Adaptation You Distribute or Publicly Perform; (II) You may not offer or impose any terms on the Adaptation that restrict the terms of the Applicable License or the ability of the recipient of the Adaptation to exercise the rights granted to that recipient under the terms of the Applicable License; (III) You must keep intact all notices that refer to the Applicable License and to the disclaimer of warranties with every copy of the Work as included in the Adaptation You Distribute or Publicly Perform; (IV) when You Distribute or Publicly Perform the Adaptation, You may not impose any effective technological measures on the Adaptation that restrict the ability of a recipient of the Adaptation from You to exercise the rights granted to that recipient under the terms of the Applicable License. This Section 4(b) applies to the Adaptation as incorporated in a Collection, but this does not require the Collection apart from the Adaptation itself to be made subject to the terms of the Applicable License. + If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Ssection 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + +8. Miscellaneous + + Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. + This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. + The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. + + Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of the License. + + Creative Commons may be contacted at https://creativecommons.org/. diff --git a/mods/automobiles_pck/mod_translation_updater.py b/mods/automobiles_pck/mod_translation_updater.py new file mode 100755 index 0000000..b2feaaf --- /dev/null +++ b/mods/automobiles_pck/mod_translation_updater.py @@ -0,0 +1,495 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Script to generate Minetest translation template files and update +# translation files. +# +# Copyright (C) 2019 Joachim Stolberg, 2020 FaceDeer, 2020 Louis Royer, +# 2023 Wuzzy. +# License: LGPLv2.1 or later (see LICENSE file for details) + +import os, fnmatch, re, shutil, errno +from sys import argv as _argv +from sys import stderr as _stderr + +# Running params +params = {"recursive": False, + "help": False, + "verbose": False, + "folders": [], + "old-file": False, + "break-long-lines": False, + "print-source": False, + "truncate-unused": False, +} +# Available CLI options +options = {"recursive": ['--recursive', '-r'], + "help": ['--help', '-h'], + "verbose": ['--verbose', '-v'], + "old-file": ['--old-file', '-o'], + "break-long-lines": ['--break-long-lines', '-b'], + "print-source": ['--print-source', '-p'], + "truncate-unused": ['--truncate-unused', '-t'], +} + +# Strings longer than this will have extra space added between +# them in the translation files to make it easier to distinguish their +# beginnings and endings at a glance +doublespace_threshold = 80 + +# These symbols mark comment lines showing the source file name. +# A comment may look like "##[ init.lua ]##". +symbol_source_prefix = "##[" +symbol_source_suffix = "]##" + +# comment to mark the section of old/unused strings +comment_unused = "##### not used anymore #####" + +def set_params_folders(tab: list): + '''Initialize params["folders"] from CLI arguments.''' + # Discarding argument 0 (tool name) + for param in tab[1:]: + stop_param = False + for option in options: + if param in options[option]: + stop_param = True + break + if not stop_param: + params["folders"].append(os.path.abspath(param)) + +def set_params(tab: list): + '''Initialize params from CLI arguments.''' + for option in options: + for option_name in options[option]: + if option_name in tab: + params[option] = True + break + +def print_help(name): + '''Prints some help message.''' + print(f'''SYNOPSIS + {name} [OPTIONS] [PATHS...] +DESCRIPTION + {', '.join(options["help"])} + prints this help message + {', '.join(options["recursive"])} + run on all subfolders of paths given + {', '.join(options["old-file"])} + create *.old files + {', '.join(options["break-long-lines"])} + add extra line breaks before and after long strings + {', '.join(options["print-source"])} + add comments denoting the source file + {', '.join(options["verbose"])} + add output information + {', '.join(options["truncate-unused"])} + delete unused strings from files +''') + +def main(): + '''Main function''' + set_params(_argv) + set_params_folders(_argv) + if params["help"]: + print_help(_argv[0]) + else: + # Add recursivity message + print("Running ", end='') + if params["recursive"]: + print("recursively ", end='') + # Running + if len(params["folders"]) >= 2: + print("on folder list:", params["folders"]) + for f in params["folders"]: + if params["recursive"]: + run_all_subfolders(f) + else: + update_folder(f) + elif len(params["folders"]) == 1: + print("on folder", params["folders"][0]) + if params["recursive"]: + run_all_subfolders(params["folders"][0]) + else: + update_folder(params["folders"][0]) + else: + print("on folder", os.path.abspath("./")) + if params["recursive"]: + run_all_subfolders(os.path.abspath("./")) + else: + update_folder(os.path.abspath("./")) + +# Group 2 will be the string, groups 1 and 3 will be the delimiters (" or ') +# See https://stackoverflow.com/questions/46967465/regex-match-text-in-either-single-or-double-quote +pattern_lua_quoted = re.compile( + r'(?:^|[\.=,{\(\s])' # Look for beginning of file or anything that isn't a function identifier + r'N?F?S\s*\(\s*' # Matches S, FS, NS or NFS function call + r'(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)' # Quoted string + r'[\s,\)]', # End of call or argument + re.DOTALL) +# Handles the [[ ... ]] string delimiters +pattern_lua_bracketed = re.compile( + r'(?:^|[\.=,{\(\s])' # Same as for pattern_lua_quoted + r'N?F?S\s*\(\s*' # Same as for pattern_lua_quoted + r'\[\[(.*?)\]\]' # [[ ... ]] string delimiters + r'[\s,\)]', # Same as for pattern_lua_quoted + re.DOTALL) + +# Handles "concatenation" .. " of strings" +pattern_concat = re.compile(r'["\'][\s]*\.\.[\s]*["\']', re.DOTALL) + +# Handles a translation line in *.tr file. +# Group 1 is the source string left of the equals sign. +# Group 2 is the translated string, right of the equals sign. +pattern_tr = re.compile( + r'(.*)' # Source string + # the separating equals sign, if NOT preceded by @, unless + # that @ is preceded by another @ + r'(?:(?2.5 + if exc.errno == errno.EEXIST and os.path.isdir(path): + pass + else: raise + +# Converts the template dictionary to a text to be written as a file +# dKeyStrings is a dictionary of localized string to source file sets +# dOld is a dictionary of existing translations and comments from +# the previous version of this text +def strings_to_text(dkeyStrings, dOld, mod_name, header_comments, textdomain): + # if textdomain is specified, insert it at the top + if textdomain != None: + lOut = [textdomain] # argument is full textdomain line + # otherwise, use mod name as textdomain automatically + else: + lOut = [f"# textdomain: {mod_name}"] + if header_comments is not None: + lOut.append(header_comments) + + dGroupedBySource = {} + + for key in dkeyStrings: + sourceList = list(dkeyStrings[key]) + sourceString = "\n".join(sourceList) + listForSource = dGroupedBySource.get(sourceString, []) + listForSource.append(key) + dGroupedBySource[sourceString] = listForSource + + lSourceKeys = list(dGroupedBySource.keys()) + lSourceKeys.sort() + for source in lSourceKeys: + localizedStrings = dGroupedBySource[source] + if params["print-source"]: + if lOut[-1] != "": + lOut.append("") + lOut.append(source) + for localizedString in localizedStrings: + val = dOld.get(localizedString, {}) + translation = val.get("translation", "") + comment = val.get("comment") + if params["break-long-lines"] and len(localizedString) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None and comment != "" and not comment.startswith("# textdomain:"): + lOut.append(comment) + lOut.append(f"{localizedString}={translation}") + if params["break-long-lines"] and len(localizedString) > doublespace_threshold: + lOut.append("") + + unusedExist = False + if not params["truncate-unused"]: + for key in dOld: + if key not in dkeyStrings: + val = dOld[key] + translation = val.get("translation") + comment = val.get("comment") + # only keep an unused translation if there was translated + # text or a comment associated with it + if translation != None and (translation != "" or comment): + if not unusedExist: + unusedExist = True + lOut.append("\n\n" + comment_unused + "\n") + if params["break-long-lines"] and len(key) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None: + lOut.append(comment) + lOut.append(f"{key}={translation}") + if params["break-long-lines"] and len(key) > doublespace_threshold: + lOut.append("") + return "\n".join(lOut) + '\n' + +# Writes a template.txt file +# dkeyStrings is the dictionary returned by generate_template +def write_template(templ_file, dkeyStrings, mod_name): + # read existing template file to preserve comments + existing_template = import_tr_file(templ_file) + + text = strings_to_text(dkeyStrings, existing_template[0], mod_name, existing_template[2], existing_template[3]) + mkdir_p(os.path.dirname(templ_file)) + with open(templ_file, "wt", encoding='utf-8') as template_file: + template_file.write(text) + +# Gets all translatable strings from a lua file +def read_lua_file_strings(lua_file): + lOut = [] + with open(lua_file, encoding='utf-8') as text_file: + text = text_file.read() + + text = re.sub(pattern_concat, "", text) + + strings = [] + for s in pattern_lua_quoted.findall(text): + strings.append(s[1]) + for s in pattern_lua_bracketed.findall(text): + strings.append(s) + + for s in strings: + found_bad = pattern_bad_luastring.search(s) + if found_bad: + print("SYNTAX ERROR: Unescaped '@' in Lua string: " + s) + continue + s = s.replace('\\"', '"') + s = s.replace("\\'", "'") + s = s.replace("\n", "@n") + s = s.replace("\\n", "@n") + s = s.replace("=", "@=") + lOut.append(s) + return lOut + +# Gets strings from an existing translation file +# returns both a dictionary of translations +# and the full original source text so that the new text +# can be compared to it for changes. +# Returns also header comments in the third return value. +def import_tr_file(tr_file): + dOut = {} + text = None + in_header = True + header_comments = None + textdomain = None + if os.path.exists(tr_file): + with open(tr_file, "r", encoding='utf-8') as existing_file : + # save the full text to allow for comparison + # of the old version with the new output + text = existing_file.read() + existing_file.seek(0) + # a running record of the current comment block + # we're inside, to allow preceeding multi-line comments + # to be retained for a translation line + latest_comment_block = None + for line in existing_file.readlines(): + line = line.rstrip('\n') + # "##### not used anymore #####" comment + if line == comment_unused: + # Always delete the 'not used anymore' comment. + # It will be re-added to the file if neccessary. + latest_comment_block = None + if header_comments != None: + in_header = False + continue + # Comment lines + elif line.startswith("#"): + # Source file comments: ##[ file.lua ]## + if line.startswith(symbol_source_prefix) and line.endswith(symbol_source_suffix): + # This line marks the end of header comments. + if params["print-source"]: + in_header = False + # Remove those comments; they may be added back automatically. + continue + + # Store first occurance of textdomain + # discard all subsequent textdomain lines + if line.startswith("# textdomain:"): + if textdomain == None: + textdomain = line + continue + elif in_header: + # Save header comments (normal comments at top of file) + if not header_comments: + header_comments = line + else: + header_comments = header_comments + "\n" + line + else: + # Save normal comments + if line.startswith("# textdomain:") and textdomain == None: + textdomain = line + elif not latest_comment_block: + latest_comment_block = line + else: + latest_comment_block = latest_comment_block + "\n" + line + + continue + + match = pattern_tr.match(line) + if match: + # this line is a translated line + outval = {} + outval["translation"] = match.group(2) + if latest_comment_block: + # if there was a comment, record that. + outval["comment"] = latest_comment_block + latest_comment_block = None + in_header = False + + dOut[match.group(1)] = outval + return (dOut, text, header_comments, textdomain) + +# like os.walk but returns sorted filenames +def sorted_os_walk(folder): + tuples = [] + t = 0 + for root, dirs, files in os.walk(folder): + tuples.append( (root, dirs, files) ) + t = t + 1 + + tuples = sorted(tuples) + + paths_and_files = [] + f = 0 + + for tu in tuples: + root = tu[0] + dirs = tu[1] + files = tu[2] + files = sorted(files, key=str.lower) + for filename in files: + paths_and_files.append( (os.path.join(root, filename), filename) ) + f = f + 1 + return paths_and_files + +# Walks all lua files in the mod folder, collects translatable strings, +# and writes it to a template.txt file +# Returns a dictionary of localized strings to source file lists +# that can be used with the strings_to_text function. +def generate_template(folder, mod_name): + dOut = {} + paths_and_files = sorted_os_walk(folder) + for paf in paths_and_files: + fullpath_filename = paf[0] + filename = paf[1] + if fnmatch.fnmatch(filename, "*.lua"): + found = read_lua_file_strings(fullpath_filename) + if params["verbose"]: + print(f"{fullpath_filename}: {str(len(found))} translatable strings") + + for s in found: + sources = dOut.get(s, set()) + sources.add(os.path.relpath(fullpath_filename, start=folder)) + dOut[s] = sources + + if len(dOut) == 0: + return None + + # Convert source file set to list, sort it and add comment symbols. + # Needed because a set is unsorted and might result in unpredictable. + # output orders if any source string appears in multiple files. + for d in dOut: + sources = dOut.get(d, set()) + sources = sorted(list(sources), key=str.lower) + newSources = [] + for i in sources: + newSources.append(f"{symbol_source_prefix} {i} {symbol_source_suffix}") + dOut[d] = newSources + + templ_file = os.path.join(folder, "locale/template.txt") + write_template(templ_file, dOut, mod_name) + return dOut + +# Updates an existing .tr file, copying the old one to a ".old" file +# if any changes have happened +# dNew is the data used to generate the template, it has all the +# currently-existing localized strings +def update_tr_file(dNew, mod_name, tr_file): + if params["verbose"]: + print(f"updating {tr_file}") + + tr_import = import_tr_file(tr_file) + dOld = tr_import[0] + textOld = tr_import[1] + + textNew = strings_to_text(dNew, dOld, mod_name, tr_import[2], tr_import[3]) + + if textOld and textOld != textNew: + print(f"{tr_file} has changed.") + if params["old-file"]: + shutil.copyfile(tr_file, f"{tr_file}.old") + + with open(tr_file, "w", encoding='utf-8') as new_tr_file: + new_tr_file.write(textNew) + +# Updates translation files for the mod in the given folder +def update_mod(folder): + modname = get_modname(folder) + if modname is not None: + print(f"Updating translations for {modname}") + data = generate_template(folder, modname) + if data == None: + print(f"No translatable strings found in {modname}") + else: + for tr_file in get_existing_tr_files(folder): + update_tr_file(data, modname, os.path.join(folder, "locale/", tr_file)) + else: + print(f"Unable to determine the mod name in folder {folder}. Missing 'name' field in mod.conf.", file=_stderr) + exit(1) + +# Determines if the folder being pointed to is a mod or a mod pack +# and then runs update_mod accordingly +def update_folder(folder): + is_modpack = os.path.exists(os.path.join(folder, "modpack.txt")) or os.path.exists(os.path.join(folder, "modpack.conf")) + if is_modpack: + subfolders = [f.path for f in os.scandir(folder) if f.is_dir() and not f.name.startswith('.')] + for subfolder in subfolders: + update_mod(subfolder) + else: + update_mod(folder) + print("Done.") + +def run_all_subfolders(folder): + for modfolder in [f.path for f in os.scandir(folder) if f.is_dir() and not f.name.startswith('.')]: + update_folder(modfolder) + +main() diff --git a/mods/automobiles_pck/modpack.conf b/mods/automobiles_pck/modpack.conf new file mode 100755 index 0000000..f3634fe --- /dev/null +++ b/mods/automobiles_pck/modpack.conf @@ -0,0 +1,4 @@ +name=automobiles_pck +title=Automobiles Pack +description=Collection of automobiles +author = apercy diff --git a/mods/automobiles_pck/screenshot.png b/mods/automobiles_pck/screenshot.png new file mode 100644 index 0000000..346175f Binary files /dev/null and b/mods/automobiles_pck/screenshot.png differ diff --git a/mods/basic_materials/.cdb.json b/mods/basic_materials/.cdb.json new file mode 100644 index 0000000..08991e2 --- /dev/null +++ b/mods/basic_materials/.cdb.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://content.luanti.org/api/cdb_schema/", + "title": "Basic Materials", + "tags": ["crafting", "library"], + "type": "MOD", + "dev_state": "MAINTENANCE_ONLY", + "ai_disclosure": "NONE", + "license": "LGPL-3.0-only", + "media_license": "CC-BY-SA-4.0", + "repo": "https://github.com/mt-mods/basic_materials", + "issue_tracker": "https://github.com/mt-mods/basic_materials/issues/new/choose/", + "translation_url": "https://translate.luanti.ch/engage/mt-mods/", + "forum_url": "https://forum.luanti.org/viewtopic.php?t=21000", + "short_description": "Provides a small selection of basic materials and items that other mods should use when possible -- things like steel bars and chains, wire, plastic strips and sheets, and more." +} diff --git a/mods/basic_materials/.github/workflows/luacheck.yml b/mods/basic_materials/.github/workflows/luacheck.yml new file mode 100644 index 0000000..18088bc --- /dev/null +++ b/mods/basic_materials/.github/workflows/luacheck.yml @@ -0,0 +1,10 @@ +name: luacheck +on: [push, pull_request] +jobs: + luacheck: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@main + - name: Luacheck + uses: lunarmodules/luacheck@master diff --git a/mods/basic_materials/.luacheckrc b/mods/basic_materials/.luacheckrc new file mode 100644 index 0000000..f7a48d7 --- /dev/null +++ b/mods/basic_materials/.luacheckrc @@ -0,0 +1,12 @@ +globals = { + "basic_materials" +} + +read_globals = { + -- Luanti + "minetest", "core", + + -- Dependencies + "default", "xcompat", + "crafting" +} \ No newline at end of file diff --git a/mods/basic_materials/LICENSE b/mods/basic_materials/LICENSE new file mode 100644 index 0000000..c5885ae --- /dev/null +++ b/mods/basic_materials/LICENSE @@ -0,0 +1,600 @@ +License for code: LGPL 3.0 +License for media and all other assets: CC-by-SA 4.0 + +############################################################################### + + GNU LESSER 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. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + +############################################################################### + +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + + including for purposes of Section 3(b); and + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/mods/basic_materials/README.md b/mods/basic_materials/README.md new file mode 100644 index 0000000..4781cc7 --- /dev/null +++ b/mods/basic_materials/README.md @@ -0,0 +1,17 @@ +# Basic Materials mod + +[![ContentDB](https://content.luanti.org/packages/mt-mods/basic_materials/shields/downloads/)](https://content.luanti.org/packages/mt-mods/basic_materials/) +[![License: LGPL v3](https://img.shields.io/badge/License-LGPL%20v3-blue.svg)](https://www.gnu.org/licenses/lgpl-3.0) +_[Forum Topic](https://forum.luanti.org/viewtopic.php?t=21000)_ + +Provides a small selection of "basic" materials and items, things like steel bars and chains, wire, plastic strips and sheets, and more. + +## Dependencies + +- Luanti/Minetest v5.10 +- [Xcompat](https://github.com/mt-mods/xcompat) + +## License + +Code: [LGPL v3](https://www.gnu.org/licenses/lgpl-3.0#license-text) +Media: [CC-by-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/legalcode.txt) diff --git a/mods/basic_materials/aliases.lua b/mods/basic_materials/aliases.lua new file mode 100644 index 0000000..b261f66 --- /dev/null +++ b/mods/basic_materials/aliases.lua @@ -0,0 +1,34 @@ +core.register_alias("homedecor:plastic_sheeting", "basic_materials:plastic_sheet") +core.register_alias("homedecor:plastic_strips", "basic_materials:plastic_strip") +core.register_alias("homedecor:empty_spool", "basic_materials:empty_spool") +core.register_alias("homedecor:oil_extract", "basic_materials:oil_extract") +core.register_alias("homedecor:paraffin", "basic_materials:paraffin") +core.register_alias("homedecor:plastic_base", "basic_materials:paraffin") +core.register_alias("homedecor:terracotta_base", "basic_materials:terracotta_base") +core.register_alias("gloopblocks:wet_cement", "basic_materials:wet_cement") +core.register_alias("gloopblocks:cement", "basic_materials:cement_block") +core.register_alias("technic:concrete", "basic_materials:concrete_block") +core.register_alias("homedecor:ic", "basic_materials:ic") +core.register_alias("homedecor:motor", "basic_materials:motor") +core.register_alias("technic:motor", "basic_materials:motor") +core.register_alias("homedecor:heating_element", "basic_materials:heating_element") +core.register_alias("homedecor:power_crystal", "basic_materials:energy_crystal_simple") +core.register_alias("homedecor:copper_wire", "basic_materials:copper_wire") +core.register_alias("technic:fine_copper_wire", "basic_materials:copper_wire") +core.register_alias("technic:fine_silver_wire", "basic_materials:silver_wire") +core.register_alias("technic:fine_gold_wire", "basic_materials:gold_wire") +core.register_alias("homedecor:steel_wire", "basic_materials:steel_wire") +core.register_alias("homedecor:brass_ingot", "basic_materials:brass_ingot") +core.register_alias("technic:brass_ingot", "basic_materials:brass_ingot") +core.register_alias("technic:brass_block", "basic_materials:brass_block") +core.register_alias("homedecor:copper_strip", "basic_materials:copper_strip") +core.register_alias("homedecor:steel_strip", "basic_materials:steel_strip") +core.register_alias("homedecor:chainlink_brass", "basic_materials:chainlink_brass") +core.register_alias("chains:chain", "basic_materials:chain_steel") +core.register_alias("chains:chain_brass", "basic_materials:chain_brass") +core.register_alias("pipeworks:gear", "basic_materials:gear_steel") +core.register_alias("technic:rebar", "basic_materials:steel_bar") + +core.register_alias_force("mesecons_materials:silicon", "basic_materials:silicon") +core.register_alias_force("glooptest:chainlink", "basic_materials:chainlink_steel") +core.register_alias_force("homedecor:chainlink_steel", "basic_materials:chainlink_steel") diff --git a/mods/basic_materials/craftitems.lua b/mods/basic_materials/craftitems.lua new file mode 100644 index 0000000..6772712 --- /dev/null +++ b/mods/basic_materials/craftitems.lua @@ -0,0 +1,187 @@ +local S = core.get_translator("basic_materials") + +core.register_craftitem("basic_materials:plastic_sheet", { + description = S("Plastic sheet"), + inventory_image = "basic_materials_plastic_sheet.png", +}) + +core.register_craftitem("basic_materials:plastic_strip", { + description = S("Plastic strips"), + groups = { strip = 1 }, + inventory_image = "basic_materials_plastic_strip.png", +}) + +core.register_craftitem("basic_materials:empty_spool", { + description = S("Empty wire spool"), + inventory_image = "basic_materials_empty_spool.png", +}) + +core.register_craftitem("basic_materials:oil_extract", { + description = S("Oil extract"), + inventory_image = "basic_materials_oil_extract.png", +}) + +core.register_craftitem("basic_materials:paraffin", { + description = S("Unprocessed paraffin"), + inventory_image = "basic_materials_paraffin.png", +}) + +core.register_craftitem("basic_materials:terracotta_base", { + description = S("Uncooked Terracotta Base"), + inventory_image = "basic_materials_terracotta_base.png", +}) + +core.register_craftitem("basic_materials:wet_cement", { + description = S("Wet Cement"), + inventory_image = "basic_materials_wet_cement.png", +}) + +core.register_craftitem("basic_materials:silicon", { + description = S("Silicon lump"), + inventory_image = "basic_materials_silicon.png", +}) + +core.register_craftitem("basic_materials:ic", { + description = S("Simple Integrated Circuit"), + inventory_image = "basic_materials_ic.png", +}) + +core.register_craftitem("basic_materials:motor", { + description = S("Simple Motor"), + inventory_image = "basic_materials_motor.png", +}) + +core.register_craftitem("basic_materials:heating_element", { + description = S("Heating element"), + inventory_image = "basic_materials_heating_element.png", +}) + +core.register_craftitem("basic_materials:energy_crystal_simple", { + description = S("Simple energy crystal"), + inventory_image = "basic_materials_energy_crystal.png", +}) + +core.register_craftitem("basic_materials:steel_wire", { + description = S("Spool of steel wire"), + groups = { wire = 1 }, + inventory_image = "basic_materials_steel_wire.png", +}) + +core.register_craftitem("basic_materials:copper_wire", { + description = S("Spool of copper wire"), + groups = { wire = 1 }, + inventory_image = "basic_materials_copper_wire.png", +}) + +core.register_craftitem("basic_materials:silver_wire", { + description = S("Spool of silver wire"), + groups = { wire = 1 }, + inventory_image = "basic_materials_silver_wire.png", +}) + +core.register_craftitem("basic_materials:gold_wire", { + description = S("Spool of gold wire"), + groups = { wire = 1 }, + inventory_image = "basic_materials_gold_wire.png", +}) + +core.register_craftitem("basic_materials:stainless_steel_wire", { + description = S("Spool of stainless steel wire"), + groups = { wire = 1 }, + inventory_image = "basic_materials_stainless_steel_wire.png", +}) + +core.register_craftitem("basic_materials:aluminum_wire", { + description = S("Spool of aluminum wire"), + groups = { wire = 1 }, + inventory_image = "basic_materials_aluminum_wire.png", +}) + +core.register_craftitem("basic_materials:steel_strip", { + description = S("Steel Strip"), + groups = { strip = 1 }, + inventory_image = "basic_materials_steel_strip.png", +}) + +core.register_craftitem("basic_materials:copper_strip", { + description = S("Copper Strip"), + groups = { strip = 1 }, + inventory_image = "basic_materials_copper_strip.png", +}) + +core.register_craftitem("basic_materials:lead_strip", { + description = S("Lead Strip"), + groups = { strip = 1 }, + inventory_image = "basic_materials_lead_strip.png", +}) + +core.register_craftitem("basic_materials:gold_strip", { + description = S("Gold Strip"), + groups = { strip = 1 }, + inventory_image = "basic_materials_gold_strip.png", +}) + +core.register_craftitem("basic_materials:stainless_steel_strip", { + description = S("Stainless Steel Strip"), + groups = { strip = 1 }, + inventory_image = "basic_materials_stainless_steel_strip.png", +}) + +core.register_craftitem("basic_materials:aluminum_strip", { + description = S("Aluminum Strip"), + groups = { strip = 1 }, + inventory_image = "basic_materials_aluminum_strip.png", +}) + +core.register_craftitem("basic_materials:steel_bar", { + description = S("Steel Bar"), + inventory_image = "basic_materials_steel_bar.png", +}) + +core.register_craftitem("basic_materials:carbon_steel_bar", { + description = S("Carbon Steel Bar"), + inventory_image = "basic_materials_carbon_steel_bar.png", +}) + +core.register_craftitem("basic_materials:stainless_steel_bar", { + description = S("Stainless Steel Bar"), + inventory_image = "basic_materials_stainless_steel_bar.png", +}) + +core.register_craftitem("basic_materials:aluminum_bar", { + description = S("Aluminum Bar"), + inventory_image = "basic_materials_aluminum_bar.png", +}) + +core.register_craftitem("basic_materials:chainlink_brass", { + description = S("Chainlinks (brass)"), + groups = { chainlinks = 1 }, + inventory_image = "basic_materials_chainlink_brass.png", +}) + +core.register_craftitem("basic_materials:chainlink_steel", { + description = S("Chainlinks (steel)"), + groups = { chainlinks = 1 }, + inventory_image = "basic_materials_chainlink_steel.png", +}) + +core.register_craftitem("basic_materials:brass_ingot", { + description = S("Brass Ingot"), + inventory_image = "basic_materials_brass_ingot.png", +}) + +core.register_craftitem("basic_materials:gear_steel", { + description = S("Steel gear"), + inventory_image = "basic_materials_gear_steel.png", +}) + +core.register_craftitem("basic_materials:padlock", { + description = S("Padlock"), + inventory_image = "basic_materials_padlock.png", +}) + +if core.get_modpath("hades_materials") then + core.register_alias_force("basic_materials:plastic_sheet", "hades_materials:plastic_sheeting") + core.register_alias_force("basic_materials:paraffin", "hades_materials:plastic_base") + core.register_alias_force("basic_materials:silicon", "hades_materials:silicon") +end diff --git a/mods/basic_materials/crafts.lua b/mods/basic_materials/crafts.lua new file mode 100644 index 0000000..0f24e11 --- /dev/null +++ b/mods/basic_materials/crafts.lua @@ -0,0 +1,441 @@ +local materials = xcompat.materials + +local have_hades_materials = minetest.get_modpath("hades_materials") + +local function compress_craft(input) + local buffer = {} + for _, item in pairs(input) do + if type(item)=="table" then + for _, inneritem in pairs(item) do + buffer[inneritem] = (buffer[inneritem] or 0) + 1 + end + elseif item ~= "" then + buffer[item] = (buffer[item] or 0) + 1 + end + end + + local output = {} + for item, count in pairs(buffer) do + output[#output + 1] = item .. " " .. count + end + return output +end + +local function register_craft(input) + if minetest.get_modpath("rp_crafting") then + local rp_craft = compress_craft(input.recipe) + if #rp_craft > crafting.MAX_INPUTS then + minetest.log("error", "[basic_materials] unable to register craft for " .. input.output) + return + end + + crafting.register_craft({ + output = input.output, + items = rp_craft + }) + else + minetest.register_craft(input) + end +end + +-- Craft recipes +register_craft({ + output = "basic_materials:chainlink_brass 12", + recipe = { + {"", "basic_materials:brass_ingot", "basic_materials:brass_ingot"}, + {"basic_materials:brass_ingot", "", "basic_materials:brass_ingot"}, + {"basic_materials:brass_ingot", "basic_materials:brass_ingot", ""}, + }, +}) + +register_craft({ + output = "basic_materials:chain_steel 2", + recipe = { + {"basic_materials:chainlink_steel"}, + {"basic_materials:chainlink_steel"}, + {"basic_materials:chainlink_steel"} + } +}) + +register_craft({ + output = "basic_materials:chain_brass 2", + recipe = { + {"basic_materials:chainlink_brass"}, + {"basic_materials:chainlink_brass"}, + {"basic_materials:chainlink_brass"} + } +}) + +register_craft( { + type = "shapeless", + output = "basic_materials:brass_ingot 9", + recipe = {"basic_materials:brass_block"}, +}) + +register_craft( { + output = "basic_materials:brass_block", + recipe = { + {"basic_materials:brass_ingot", "basic_materials:brass_ingot", "basic_materials:brass_ingot"}, + {"basic_materials:brass_ingot", "basic_materials:brass_ingot", "basic_materials:brass_ingot"}, + {"basic_materials:brass_ingot", "basic_materials:brass_ingot", "basic_materials:brass_ingot"}, + }, +}) + +register_craft( { + output = "basic_materials:plastic_strip 9", + recipe = { + {"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"} + }, +}) + +register_craft( { + output = "basic_materials:empty_spool 3", + recipe = { + {"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"}, + {"", "basic_materials:plastic_sheet", ""}, + {"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"} + }, +}) + +if have_hades_materials then + minetest.clear_craft({ + type = "shapeless", + recipe = {"group:leaves", "group:leaves", "group:leaves", "group:leaves", "group:leaves", "group:leaves"} + }) +end + +register_craft({ + type = "shapeless", + output = "basic_materials:oil_extract 2", + recipe = {"group:leaves", "group:leaves", "group:leaves", "group:leaves", "group:leaves", "group:leaves"} +}) + +-- Cooking recipes +if not have_hades_materials then + minetest.register_craft({ + type = "cooking", + output = "basic_materials:plastic_sheet", + recipe = "basic_materials:paraffin", + }) +end + +minetest.register_craft({ + type = "cooking", + output = "basic_materials:paraffin", + recipe = "basic_materials:oil_extract", +}) + +minetest.register_craft({ + type = "cooking", + output = "basic_materials:cement_block", + recipe = "basic_materials:wet_cement", + cooktime = 8 +}) + +-- Fuel recipes +minetest.register_craft({ + type = "fuel", + recipe = "basic_materials:plastic_sheet", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "basic_materials:oil_extract", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "basic_materials:paraffin", + burntime = 30, +}) + +register_craft({ + output = "basic_materials:concrete_block 6", + recipe = { + {"group:sand", "basic_materials:wet_cement", materials.gravel}, + {"basic_materials:steel_bar", "basic_materials:wet_cement", "basic_materials:steel_bar"}, + {materials.gravel, "basic_materials:wet_cement", "group:sand"}, + } +}) + +register_craft( { + output = "basic_materials:motor 2", + recipe = { + {materials.mese_crystal_fragment, "basic_materials:copper_wire", "basic_materials:plastic_sheet"}, + {materials.copper_ingot, materials.steel_ingot, materials.steel_ingot}, + {materials.mese_crystal_fragment, "basic_materials:copper_wire", "basic_materials:plastic_sheet"} + }, + replacements = { + {"basic_materials:copper_wire", "basic_materials:empty_spool"}, + {"basic_materials:copper_wire", "basic_materials:empty_spool"}, + } +}) + +register_craft( { + output = "basic_materials:heating_element 2", + recipe = { + {materials.copper_ingot, materials.mese_crystal_fragment, materials.copper_ingot} + }, +}) + +register_craft({ + --type = "shapeless", + output = "basic_materials:energy_crystal_simple 2", + recipe = { + {materials.mese_crystal_fragment, materials.torch, materials.mese_crystal_fragment}, + {materials.diamond, materials.gold_ingot, materials.diamond} + }, +}) + +register_craft( { + output = "basic_materials:copper_wire 2", + type = "shapeless", + recipe = { + materials.copper_ingot, + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, +}) + +register_craft( { + output = "basic_materials:gold_wire 2", + type = "shapeless", + recipe = { + materials.gold_ingot, + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, +}) + +register_craft( { + output = "basic_materials:steel_wire 2", + type = "shapeless", + recipe = { + materials.steel_ingot, + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, +}) + +if materials.stainless_steel_ingot then + register_craft( { + output = "basic_materials:stainless_steel_wire 2", + type = "shapeless", + recipe = { + materials.stainless_steel_ingot, + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, + }) +end + +if materials.aluminum_ingot then + register_craft( { + output = "basic_materials:aluminum_wire 2", + type = "shapeless", + recipe = { + materials.aluminum_ingot, + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, + }) +end + +register_craft( { + output = "basic_materials:steel_strip 12", + recipe = { + {"", materials.steel_ingot, ""}, + {materials.steel_ingot, "", ""}, + }, +}) + +register_craft( { + output = "basic_materials:copper_strip 12", + recipe = { + {"", materials.copper_ingot, ""}, + {materials.copper_ingot, "", ""}, + }, +}) + +register_craft( { + output = "basic_materials:gold_strip 12", + recipe = { + {"", materials.gold_ingot, ""}, + {materials.gold_ingot, "", ""}, + }, +}) + +if materials.lead_ingot then + register_craft( { + output = "basic_materials:lead_strip 12", + recipe = { + {"", materials.lead_ingot, ""}, + {materials.lead_ingot, "", ""}, + }, + }) +end + +if materials.stainless_steel_ingot then + register_craft( { + output = "basic_materials:stainless_steel_strip 12", + recipe = { + {"", materials.stainless_steel_ingot, ""}, + {materials.stainless_steel_ingot, "", ""}, + }, + }) +end + +if materials.aluminum_ingot then + register_craft( { + output = "basic_materials:aluminum_strip 12", + recipe = { + {"", materials.aluminum_ingot, ""}, + {materials.aluminum_ingot, "", ""}, + }, + }) +end + +register_craft( { + output = "basic_materials:steel_bar 6", + recipe = { + {"", "", materials.steel_ingot}, + {"", materials.steel_ingot, ""}, + {materials.steel_ingot, "", ""}, + }, +}) + +if materials.carbon_steel_ingot then + register_craft( { + output = "basic_materials:carbon_steel_bar 6", + recipe = { + {"", "", materials.carbon_steel_ingot}, + {"", materials.carbon_steel_ingot, ""}, + {materials.carbon_steel_ingot, "", ""}, + }, + }) +end + +if materials.stainless_steel_ingot then + register_craft( { + output = "basic_materials:stainless_steel_bar 6", + recipe = { + {"", "", materials.stainless_steel_ingot}, + {"", materials.stainless_steel_ingot, ""}, + {materials.stainless_steel_ingot, "", ""}, + }, + }) +end + +if materials.aluminum_ingot then + register_craft( { + output = "basic_materials:aluminum_bar 6", + recipe = { + {"", "", materials.aluminum_ingot}, + {"", materials.aluminum_ingot, ""}, + {materials.aluminum_ingot, "", ""}, + }, + }) +end + +register_craft( { + output = "basic_materials:padlock 2", + recipe = { + {"basic_materials:steel_bar"}, + {materials.steel_ingot}, + {materials.steel_ingot}, + }, +}) + +register_craft({ + output = "basic_materials:chainlink_steel 12", + recipe = { + {"", materials.steel_ingot, materials.steel_ingot}, + {materials.steel_ingot, "", materials.steel_ingot}, + {materials.steel_ingot, materials.steel_ingot, ""}, + }, +}) + +register_craft( { + output = "basic_materials:gear_steel 6", + recipe = { + {"", materials.steel_ingot, ""}, + {materials.steel_ingot,"basic_materials:chainlink_steel", materials.steel_ingot}, + {"", materials.steel_ingot, ""} + }, +}) + +register_craft( { + type = "shapeless", + output = "basic_materials:terracotta_base 8", + recipe = { + materials.water_bucket, + materials.clay_lump, + materials.gravel, + }, + replacements = {{materials.water_bucket, materials.empty_bucket}}, +}) + +register_craft({ + type = "shapeless", + output = "basic_materials:wet_cement 3", + recipe = { + materials.dirt, + materials.dye_dark_grey, + materials.dye_dark_grey, + materials.dye_dark_grey, + materials.water_bucket + }, + replacements = {{materials.water_bucket, materials.empty_bucket}}, +}) + +if not have_hades_materials then + register_craft( { + output = "basic_materials:silicon 4", + recipe = { + {materials.sand, materials.sand}, + {materials.sand, materials.steel_ingot}, + }, + }) +end + +register_craft( { + output = "basic_materials:ic 4", + recipe = { + {"basic_materials:silicon", "basic_materials:silicon"}, + {"basic_materials:silicon", materials.copper_ingot}, + }, +}) + +-- Without moreores, there still should be a way to create brass. +register_craft( { + output = "basic_materials:brass_ingot 9", + recipe = { + {materials.copper_ingot, materials.tin_ingot, materials.copper_ingot}, + {materials.gold_ingot, materials.copper_ingot, materials.tin_ingot}, + {materials.copper_ingot, materials.tin_ingot, materials.copper_ingot}, + }, +}) + +if materials.silver_ingot then + register_craft( { + output = "basic_materials:silver_wire 2", + type = "shapeless", + recipe = { + materials.silver_ingot, + "basic_materials:empty_spool", + "basic_materials:empty_spool", + }, + }) + + register_craft( { + type = "shapeless", + output = "basic_materials:brass_ingot 3", + recipe = { + materials.copper_ingot, + materials.copper_ingot, + materials.silver_ingot, + }, + }) +end diff --git a/mods/basic_materials/init.lua b/mods/basic_materials/init.lua new file mode 100644 index 0000000..0e03623 --- /dev/null +++ b/mods/basic_materials/init.lua @@ -0,0 +1,14 @@ +-- Basic materials mod +-- by Vanessa Dannenberg + +-- This mod supplies all those little random craft items that everyone always +-- seems to need, such as metal bars (ala rebar), plastic, wire, and so on. + +basic_materials = {} +basic_materials.mod = { author = "Vanessa Dannenberg" } +basic_materials.modpath = core.get_modpath("basic_materials") + +dofile(basic_materials.modpath .. "/nodes.lua") +dofile(basic_materials.modpath .. "/craftitems.lua") +dofile(basic_materials.modpath .. "/crafts.lua") +dofile(basic_materials.modpath .. "/aliases.lua") diff --git a/mods/basic_materials/locale/basic_materials.de.po b/mods/basic_materials/locale/basic_materials.de.po new file mode 100644 index 0000000..7bf567a --- /dev/null +++ b/mods/basic_materials/locale/basic_materials.de.po @@ -0,0 +1,169 @@ +# German translations for basic_materials package. +# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the basic_materials package. +# Automatically generated from basic_materials.de.tr +# +msgid "" +msgstr "" +"Project-Id-Version: basic_materials\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-31 10:11-0500\n" +"PO-Revision-Date: 2026-07-31 10:11-0500\n" +"Last-Translator: \n" +"Language-Team: German\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: craftitems.lua:20 +msgid "Oil extract" +msgstr "Ölextrakt" + +#: craftitems.lua:25 +msgid "Unprocessed paraffin" +msgstr "Unverarbeitetes Paraffin" + +#: craftitems.lua:30 +msgid "Uncooked Terracotta Base" +msgstr "Ungebranntes Terrakotta" + +#: craftitems.lua:35 +msgid "Wet Cement" +msgstr "Nasser Zement" + +#: craftitems.lua:40 +msgid "Silicon lump" +msgstr "Siliziumklumpen" + +#: craftitems.lua:45 +msgid "Simple Integrated Circuit" +msgstr "Einfacher Integrierter Schaltkreis" + +#: craftitems.lua:50 +msgid "Simple Motor" +msgstr "Einfacher Motor" + +#: craftitems.lua:55 +msgid "Heating element" +msgstr "Heizelement" + +#: craftitems.lua:60 +msgid "Simple energy crystal" +msgstr "Einfacher Energiekristall" + +#: craftitems.lua:65 +msgid "Spool of steel wire" +msgstr "Spule mit Stahldraht" + +#: craftitems.lua:71 +msgid "Spool of copper wire" +msgstr "Spule mit Kupferdraht" + +#: craftitems.lua:77 +msgid "Spool of silver wire" +msgstr "Spule mit Silberdraht" + +#: craftitems.lua:83 +msgid "Spool of gold wire" +msgstr "Spule mit Golddraht" + +#: craftitems.lua:89 +msgid "Spool of stainless steel wire" +msgstr "" + +#: craftitems.lua:95 +msgid "Spool of aluminum wire" +msgstr "" + +#: craftitems.lua:101 +msgid "Steel Strip" +msgstr "Stahlstreifen" + +#: craftitems.lua:107 +msgid "Copper Strip" +msgstr "Kupferstreifen" + +#: craftitems.lua:113 +msgid "Lead Strip" +msgstr "" + +#: craftitems.lua:119 +msgid "Gold Strip" +msgstr "" + +#: craftitems.lua:125 +msgid "Stainless Steel Strip" +msgstr "" + +#: craftitems.lua:131 +msgid "Aluminum Strip" +msgstr "" + +#: craftitems.lua:137 +msgid "Steel Bar" +msgstr "Stahlstab" + +#: craftitems.lua:142 +msgid "Carbon Steel Bar" +msgstr "" + +#: craftitems.lua:147 +msgid "Stainless Steel Bar" +msgstr "" + +#: craftitems.lua:152 +msgid "Aluminum Bar" +msgstr "" + +#: craftitems.lua:157 +msgid "Chainlinks (brass)" +msgstr "Messingkettenglieder" + +#: craftitems.lua:163 +msgid "Chainlinks (steel)" +msgstr "Stahlkettenglieder" + +#: craftitems.lua:169 +msgid "Brass Ingot" +msgstr "Messingbarren" + +#: craftitems.lua:174 +msgid "Steel gear" +msgstr "Stahlzahnrad" + +#: craftitems.lua:179 +msgid "Padlock" +msgstr "Vorhängeschloss" + +#: craftitems.lua:4 +msgid "Plastic sheet" +msgstr "Kunststoffplatte" + +#: craftitems.lua:9 +msgid "Plastic strips" +msgstr "Kunststoffstreifen" + +#: craftitems.lua:15 +msgid "Empty wire spool" +msgstr "Leere Drahtspule" + +#: nodes.lua:6 +msgid "Cement" +msgstr "Zement" + +#: nodes.lua:15 +msgid "Concrete Block" +msgstr "Betonblock" + +#: nodes.lua:24 +msgid "Chain (steel, hanging)" +msgstr "Hängende Stahlkette" + +#: nodes.lua:40 +msgid "Chain (brass, hanging)" +msgstr "Hängende Messingkette" + +#: nodes.lua:56 +msgid "Brass Block" +msgstr "Messingblock" diff --git a/mods/basic_materials/locale/basic_materials.fi.po b/mods/basic_materials/locale/basic_materials.fi.po new file mode 100644 index 0000000..6f0137d --- /dev/null +++ b/mods/basic_materials/locale/basic_materials.fi.po @@ -0,0 +1,172 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-31 10:11-0500\n" +"PO-Revision-Date: 2026-08-24 13:58+0000\n" +"Last-Translator: Jouni Järvinen \n" +"Language-Team: Finnish \n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 2026.8.1\n" + +#: craftitems.lua:4 +msgid "Plastic sheet" +msgstr "Muovilevy" + +#: craftitems.lua:9 +msgid "Plastic strips" +msgstr "Muovinauhat" + +#: craftitems.lua:15 +msgid "Empty wire spool" +msgstr "Tyhjä lankakela" + +#: craftitems.lua:20 +msgid "Oil extract" +msgstr "Öljyuute" + +#: craftitems.lua:25 +msgid "Unprocessed paraffin" +msgstr "Käsittelemätön parafiini" + +#: craftitems.lua:30 +msgid "Uncooked Terracotta Base" +msgstr "Kypsentämätön terrakottapohja" + +#: craftitems.lua:35 +msgid "Wet Cement" +msgstr "Märkä sementti" + +#: craftitems.lua:40 +msgid "Silicon lump" +msgstr "Piimöykky" + +#: craftitems.lua:45 +msgid "Simple Integrated Circuit" +msgstr "Yksinkertainen integroitu piiri" + +#: craftitems.lua:50 +msgid "Simple Motor" +msgstr "Yksinkertainen moottori" + +#: craftitems.lua:55 +msgid "Heating element" +msgstr "Lämmityselementti" + +#: craftitems.lua:60 +msgid "Simple energy crystal" +msgstr "Yksinkertainen energiakide" + +#: craftitems.lua:65 +msgid "Spool of steel wire" +msgstr "Teräslankakela" + +#: craftitems.lua:71 +msgid "Spool of copper wire" +msgstr "Kuparilankakela" + +#: craftitems.lua:77 +msgid "Spool of silver wire" +msgstr "Hopealankakela" + +#: craftitems.lua:83 +msgid "Spool of gold wire" +msgstr "Kultalankakela" + +#: craftitems.lua:89 +msgid "Spool of stainless steel wire" +msgstr "Ruostumaton teräslankakela" + +#: craftitems.lua:95 +msgid "Spool of aluminum wire" +msgstr "Alumiinilankakela" + +#: craftitems.lua:101 +msgid "Steel Strip" +msgstr "Teräsnauha" + +#: craftitems.lua:107 +msgid "Copper Strip" +msgstr "Kuparinauha" + +#: craftitems.lua:113 +msgid "Lead Strip" +msgstr "Lyijynauha" + +#: craftitems.lua:119 +msgid "Gold Strip" +msgstr "Kultanauha" + +#: craftitems.lua:125 +msgid "Stainless Steel Strip" +msgstr "Ruostumaton teräsnauha" + +#: craftitems.lua:131 +msgid "Aluminum Strip" +msgstr "Alumiininauha" + +#: craftitems.lua:137 +msgid "Steel Bar" +msgstr "Terästanko" + +#: craftitems.lua:142 +msgid "Carbon Steel Bar" +msgstr "Hiiliterästanko" + +#: craftitems.lua:147 +msgid "Stainless Steel Bar" +msgstr "Ruostumaton terästanko" + +#: craftitems.lua:152 +msgid "Aluminum Bar" +msgstr "Alumiinitanko" + +#: craftitems.lua:157 +msgid "Chainlinks (brass)" +msgstr "Ketjulenkit (messinki)" + +#: craftitems.lua:163 +msgid "Chainlinks (steel)" +msgstr "Ketjulenkit (teräs)" + +#: craftitems.lua:169 +msgid "Brass Ingot" +msgstr "Messinkiharkot" + +#: craftitems.lua:174 +msgid "Steel gear" +msgstr "Teräshammasratas" + +#: craftitems.lua:179 +msgid "Padlock" +msgstr "Riippulukko" + +#: nodes.lua:6 +msgid "Cement" +msgstr "Sementti" + +#: nodes.lua:15 +msgid "Concrete Block" +msgstr "Betonikuutio" + +#: nodes.lua:24 +msgid "Chain (steel, hanging)" +msgstr "Ketju (teräs, riippuva)" + +#: nodes.lua:40 +msgid "Chain (brass, hanging)" +msgstr "Ketju (messinki, riippuva)" + +#: nodes.lua:56 +msgid "Brass Block" +msgstr "Messinkikuutio" diff --git a/mods/basic_materials/locale/basic_materials.fr.po b/mods/basic_materials/locale/basic_materials.fr.po new file mode 100644 index 0000000..7c3b5df --- /dev/null +++ b/mods/basic_materials/locale/basic_materials.fr.po @@ -0,0 +1,172 @@ +# French translations for basic_materials package. +# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the basic_materials package. +# Automatically generated from basic_materials.fr.tr +# +msgid "" +msgstr "" +"Project-Id-Version: basic_materials\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-31 10:11-0500\n" +"PO-Revision-Date: 2026-08-25 14:43+0000\n" +"Last-Translator: GGepic64 \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 2026.8.1\n" + +#: craftitems.lua:20 +msgid "Oil extract" +msgstr "Extrait d'huile" + +#: craftitems.lua:25 +msgid "Unprocessed paraffin" +msgstr "Paraffine non transformée" + +#: craftitems.lua:30 +msgid "Uncooked Terracotta Base" +msgstr "Argile crue" + +#: craftitems.lua:35 +msgid "Wet Cement" +msgstr "Ciment humide" + +#: craftitems.lua:40 +msgid "Silicon lump" +msgstr "Morceau de silicium" + +#: craftitems.lua:45 +msgid "Simple Integrated Circuit" +msgstr "Circuit intégré simple" + +#: craftitems.lua:50 +msgid "Simple Motor" +msgstr "Moteur simple" + +#: craftitems.lua:55 +msgid "Heating element" +msgstr "Élément chauffant" + +#: craftitems.lua:60 +msgid "Simple energy crystal" +msgstr "Cristal d'énergie simple" + +#: craftitems.lua:65 +msgid "Spool of steel wire" +msgstr "Bobine de fil d'acier" + +#: craftitems.lua:71 +msgid "Spool of copper wire" +msgstr "Bobine de fil de cuivre" + +#: craftitems.lua:77 +msgid "Spool of silver wire" +msgstr "Bobine de fil d'argent" + +#: craftitems.lua:83 +msgid "Spool of gold wire" +msgstr "Bobine de fil d'or" + +#: craftitems.lua:89 +msgid "Spool of stainless steel wire" +msgstr "Bobine d'acier inoxydable" + +#: craftitems.lua:95 +msgid "Spool of aluminum wire" +msgstr "Bobine d'aluminium" + +#: craftitems.lua:101 +msgid "Steel Strip" +msgstr "Bande de acier" + +#: craftitems.lua:107 +msgid "Copper Strip" +msgstr "Bande de cuivre" + +#: craftitems.lua:113 +msgid "Lead Strip" +msgstr "Bande de plomb" + +#: craftitems.lua:119 +msgid "Gold Strip" +msgstr "Bande en or" + +#: craftitems.lua:125 +msgid "Stainless Steel Strip" +msgstr "Bande en acier inoxydable" + +#: craftitems.lua:131 +msgid "Aluminum Strip" +msgstr "Bande d'aluminium" + +#: craftitems.lua:137 +msgid "Steel Bar" +msgstr "Barre en acier" + +#: craftitems.lua:142 +msgid "Carbon Steel Bar" +msgstr "Barre d'acier au carbone" + +#: craftitems.lua:147 +msgid "Stainless Steel Bar" +msgstr "Barre d'acier inoxydable" + +#: craftitems.lua:152 +msgid "Aluminum Bar" +msgstr "Barre d'aluminium" + +#: craftitems.lua:157 +msgid "Chainlinks (brass)" +msgstr "Maillon en laiton" + +#: craftitems.lua:163 +msgid "Chainlinks (steel)" +msgstr "Maillon en acier" + +#: craftitems.lua:169 +msgid "Brass Ingot" +msgstr "Lingot de laiton" + +#: craftitems.lua:174 +msgid "Steel gear" +msgstr "Rouage en acier" + +#: craftitems.lua:179 +msgid "Padlock" +msgstr "Cadenas" + +#: craftitems.lua:4 +msgid "Plastic sheet" +msgstr "Morceau de plastique" + +#: craftitems.lua:9 +msgid "Plastic strips" +msgstr "Bande de plastique" + +#: craftitems.lua:15 +msgid "Empty wire spool" +msgstr "Bobine de fil vide" + +#: nodes.lua:6 +msgid "Cement" +msgstr "Ciment" + +#: nodes.lua:15 +msgid "Concrete Block" +msgstr "Bloc de béton" + +#: nodes.lua:24 +msgid "Chain (steel, hanging)" +msgstr "Chaine en acier" + +#: nodes.lua:40 +msgid "Chain (brass, hanging)" +msgstr "Chaine en laiton" + +#: nodes.lua:56 +msgid "Brass Block" +msgstr "Bloc de laiton" diff --git a/mods/basic_materials/locale/basic_materials.it.po b/mods/basic_materials/locale/basic_materials.it.po new file mode 100644 index 0000000..e1077b0 --- /dev/null +++ b/mods/basic_materials/locale/basic_materials.it.po @@ -0,0 +1,169 @@ +# Italian translations for basic_materials package. +# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the basic_materials package. +# Automatically generated from basic_materials.it.tr +# +msgid "" +msgstr "" +"Project-Id-Version: basic_materials\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-31 10:11-0500\n" +"PO-Revision-Date: 2026-07-31 10:11-0500\n" +"Last-Translator: Salvo 'LtWorf' Tomaselli \n" +"Language-Team: Italian\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: craftitems.lua:20 +msgid "Oil extract" +msgstr "Estratto d'olio" + +#: craftitems.lua:25 +msgid "Unprocessed paraffin" +msgstr "Paraffina grezza" + +#: craftitems.lua:30 +msgid "Uncooked Terracotta Base" +msgstr "Argilla cruda" + +#: craftitems.lua:35 +msgid "Wet Cement" +msgstr "Cemento umido" + +#: craftitems.lua:40 +msgid "Silicon lump" +msgstr "Grumo di silicio" + +#: craftitems.lua:45 +msgid "Simple Integrated Circuit" +msgstr "Circuito integrato semplice" + +#: craftitems.lua:50 +msgid "Simple Motor" +msgstr "Motore semplice" + +#: craftitems.lua:55 +msgid "Heating element" +msgstr "Elemento riscaldante" + +#: craftitems.lua:60 +msgid "Simple energy crystal" +msgstr "Cristallo di energia semplice" + +#: craftitems.lua:65 +msgid "Spool of steel wire" +msgstr "Bobina di filo d'acciaio" + +#: craftitems.lua:71 +msgid "Spool of copper wire" +msgstr "Bobina di filo di rame" + +#: craftitems.lua:77 +msgid "Spool of silver wire" +msgstr "Bobina di filo d'argento" + +#: craftitems.lua:83 +msgid "Spool of gold wire" +msgstr "Bobina di filo d'oro" + +#: craftitems.lua:89 +msgid "Spool of stainless steel wire" +msgstr "" + +#: craftitems.lua:95 +msgid "Spool of aluminum wire" +msgstr "" + +#: craftitems.lua:101 +msgid "Steel Strip" +msgstr "Striscia d'acciaio" + +#: craftitems.lua:107 +msgid "Copper Strip" +msgstr "Striscia di rame" + +#: craftitems.lua:113 +msgid "Lead Strip" +msgstr "" + +#: craftitems.lua:119 +msgid "Gold Strip" +msgstr "" + +#: craftitems.lua:125 +msgid "Stainless Steel Strip" +msgstr "" + +#: craftitems.lua:131 +msgid "Aluminum Strip" +msgstr "" + +#: craftitems.lua:137 +msgid "Steel Bar" +msgstr "Barra d'acciaio" + +#: craftitems.lua:142 +msgid "Carbon Steel Bar" +msgstr "" + +#: craftitems.lua:147 +msgid "Stainless Steel Bar" +msgstr "" + +#: craftitems.lua:152 +msgid "Aluminum Bar" +msgstr "" + +#: craftitems.lua:157 +msgid "Chainlinks (brass)" +msgstr "Catena (ottone)" + +#: craftitems.lua:163 +msgid "Chainlinks (steel)" +msgstr "Catena (acciaio)" + +#: craftitems.lua:169 +msgid "Brass Ingot" +msgstr "Lingotto di ottone" + +#: craftitems.lua:174 +msgid "Steel gear" +msgstr "Ingranaggio d'acciaio" + +#: craftitems.lua:179 +msgid "Padlock" +msgstr "Catenaccio" + +#: craftitems.lua:4 +msgid "Plastic sheet" +msgstr "Foglio di plastica" + +#: craftitems.lua:9 +msgid "Plastic strips" +msgstr "Striscia di plastica" + +#: craftitems.lua:15 +msgid "Empty wire spool" +msgstr "Rocchetto vuoto" + +#: nodes.lua:6 +msgid "Cement" +msgstr "Cemento" + +#: nodes.lua:15 +msgid "Concrete Block" +msgstr "Blocco di calcestruzzo" + +#: nodes.lua:24 +msgid "Chain (steel, hanging)" +msgstr "Catena (acciaio, pendente)" + +#: nodes.lua:40 +msgid "Chain (brass, hanging)" +msgstr "Catena (ottone, pendente)" + +#: nodes.lua:56 +msgid "Brass Block" +msgstr "Blocco di ottone" diff --git a/mods/basic_materials/locale/basic_materials.pot b/mods/basic_materials/locale/basic_materials.pot new file mode 100644 index 0000000..dab33a9 --- /dev/null +++ b/mods/basic_materials/locale/basic_materials.pot @@ -0,0 +1,170 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-31 10:11-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: craftitems.lua:4 +msgid "Plastic sheet" +msgstr "" + +#: craftitems.lua:9 +msgid "Plastic strips" +msgstr "" + +#: craftitems.lua:15 +msgid "Empty wire spool" +msgstr "" + +#: craftitems.lua:20 +msgid "Oil extract" +msgstr "" + +#: craftitems.lua:25 +msgid "Unprocessed paraffin" +msgstr "" + +#: craftitems.lua:30 +msgid "Uncooked Terracotta Base" +msgstr "" + +#: craftitems.lua:35 +msgid "Wet Cement" +msgstr "" + +#: craftitems.lua:40 +msgid "Silicon lump" +msgstr "" + +#: craftitems.lua:45 +msgid "Simple Integrated Circuit" +msgstr "" + +#: craftitems.lua:50 +msgid "Simple Motor" +msgstr "" + +#: craftitems.lua:55 +msgid "Heating element" +msgstr "" + +#: craftitems.lua:60 +msgid "Simple energy crystal" +msgstr "" + +#: craftitems.lua:65 +msgid "Spool of steel wire" +msgstr "" + +#: craftitems.lua:71 +msgid "Spool of copper wire" +msgstr "" + +#: craftitems.lua:77 +msgid "Spool of silver wire" +msgstr "" + +#: craftitems.lua:83 +msgid "Spool of gold wire" +msgstr "" + +#: craftitems.lua:89 +msgid "Spool of stainless steel wire" +msgstr "" + +#: craftitems.lua:95 +msgid "Spool of aluminum wire" +msgstr "" + +#: craftitems.lua:101 +msgid "Steel Strip" +msgstr "" + +#: craftitems.lua:107 +msgid "Copper Strip" +msgstr "" + +#: craftitems.lua:113 +msgid "Lead Strip" +msgstr "" + +#: craftitems.lua:119 +msgid "Gold Strip" +msgstr "" + +#: craftitems.lua:125 +msgid "Stainless Steel Strip" +msgstr "" + +#: craftitems.lua:131 +msgid "Aluminum Strip" +msgstr "" + +#: craftitems.lua:137 +msgid "Steel Bar" +msgstr "" + +#: craftitems.lua:142 +msgid "Carbon Steel Bar" +msgstr "" + +#: craftitems.lua:147 +msgid "Stainless Steel Bar" +msgstr "" + +#: craftitems.lua:152 +msgid "Aluminum Bar" +msgstr "" + +#: craftitems.lua:157 +msgid "Chainlinks (brass)" +msgstr "" + +#: craftitems.lua:163 +msgid "Chainlinks (steel)" +msgstr "" + +#: craftitems.lua:169 +msgid "Brass Ingot" +msgstr "" + +#: craftitems.lua:174 +msgid "Steel gear" +msgstr "" + +#: craftitems.lua:179 +msgid "Padlock" +msgstr "" + +#: nodes.lua:6 +msgid "Cement" +msgstr "" + +#: nodes.lua:15 +msgid "Concrete Block" +msgstr "" + +#: nodes.lua:24 +msgid "Chain (steel, hanging)" +msgstr "" + +#: nodes.lua:40 +msgid "Chain (brass, hanging)" +msgstr "" + +#: nodes.lua:56 +msgid "Brass Block" +msgstr "" diff --git a/mods/basic_materials/locale/basic_materials.ru.po b/mods/basic_materials/locale/basic_materials.ru.po new file mode 100644 index 0000000..03cd1d2 --- /dev/null +++ b/mods/basic_materials/locale/basic_materials.ru.po @@ -0,0 +1,169 @@ +# Russian translations for basic_materials package. +# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the basic_materials package. +# Automatically generated from basic_materials.ru.tr +# +msgid "" +msgstr "" +"Project-Id-Version: basic_materials\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-31 10:11-0500\n" +"PO-Revision-Date: 2026-07-31 10:11-0500\n" +"Last-Translator: \n" +"Language-Team: Russian\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: craftitems.lua:20 +msgid "Oil extract" +msgstr "Масляный Экстракт" + +#: craftitems.lua:25 +msgid "Unprocessed paraffin" +msgstr "Необработанный Парафин" + +#: craftitems.lua:30 +msgid "Uncooked Terracotta Base" +msgstr "Ком Мокрого Терракота" + +#: craftitems.lua:35 +msgid "Wet Cement" +msgstr "Ком Мокрого Цемента" + +#: craftitems.lua:40 +msgid "Silicon lump" +msgstr "Кусок Кремния" + +#: craftitems.lua:45 +msgid "Simple Integrated Circuit" +msgstr "Микросхема" + +#: craftitems.lua:50 +msgid "Simple Motor" +msgstr "Мотор" + +#: craftitems.lua:55 +msgid "Heating element" +msgstr "Нить Накала" + +#: craftitems.lua:60 +msgid "Simple energy crystal" +msgstr "Энергетический Кристалл" + +#: craftitems.lua:65 +msgid "Spool of steel wire" +msgstr "Катушка Стальной Проволоки" + +#: craftitems.lua:71 +msgid "Spool of copper wire" +msgstr "Катушка Медной Проволоки" + +#: craftitems.lua:77 +msgid "Spool of silver wire" +msgstr "Катушка Серебрянной Проволоки" + +#: craftitems.lua:83 +msgid "Spool of gold wire" +msgstr "Катушка Золотой Проволоки" + +#: craftitems.lua:89 +msgid "Spool of stainless steel wire" +msgstr "" + +#: craftitems.lua:95 +msgid "Spool of aluminum wire" +msgstr "" + +#: craftitems.lua:101 +msgid "Steel Strip" +msgstr "Стальная Полоса" + +#: craftitems.lua:107 +msgid "Copper Strip" +msgstr "Медная Полоса" + +#: craftitems.lua:113 +msgid "Lead Strip" +msgstr "" + +#: craftitems.lua:119 +msgid "Gold Strip" +msgstr "" + +#: craftitems.lua:125 +msgid "Stainless Steel Strip" +msgstr "" + +#: craftitems.lua:131 +msgid "Aluminum Strip" +msgstr "" + +#: craftitems.lua:137 +msgid "Steel Bar" +msgstr "Стальной Прут" + +#: craftitems.lua:142 +msgid "Carbon Steel Bar" +msgstr "" + +#: craftitems.lua:147 +msgid "Stainless Steel Bar" +msgstr "" + +#: craftitems.lua:152 +msgid "Aluminum Bar" +msgstr "" + +#: craftitems.lua:157 +msgid "Chainlinks (brass)" +msgstr "Латунные Звенья" + +#: craftitems.lua:163 +msgid "Chainlinks (steel)" +msgstr "Стальные Звенья" + +#: craftitems.lua:169 +msgid "Brass Ingot" +msgstr "Латунный Брусок" + +#: craftitems.lua:174 +msgid "Steel gear" +msgstr "Стальная Шестерня" + +#: craftitems.lua:179 +msgid "Padlock" +msgstr "Навесной Замок" + +#: craftitems.lua:4 +msgid "Plastic sheet" +msgstr "Пластиковый Лист" + +#: craftitems.lua:9 +msgid "Plastic strips" +msgstr "Пластиковая Полоса" + +#: craftitems.lua:15 +msgid "Empty wire spool" +msgstr "Пустая Катушка" + +#: nodes.lua:6 +msgid "Cement" +msgstr "Цемент" + +#: nodes.lua:15 +msgid "Concrete Block" +msgstr "Железобетон" + +#: nodes.lua:24 +msgid "Chain (steel, hanging)" +msgstr "Стальная Цепь" + +#: nodes.lua:40 +msgid "Chain (brass, hanging)" +msgstr "Латунная Цепь" + +#: nodes.lua:56 +msgid "Brass Block" +msgstr "Латунный Блок" diff --git a/mods/basic_materials/locale/basic_materials.uk.po b/mods/basic_materials/locale/basic_materials.uk.po new file mode 100644 index 0000000..799ef16 --- /dev/null +++ b/mods/basic_materials/locale/basic_materials.uk.po @@ -0,0 +1,169 @@ +# Ukrainian translations for basic_materials package. +# Copyright (C) 2026 THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the basic_materials package. +# Automatically generated from basic_materials.uk.tr +# +msgid "" +msgstr "" +"Project-Id-Version: basic_materials\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-07-31 10:11-0500\n" +"PO-Revision-Date: 2026-07-31 10:11-0500\n" +"Last-Translator: \n" +"Language-Team: Ukrainian\n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: craftitems.lua:20 +msgid "Oil extract" +msgstr "Олійний екстракт" + +#: craftitems.lua:25 +msgid "Unprocessed paraffin" +msgstr "Необроблений парафін" + +#: craftitems.lua:30 +msgid "Uncooked Terracotta Base" +msgstr "Сира теракотова основа" + +#: craftitems.lua:35 +msgid "Wet Cement" +msgstr "Мокрий цемент" + +#: craftitems.lua:40 +msgid "Silicon lump" +msgstr "Шмат Кремнію" + +#: craftitems.lua:45 +msgid "Simple Integrated Circuit" +msgstr "Мікросхема" + +#: craftitems.lua:50 +msgid "Simple Motor" +msgstr "Двигун" + +#: craftitems.lua:55 +msgid "Heating element" +msgstr "Нагрівательний елемент" + +#: craftitems.lua:60 +msgid "Simple energy crystal" +msgstr "Енергетичний кристал" + +#: craftitems.lua:65 +msgid "Spool of steel wire" +msgstr "Катушка сталевої проволки" + +#: craftitems.lua:71 +msgid "Spool of copper wire" +msgstr "Катушка мідної проволки" + +#: craftitems.lua:77 +msgid "Spool of silver wire" +msgstr "Катушка срібної проволки" + +#: craftitems.lua:83 +msgid "Spool of gold wire" +msgstr "Катушка золотої проволки" + +#: craftitems.lua:89 +msgid "Spool of stainless steel wire" +msgstr "Котушка дроту з нержавіючої сталі" + +#: craftitems.lua:95 +msgid "Spool of aluminum wire" +msgstr "Котушка алюмінієвого дроту" + +#: craftitems.lua:101 +msgid "Steel Strip" +msgstr "Сталева стрічка" + +#: craftitems.lua:107 +msgid "Copper Strip" +msgstr "Мідна стрічка" + +#: craftitems.lua:113 +msgid "Lead Strip" +msgstr "Свинцева смужка" + +#: craftitems.lua:119 +msgid "Gold Strip" +msgstr "Золота смужка" + +#: craftitems.lua:125 +msgid "Stainless Steel Strip" +msgstr "Смужка з нержавіючої сталі" + +#: craftitems.lua:131 +msgid "Aluminum Strip" +msgstr "Алюмінієва смужка" + +#: craftitems.lua:137 +msgid "Steel Bar" +msgstr "Сталевий Прут" + +#: craftitems.lua:142 +msgid "Carbon Steel Bar" +msgstr "Брусок вуглецевої сталі" + +#: craftitems.lua:147 +msgid "Stainless Steel Bar" +msgstr "Брусок нержавіючої сталі" + +#: craftitems.lua:152 +msgid "Aluminum Bar" +msgstr "Алюмінієвий брусок" + +#: craftitems.lua:157 +msgid "Chainlinks (brass)" +msgstr "Латунний ланцюг" + +#: craftitems.lua:163 +msgid "Chainlinks (steel)" +msgstr "Сталевий ланцюг" + +#: craftitems.lua:169 +msgid "Brass Ingot" +msgstr "Латунний злиток" + +#: craftitems.lua:174 +msgid "Steel gear" +msgstr "Сталева шестерня" + +#: craftitems.lua:179 +msgid "Padlock" +msgstr "Навісний замок" + +#: craftitems.lua:4 +msgid "Plastic sheet" +msgstr "Лист пластику" + +#: craftitems.lua:9 +msgid "Plastic strips" +msgstr "Стрічка пластику" + +#: craftitems.lua:15 +msgid "Empty wire spool" +msgstr "Порожня катушка" + +#: nodes.lua:6 +msgid "Cement" +msgstr "Цемент" + +#: nodes.lua:15 +msgid "Concrete Block" +msgstr "Бетонний блок" + +#: nodes.lua:24 +msgid "Chain (steel, hanging)" +msgstr "Ланцюг (сталевий, підвісний)" + +#: nodes.lua:40 +msgid "Chain (brass, hanging)" +msgstr "Ланцюг (латунь, підвісна)" + +#: nodes.lua:56 +msgid "Brass Block" +msgstr "Латунний блок" diff --git a/mods/basic_materials/mod.conf b/mods/basic_materials/mod.conf new file mode 100644 index 0000000..5b541e1 --- /dev/null +++ b/mods/basic_materials/mod.conf @@ -0,0 +1,6 @@ +name = basic_materials +title = Basic Materials +description = Adds basic material nodes and items. +depends = xcompat +optional_depends = moreores, default, mesecons_materials, dye, bucket, fl_stone, fl_trees, mcl_sounds, hades_core, hades_sounds, hades_materials, hades_dye, hades_bucket, hades_extraores, hades_mesecons_materials, aloz, rp_crafting, mcl_core, mcl_copper +min_minetest_version = 5.10 diff --git a/mods/basic_materials/models/basic_materials_chains.obj b/mods/basic_materials/models/basic_materials_chains.obj new file mode 100644 index 0000000..78724c9 --- /dev/null +++ b/mods/basic_materials/models/basic_materials_chains.obj @@ -0,0 +1,881 @@ +# Blender v2.73 (sub 0) OBJ File: 'chains.blend' +# www.blender.org +o Torus.016_Torus +v 0.000000 -0.429978 0.000002 +v 0.000000 -0.401109 0.055211 +v -0.014044 -0.391975 0.048870 +v -0.014044 -0.423304 0.000002 +v -0.009826 -0.379748 0.040970 +v -0.009826 -0.406012 0.000002 +v 0.009826 -0.379748 0.040970 +v 0.009826 -0.406012 0.000002 +v 0.014044 -0.391975 0.048870 +v 0.014044 -0.423304 0.000002 +v 0.000000 -0.316336 0.080195 +v -0.014044 -0.316336 0.069112 +v -0.009826 -0.316336 0.057941 +v 0.009826 -0.316336 0.057941 +v 0.014044 -0.316336 0.069112 +v 0.000000 -0.231564 0.055211 +v -0.014044 -0.240700 0.048870 +v -0.009826 -0.252925 0.040970 +v 0.009826 -0.252925 0.040970 +v 0.014044 -0.240700 0.048870 +v 0.000000 -0.202695 0.000002 +v -0.014044 -0.209368 0.000002 +v -0.009826 -0.226661 0.000002 +v 0.009826 -0.226661 0.000002 +v 0.014044 -0.209368 0.000002 +v 0.000000 -0.231564 -0.055206 +v -0.014044 -0.240700 -0.048868 +v -0.009826 -0.252925 -0.040967 +v 0.009826 -0.252925 -0.040967 +v 0.014044 -0.240700 -0.048865 +v 0.000000 -0.316336 -0.080190 +v -0.014044 -0.316336 -0.069108 +v -0.009826 -0.316336 -0.057936 +v 0.009826 -0.316336 -0.057936 +v 0.014044 -0.316336 -0.069108 +v 0.000000 -0.400361 -0.055206 +v -0.014044 -0.391975 -0.048868 +v -0.009826 -0.379748 -0.040967 +v 0.009826 -0.379748 -0.040967 +v 0.014044 -0.391975 -0.048868 +v 0.000000 -0.262249 0.000002 +v -0.061672 -0.233381 0.000002 +v -0.054590 -0.224245 -0.012569 +v 0.000000 -0.255577 -0.012569 +v -0.045765 -0.212018 -0.008794 +v 0.000000 -0.238285 -0.008794 +v -0.045765 -0.212018 0.008798 +v 0.000000 -0.238285 0.008798 +v -0.054590 -0.224245 0.012574 +v 0.000000 -0.255577 0.012574 +v -0.089582 -0.148609 0.000002 +v -0.077200 -0.148609 -0.012569 +v -0.064722 -0.148609 -0.008794 +v -0.064722 -0.148609 0.008799 +v -0.077200 -0.148609 0.012574 +v -0.061672 -0.063837 0.000002 +v -0.054590 -0.072971 -0.012569 +v -0.045765 -0.085198 -0.008794 +v -0.045765 -0.085198 0.008799 +v -0.054590 -0.072971 0.012574 +v 0.000000 -0.034967 0.000002 +v 0.000000 -0.041641 -0.012569 +v 0.000000 -0.058933 -0.008794 +v 0.000000 -0.058933 0.008799 +v 0.000000 -0.041641 0.012574 +v 0.061672 -0.063837 0.000002 +v 0.054590 -0.072971 -0.012569 +v 0.045765 -0.085198 -0.008794 +v 0.045765 -0.085198 0.008799 +v 0.054590 -0.072971 0.012574 +v 0.089582 -0.148609 0.000002 +v 0.077200 -0.148609 -0.012569 +v 0.064722 -0.148609 -0.008794 +v 0.064722 -0.148609 0.008799 +v 0.077200 -0.148609 0.012574 +v 0.061672 -0.232631 0.000002 +v 0.054590 -0.224245 -0.012569 +v 0.045765 -0.212018 -0.008794 +v 0.045765 -0.212018 0.008798 +v 0.054590 -0.224245 0.012574 +v 0.000000 0.073316 0.000002 +v 0.061672 0.102183 0.000002 +v 0.054590 0.111319 0.012574 +v 0.000000 0.079988 0.012574 +v 0.045765 0.123546 0.008799 +v 0.000000 0.097280 0.008799 +v 0.045765 0.123546 -0.008794 +v 0.000000 0.097280 -0.008794 +v 0.054590 0.111319 -0.012569 +v 0.000000 0.079988 -0.012569 +v 0.089582 0.186956 0.000002 +v 0.077200 0.186956 0.012574 +v 0.064722 0.186956 0.008799 +v 0.064722 0.186956 -0.008794 +v 0.077200 0.186956 -0.012569 +v 0.061672 0.271728 0.000002 +v 0.054590 0.262594 0.012574 +v 0.045765 0.250367 0.008799 +v 0.045765 0.250367 -0.008794 +v 0.054590 0.262594 -0.012569 +v 0.000000 0.300597 0.000002 +v 0.000000 0.293923 0.012574 +v 0.000000 0.276631 0.008799 +v 0.000000 0.276631 -0.008794 +v 0.000000 0.293923 -0.012569 +v -0.061672 0.271728 0.000002 +v -0.054590 0.262594 0.012574 +v -0.045765 0.250367 0.008799 +v -0.045765 0.250367 -0.008794 +v -0.054590 0.262594 -0.012569 +v -0.089582 0.186956 0.000002 +v -0.077200 0.186956 0.012574 +v -0.064722 0.186956 0.008799 +v -0.064722 0.186956 -0.008794 +v -0.077200 0.186956 -0.012569 +v -0.061672 0.102931 0.000002 +v -0.054590 0.111319 0.012574 +v -0.045765 0.123546 0.008799 +v -0.045765 0.123546 -0.008794 +v -0.054590 0.111319 -0.012569 +v 0.000000 -0.095037 0.000002 +v 0.000000 -0.066168 -0.055206 +v 0.014044 -0.057034 -0.048868 +v 0.014044 -0.088363 0.000002 +v 0.009826 -0.044807 -0.040967 +v 0.009826 -0.071071 0.000002 +v -0.009826 -0.044807 -0.040967 +v -0.009826 -0.071071 0.000002 +v -0.014044 -0.057034 -0.048868 +v -0.014044 -0.088363 0.000002 +v 0.000000 0.018605 -0.080190 +v 0.014044 0.018605 -0.069108 +v 0.009826 0.018605 -0.057936 +v -0.009826 0.018605 -0.057936 +v -0.014044 0.018605 -0.069108 +v 0.000000 0.103377 -0.055206 +v 0.014044 0.094243 -0.048868 +v 0.009826 0.082016 -0.040967 +v -0.009826 0.082016 -0.040967 +v -0.014044 0.094243 -0.048868 +v 0.000000 0.132246 0.000002 +v 0.014044 0.125572 0.000002 +v 0.009826 0.108280 0.000002 +v -0.009826 0.108280 0.000002 +v -0.014044 0.125572 0.000002 +v 0.000000 0.103377 0.055211 +v 0.014044 0.094243 0.048870 +v 0.009826 0.082016 0.040970 +v -0.009826 0.082016 0.040970 +v -0.014044 0.094243 0.048870 +v 0.000000 0.018605 0.080195 +v 0.014044 0.018605 0.069112 +v 0.009826 0.018605 0.057941 +v -0.009826 0.018605 0.057941 +v -0.014044 0.018605 0.069112 +v 0.000000 -0.065420 0.055211 +v 0.014044 -0.057032 0.048870 +v 0.009826 -0.044807 0.040970 +v -0.009826 -0.044807 0.040970 +v -0.014044 -0.057032 0.048870 +v 0.000000 -0.598329 0.000002 +v 0.061672 -0.569460 0.000002 +v 0.054590 -0.560326 0.012574 +v 0.000000 -0.591655 0.012574 +v 0.045765 -0.548099 0.008798 +v 0.000000 -0.574363 0.008798 +v 0.045765 -0.548099 -0.008794 +v 0.000000 -0.574363 -0.008794 +v 0.054590 -0.560326 -0.012569 +v 0.000000 -0.591655 -0.012569 +v 0.089582 -0.484687 0.000002 +v 0.077200 -0.484687 0.012574 +v 0.064722 -0.484687 0.008798 +v 0.064722 -0.484687 -0.008794 +v 0.077200 -0.484687 -0.012569 +v 0.061672 -0.399915 0.000002 +v 0.054590 -0.409051 0.012574 +v 0.045765 -0.421278 0.008798 +v 0.045765 -0.421278 -0.008794 +v 0.054590 -0.409051 -0.012569 +v 0.000000 -0.371048 0.000002 +v 0.000000 -0.377719 0.012574 +v 0.000000 -0.395012 0.008798 +v 0.000000 -0.395012 -0.008794 +v 0.000000 -0.377719 -0.012569 +v -0.061672 -0.399915 0.000002 +v -0.054590 -0.409051 0.012574 +v -0.045765 -0.421278 0.008798 +v -0.045765 -0.421278 -0.008794 +v -0.054590 -0.409051 -0.012569 +v -0.089582 -0.484687 0.000002 +v -0.077200 -0.484687 0.012574 +v -0.064722 -0.484687 0.008798 +v -0.064722 -0.484687 -0.008794 +v -0.077200 -0.484687 -0.012569 +v -0.061672 -0.568712 0.000002 +v -0.054590 -0.560326 0.012574 +v -0.045765 -0.548099 0.008798 +v -0.045765 -0.548099 -0.008794 +v -0.054590 -0.560326 -0.012569 +v 0.000000 0.241043 0.000002 +v 0.000000 0.269910 0.055211 +v -0.014044 0.279047 0.048870 +v -0.014044 0.247717 0.000002 +v -0.009826 0.291274 0.040970 +v -0.009826 0.265007 0.000002 +v 0.009826 0.291274 0.040970 +v 0.009826 0.265007 0.000002 +v 0.014044 0.279047 0.048870 +v 0.014044 0.247717 0.000002 +v 0.000000 0.354683 0.080195 +v -0.014044 0.354683 0.069112 +v -0.009826 0.354683 0.057941 +v 0.009826 0.354683 0.057941 +v 0.014044 0.354683 0.069112 +v 0.000000 0.439455 0.055211 +v -0.014044 0.430321 0.048870 +v -0.009826 0.418094 0.040970 +v 0.009826 0.418094 0.040970 +v 0.014044 0.430321 0.048870 +v 0.000000 0.468325 0.000002 +v -0.014044 0.461651 0.000002 +v -0.009826 0.444361 0.000002 +v 0.009826 0.444361 0.000002 +v 0.014044 0.461651 0.000002 +v 0.000000 0.439455 -0.055206 +v -0.014044 0.430321 -0.048868 +v -0.009826 0.418094 -0.040967 +v 0.009826 0.418094 -0.040967 +v 0.014044 0.430321 -0.048868 +v 0.000000 0.354683 -0.080190 +v -0.014044 0.354683 -0.069108 +v -0.009826 0.354683 -0.057936 +v 0.009826 0.354683 -0.057936 +v 0.014044 0.354683 -0.069108 +v 0.000000 0.270661 -0.055206 +v -0.014044 0.279047 -0.048868 +v -0.009826 0.291274 -0.040967 +v 0.009826 0.291274 -0.040967 +v 0.014044 0.279047 -0.048868 +vt 0.187500 0.125000 +vt 0.250000 0.125000 +vt 0.250000 0.187500 +vt 0.187500 0.187500 +vt 0.250000 0.250000 +vt 0.187500 0.250000 +vt 0.250000 0.312500 +vt 0.187500 0.312500 +vt 0.250000 0.375000 +vt 0.187500 0.375000 +vt 0.187500 0.062500 +vt 0.250000 0.062500 +vt 0.312500 0.125000 +vt 0.312500 0.187500 +vt 0.312500 0.250000 +vt 0.312500 0.312500 +vt 0.312500 0.375000 +vt 0.312500 0.062500 +vt 0.375000 0.125000 +vt 0.375000 0.187500 +vt 0.375000 0.250000 +vt 0.375000 0.312500 +vt 0.375000 0.375000 +vt 0.375000 0.062500 +vt 0.437500 0.125000 +vt 0.437500 0.187500 +vt 0.437500 0.250000 +vt 0.437500 0.312500 +vt 0.437500 0.375000 +vt 0.437500 0.062500 +vt 0.500000 0.125000 +vt 0.500000 0.187500 +vt 0.500000 0.250000 +vt 0.500000 0.312500 +vt 0.500000 0.375000 +vt 0.500000 0.062500 +vt -0.000000 0.125000 +vt 0.062500 0.125000 +vt 0.062500 0.187500 +vt -0.000000 0.187500 +vt 0.062500 0.250000 +vt -0.000000 0.250000 +vt 0.062500 0.312500 +vt -0.000000 0.312500 +vt 0.062500 0.375000 +vt -0.000000 0.375000 +vt -0.000000 0.062500 +vt 0.062500 0.062500 +vt 0.125000 0.125000 +vt 0.125000 0.187500 +vt 0.125000 0.250000 +vt 0.125000 0.312500 +vt 0.125000 0.375000 +vt 0.125000 0.062500 +vt 0.750000 0.625000 +vt 0.812500 0.625000 +vt 0.812500 0.687500 +vt 0.750000 0.687500 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.437500 +vt 0.750000 0.437500 +vt 0.812500 0.500000 +vt 0.750000 0.500000 +vt 0.812500 0.562500 +vt 0.750000 0.562500 +vt 0.875000 0.625000 +vt 0.875000 0.687500 +vt 0.875000 0.375000 +vt 0.875000 0.437500 +vt 0.875000 0.500000 +vt 0.875000 0.562500 +vt 0.937500 0.625000 +vt 0.937500 0.687500 +vt 0.937500 0.375000 +vt 0.937500 0.437500 +vt 0.937500 0.500000 +vt 0.937500 0.562500 +vt 1.000000 0.625000 +vt 1.000000 0.687500 +vt 1.000000 0.375000 +vt 1.000000 0.437500 +vt 1.000000 0.500000 +vt 1.000000 0.562500 +vt 0.500000 0.625000 +vt 0.562500 0.625000 +vt 0.562500 0.687500 +vt 0.500000 0.687500 +vt 0.562500 0.375000 +vt 0.562500 0.437500 +vt 0.500000 0.437500 +vt 0.562500 0.500000 +vt 0.500000 0.500000 +vt 0.562500 0.562500 +vt 0.500000 0.562500 +vt 0.625000 0.625000 +vt 0.625000 0.687500 +vt 0.625000 0.375000 +vt 0.625000 0.437500 +vt 0.625000 0.500000 +vt 0.625000 0.562500 +vt 0.687500 0.625000 +vt 0.687500 0.687500 +vt 0.687500 0.375000 +vt 0.687500 0.437500 +vt 0.687500 0.500000 +vt 0.687500 0.562500 +vt 0.250000 0.625000 +vt 0.312500 0.625000 +vt 0.312500 0.687500 +vt 0.250000 0.687500 +vt 0.312500 0.437500 +vt 0.250000 0.437500 +vt 0.312500 0.500000 +vt 0.250000 0.500000 +vt 0.312500 0.562500 +vt 0.250000 0.562500 +vt 0.375000 0.625000 +vt 0.375000 0.687500 +vt 0.375000 0.437500 +vt 0.375000 0.500000 +vt 0.375000 0.562500 +vt 0.437500 0.625000 +vt 0.437500 0.687500 +vt 0.437500 0.437500 +vt 0.437500 0.500000 +vt 0.437500 0.562500 +vt -0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.062500 0.687500 +vt -0.000000 0.687500 +vt 0.062500 0.437500 +vt -0.000000 0.437500 +vt 0.062500 0.500000 +vt -0.000000 0.500000 +vt 0.062500 0.562500 +vt -0.000000 0.562500 +vt 0.125000 0.625000 +vt 0.125000 0.687500 +vt 0.125000 0.437500 +vt 0.125000 0.500000 +vt 0.125000 0.562500 +vt 0.187500 0.625000 +vt 0.187500 0.687500 +vt 0.187500 0.437500 +vt 0.187500 0.500000 +vt 0.187500 0.562500 +vt 0.687500 0.750000 +vt 0.750000 0.750000 +vt 0.750000 0.812500 +vt 0.687500 0.812500 +vt 0.750000 0.875000 +vt 0.687500 0.875000 +vt 0.750000 0.937500 +vt 0.687500 0.937500 +vt 0.750000 1.000000 +vt 0.687500 1.000000 +vt 0.812500 0.750000 +vt 0.812500 0.812500 +vt 0.812500 0.875000 +vt 0.812500 0.937500 +vt 0.812500 1.000000 +vt 0.875000 0.750000 +vt 0.875000 0.812500 +vt 0.875000 0.875000 +vt 0.875000 0.937500 +vt 0.875000 1.000000 +vt 0.937500 0.750000 +vt 0.937500 0.812500 +vt 0.937500 0.875000 +vt 0.937500 0.937500 +vt 0.937500 1.000000 +vt 1.000000 0.750000 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 1.000000 0.937500 +vt 1.000000 1.000000 +vt 0.500000 0.750000 +vt 0.562500 0.750000 +vt 0.562500 0.812500 +vt 0.500000 0.812500 +vt 0.562500 0.875000 +vt 0.500000 0.875000 +vt 0.562500 0.937500 +vt 0.500000 0.937500 +vt 0.562500 1.000000 +vt 0.500000 1.000000 +vt 0.625000 0.750000 +vt 0.625000 0.812500 +vt 0.625000 0.875000 +vt 0.625000 0.937500 +vt 0.625000 1.000000 +vt 0.750000 0.312500 +vt 0.812500 0.312500 +vt 0.750000 0.062500 +vt 0.812500 0.062500 +vt 0.812500 0.125000 +vt 0.750000 0.125000 +vt 0.812500 0.187500 +vt 0.750000 0.187500 +vt 0.812500 0.250000 +vt 0.750000 0.250000 +vt 0.875000 0.312500 +vt 0.875000 0.062500 +vt 0.875000 0.125000 +vt 0.875000 0.187500 +vt 0.875000 0.250000 +vt 0.937500 0.312500 +vt 0.937500 0.062500 +vt 0.937500 0.125000 +vt 0.937500 0.187500 +vt 0.937500 0.250000 +vt 1.000000 0.312500 +vt 1.000000 0.062500 +vt 1.000000 0.125000 +vt 1.000000 0.187500 +vt 1.000000 0.250000 +vt 0.562500 0.312500 +vt 0.562500 0.062500 +vt 0.562500 0.125000 +vt 0.562500 0.187500 +vt 0.562500 0.250000 +vt 0.625000 0.312500 +vt 0.625000 0.062500 +vt 0.625000 0.125000 +vt 0.625000 0.187500 +vt 0.625000 0.250000 +vt 0.687500 0.312500 +vt 0.687500 0.062500 +vt 0.687500 0.125000 +vt 0.687500 0.187500 +vt 0.687500 0.250000 +vt 0.250000 0.937500 +vt 0.312500 0.937500 +vt 0.312500 1.000000 +vt 0.250000 1.000000 +vt 0.312500 0.750000 +vt 0.250000 0.750000 +vt 0.312500 0.812500 +vt 0.250000 0.812500 +vt 0.312500 0.875000 +vt 0.250000 0.875000 +vt 0.375000 0.937500 +vt 0.375000 1.000000 +vt 0.375000 0.750000 +vt 0.375000 0.812500 +vt 0.375000 0.875000 +vt 0.437500 0.937500 +vt 0.437500 1.000000 +vt 0.437500 0.750000 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.000000 0.937500 +vt 0.062500 0.937500 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.062500 0.750000 +vt 0.000000 0.750000 +vt 0.062500 0.812500 +vt 0.000000 0.812500 +vt 0.062500 0.875000 +vt 0.000000 0.875000 +vt 0.125000 0.937500 +vt 0.125000 1.000000 +vt 0.125000 0.750000 +vt 0.125000 0.812500 +vt 0.125000 0.875000 +vt 0.187500 0.937500 +vt 0.187500 1.000000 +vt 0.187500 0.750000 +vt 0.187500 0.812500 +vt 0.187500 0.875000 +vn 0.000000 -1.000000 -0.004800 +vn 0.000000 -0.657400 0.753500 +vn -0.898300 -0.248500 0.362300 +vn -0.863600 -0.504100 -0.003400 +vn -0.661500 0.421500 -0.620200 +vn -0.746000 0.665900 0.000000 +vn 0.661500 0.421500 -0.620200 +vn 0.746000 0.665900 0.000000 +vn 0.898300 -0.248500 0.362300 +vn 0.863600 -0.504100 -0.003400 +vn 0.000000 0.000000 1.000000 +vn -0.925200 0.000000 0.379500 +vn -0.617100 0.000000 -0.786900 +vn 0.617100 0.000000 -0.786900 +vn 0.925200 0.000000 0.379500 +vn 0.000000 0.657400 0.753500 +vn -0.898300 0.248400 0.362300 +vn -0.661500 -0.421500 -0.620200 +vn 0.661500 -0.421500 -0.620200 +vn 0.898300 0.248400 0.362300 +vn 0.000000 1.000000 0.000000 +vn -0.866100 0.499800 0.000000 +vn -0.746000 -0.665900 0.000000 +vn 0.746000 -0.665900 0.000000 +vn 0.866100 0.499800 0.000000 +vn 0.000000 0.657400 -0.753500 +vn -0.898300 0.248400 -0.362400 +vn -0.661600 -0.421500 0.620200 +vn 0.661500 -0.421500 0.620200 +vn 0.898300 0.248400 -0.362300 +vn 0.000000 -0.000900 -1.000000 +vn -0.924600 -0.000600 -0.380700 +vn -0.617100 0.000000 0.786900 +vn 0.617100 0.000000 0.786900 +vn 0.924700 -0.000600 -0.380700 +vn 0.000000 -0.650300 -0.759600 +vn -0.895600 -0.254600 -0.364800 +vn -0.661600 0.421500 0.620200 +vn 0.661600 0.421500 0.620200 +vn 0.895600 -0.254600 -0.364800 +vn 0.004900 -1.000000 0.000000 +vn -0.729700 -0.683800 0.000000 +vn -0.324500 -0.256300 -0.910500 +vn 0.003300 -0.475500 -0.879700 +vn 0.578700 0.436200 -0.689100 +vn 0.000000 0.666600 -0.745400 +vn 0.578700 0.436200 0.689100 +vn 0.000000 0.666600 0.745400 +vn -0.324500 -0.256300 0.910500 +vn 0.003300 -0.475500 0.879700 +vn -1.000000 0.000000 0.000000 +vn -0.359600 0.000000 -0.933100 +vn 0.756400 0.000000 -0.654100 +vn 0.756400 0.000000 0.654100 +vn -0.359600 0.000000 0.933100 +vn -0.729700 0.683700 0.000000 +vn -0.324500 0.256300 -0.910500 +vn 0.578700 -0.436200 -0.689100 +vn 0.578700 -0.436200 0.689100 +vn -0.324500 0.256300 0.910500 +vn 0.000000 0.470900 -0.882200 +vn 0.000000 -0.666600 -0.745400 +vn 0.000000 -0.666600 0.745400 +vn 0.000000 0.470900 0.882200 +vn 0.729700 0.683700 0.000000 +vn 0.324500 0.256300 -0.910500 +vn -0.578700 -0.436200 -0.689100 +vn -0.578700 -0.436200 0.689100 +vn 0.324500 0.256300 0.910500 +vn 1.000000 -0.001100 0.000000 +vn 0.361000 -0.000700 -0.932600 +vn -0.756400 0.000000 -0.654100 +vn -0.756400 0.000000 0.654100 +vn 0.361000 -0.000700 0.932600 +vn 0.736100 -0.676800 0.000000 +vn 0.327100 -0.263100 -0.907600 +vn -0.578700 0.436200 -0.689100 +vn -0.578700 0.436200 0.689100 +vn 0.327100 -0.263100 0.907600 +vn -0.004900 -1.000000 0.000000 +vn 0.729700 -0.683800 0.000000 +vn 0.324500 -0.256300 0.910500 +vn -0.003300 -0.475400 0.879700 +vn 0.324500 -0.256300 -0.910500 +vn -0.003300 -0.475400 -0.879700 +vn 1.000000 0.000000 0.000000 +vn 0.359600 0.000000 0.933100 +vn 0.359600 0.000000 -0.933100 +vn -1.000000 -0.001100 0.000000 +vn -0.361000 -0.000700 0.932600 +vn -0.361000 -0.000700 -0.932600 +vn -0.736100 -0.676800 0.000000 +vn -0.327100 -0.263100 0.907600 +vn -0.327100 -0.263100 -0.907600 +vn 0.000000 -1.000000 0.004800 +vn 0.000000 -0.657400 -0.753500 +vn 0.898300 -0.248500 -0.362400 +vn 0.863600 -0.504100 0.003400 +vn -0.898300 -0.248500 -0.362400 +vn -0.863600 -0.504100 0.003400 +vn 0.000000 0.000000 -1.000000 +vn 0.925200 0.000000 -0.379500 +vn -0.925200 0.000000 -0.379500 +vn 0.898300 0.248500 -0.362400 +vn 0.661600 -0.421500 0.620200 +vn -0.898300 0.248500 -0.362400 +vn 0.898300 0.248500 0.362300 +vn -0.898300 0.248500 0.362300 +vn 0.000000 -0.000900 1.000000 +vn 0.924700 -0.000600 0.380700 +vn -0.924700 -0.000600 0.380700 +vn 0.000000 -0.650300 0.759600 +vn 0.895600 -0.254600 0.364700 +vn -0.895600 -0.254600 0.364700 +vn 0.729700 -0.683700 0.000000 +vn 0.729700 0.683800 0.000000 +vn -0.729700 0.683800 0.000000 +vn -0.898300 -0.248400 0.362300 +vn -0.863600 -0.504100 -0.003500 +vn 0.898300 -0.248400 0.362300 +vn 0.863600 -0.504100 -0.003500 +vn -0.661500 -0.421500 0.620200 +vn 0.924600 -0.000600 -0.380700 +vn -0.661500 0.421500 0.620200 +vn 0.661500 0.421500 0.620200 +s 1 +f 1/1/1 2/2/2 3/3/3 4/4/4 +f 4/4/4 3/3/3 5/5/5 6/6/6 +f 6/6/6 5/5/5 7/7/7 8/8/8 +f 8/8/8 7/7/7 9/9/9 10/10/10 +f 1/1/1 10/11/10 9/12/9 2/2/2 +f 2/2/2 11/13/11 12/14/12 3/3/3 +f 3/3/3 12/14/12 13/15/13 5/5/5 +f 5/5/5 13/15/13 14/16/14 7/7/7 +f 7/7/7 14/16/14 15/17/15 9/9/9 +f 9/12/9 15/18/15 11/13/11 2/2/2 +f 11/13/11 16/19/16 17/20/17 12/14/12 +f 12/14/12 17/20/17 18/21/18 13/15/13 +f 13/15/13 18/21/18 19/22/19 14/16/14 +f 14/16/14 19/22/19 20/23/20 15/17/15 +f 15/18/15 20/24/20 16/19/16 11/13/11 +f 16/19/16 21/25/21 22/26/22 17/20/17 +f 17/20/17 22/26/22 23/27/23 18/21/18 +f 18/21/18 23/27/23 24/28/24 19/22/19 +f 19/22/19 24/28/24 25/29/25 20/23/20 +f 20/24/20 25/30/25 21/25/21 16/19/16 +f 21/25/21 26/31/26 27/32/27 22/26/22 +f 22/26/22 27/32/27 28/33/28 23/27/23 +f 23/27/23 28/33/28 29/34/29 24/28/24 +f 24/28/24 29/34/29 30/35/30 25/29/25 +f 25/30/25 30/36/30 26/31/26 21/25/21 +f 26/37/26 31/38/31 32/39/32 27/40/27 +f 27/40/27 32/39/32 33/41/33 28/42/28 +f 28/42/28 33/41/33 34/43/34 29/44/29 +f 29/44/29 34/43/34 35/45/35 30/46/30 +f 30/47/30 35/48/35 31/38/31 26/37/26 +f 31/38/31 36/49/36 37/50/37 32/39/32 +f 32/39/32 37/50/37 38/51/38 33/41/33 +f 33/41/33 38/51/38 39/52/39 34/43/34 +f 34/43/34 39/52/39 40/53/40 35/45/35 +f 35/48/35 40/54/40 36/49/36 31/38/31 +f 36/49/36 1/1/1 4/4/4 37/50/37 +f 37/50/37 4/4/4 6/6/6 38/51/38 +f 38/51/38 6/6/6 8/8/8 39/52/39 +f 39/52/39 8/8/8 10/10/10 40/53/40 +f 1/1/1 36/49/36 40/54/40 10/11/10 +f 41/55/41 42/56/42 43/57/43 44/58/44 +f 44/59/44 43/60/43 45/61/45 46/62/46 +f 46/62/46 45/61/45 47/63/47 48/64/48 +f 48/64/48 47/63/47 49/65/49 50/66/50 +f 41/55/41 50/66/50 49/65/49 42/56/42 +f 42/56/42 51/67/51 52/68/52 43/57/43 +f 43/60/43 52/69/52 53/70/53 45/61/45 +f 45/61/45 53/70/53 54/71/54 47/63/47 +f 47/63/47 54/71/54 55/72/55 49/65/49 +f 49/65/49 55/72/55 51/67/51 42/56/42 +f 51/67/51 56/73/56 57/74/57 52/68/52 +f 52/69/52 57/75/57 58/76/58 53/70/53 +f 53/70/53 58/76/58 59/77/59 54/71/54 +f 54/71/54 59/77/59 60/78/60 55/72/55 +f 55/72/55 60/78/60 56/73/56 51/67/51 +f 56/73/56 61/79/21 62/80/61 57/74/57 +f 57/75/57 62/81/61 63/82/62 58/76/58 +f 58/76/58 63/82/62 64/83/63 59/77/59 +f 59/77/59 64/83/63 65/84/64 60/78/60 +f 60/78/60 65/84/64 61/79/21 56/73/56 +f 61/85/21 66/86/65 67/87/66 62/88/61 +f 62/35/61 67/89/66 68/90/67 63/91/62 +f 63/91/62 68/90/67 69/92/68 64/93/63 +f 64/93/63 69/92/68 70/94/69 65/95/64 +f 65/95/64 70/94/69 66/86/65 61/85/21 +f 66/86/65 71/96/70 72/97/71 67/87/66 +f 67/89/66 72/98/71 73/99/72 68/90/67 +f 68/90/67 73/99/72 74/100/73 69/92/68 +f 69/92/68 74/100/73 75/101/74 70/94/69 +f 70/94/69 75/101/74 71/96/70 66/86/65 +f 71/96/70 76/102/75 77/103/76 72/97/71 +f 72/98/71 77/104/76 78/105/77 73/99/72 +f 73/99/72 78/105/77 79/106/78 74/100/73 +f 74/100/73 79/106/78 80/107/79 75/101/74 +f 75/101/74 80/107/79 76/102/75 71/96/70 +f 76/102/75 41/55/41 44/58/44 77/103/76 +f 77/104/76 44/59/44 46/62/46 78/105/77 +f 78/105/77 46/62/46 48/64/48 79/106/78 +f 79/106/78 48/64/48 50/66/50 80/107/79 +f 41/55/41 76/102/75 80/107/79 50/66/50 +f 81/108/80 82/109/81 83/110/82 84/111/83 +f 84/9/83 83/17/82 85/112/78 86/113/48 +f 86/113/48 85/112/78 87/114/77 88/115/46 +f 88/115/46 87/114/77 89/116/84 90/117/85 +f 81/108/80 90/117/85 89/116/84 82/109/81 +f 82/109/81 91/118/86 92/119/87 83/110/82 +f 83/17/82 92/23/87 93/120/73 85/112/78 +f 85/112/78 93/120/73 94/121/72 87/114/77 +f 87/114/77 94/121/72 95/122/88 89/116/84 +f 89/116/84 95/122/88 91/118/86 82/109/81 +f 91/118/86 96/123/65 97/124/69 92/119/87 +f 92/23/87 97/29/69 98/125/68 93/120/73 +f 93/120/73 98/125/68 99/126/67 94/121/72 +f 94/121/72 99/126/67 100/127/66 95/122/88 +f 95/122/88 100/127/66 96/123/65 91/118/86 +f 96/123/65 101/85/21 102/88/64 97/124/69 +f 97/29/69 102/35/64 103/91/63 98/125/68 +f 98/125/68 103/91/63 104/93/62 99/126/67 +f 99/126/67 104/93/62 105/95/61 100/127/66 +f 100/127/66 105/95/61 101/85/21 96/123/65 +f 101/128/21 106/129/56 107/130/60 102/131/64 +f 102/46/64 107/45/60 108/132/59 103/133/63 +f 103/133/63 108/132/59 109/134/58 104/135/62 +f 104/135/62 109/134/58 110/136/57 105/137/61 +f 105/137/61 110/136/57 106/129/56 101/128/21 +f 106/129/56 111/138/89 112/139/90 107/130/60 +f 107/45/60 112/53/90 113/140/54 108/132/59 +f 108/132/59 113/140/54 114/141/53 109/134/58 +f 109/134/58 114/141/53 115/142/91 110/136/57 +f 110/136/57 115/142/91 111/138/89 106/129/56 +f 111/138/89 116/143/92 117/144/93 112/139/90 +f 112/53/90 117/10/93 118/145/47 113/140/54 +f 113/140/54 118/145/47 119/146/45 114/141/53 +f 114/141/53 119/146/45 120/147/94 115/142/91 +f 115/142/91 120/147/94 116/143/92 111/138/89 +f 116/143/92 81/108/80 84/111/83 117/144/93 +f 117/10/93 84/9/83 86/113/48 118/145/47 +f 118/145/47 86/113/48 88/115/46 119/146/45 +f 119/146/45 88/115/46 90/117/85 120/147/94 +f 81/108/80 116/143/92 120/147/94 90/117/85 +f 121/148/95 122/149/96 123/150/97 124/151/98 +f 124/151/98 123/150/97 125/152/39 126/153/8 +f 126/153/8 125/152/39 127/154/38 128/155/6 +f 128/155/6 127/154/38 129/156/99 130/157/100 +f 121/148/95 130/103/100 129/58/99 122/149/96 +f 122/149/96 131/158/101 132/159/102 123/150/97 +f 123/150/97 132/159/102 133/160/34 125/152/39 +f 125/152/39 133/160/34 134/161/33 127/154/38 +f 127/154/38 134/161/33 135/162/103 129/156/99 +f 129/58/99 135/57/103 131/158/101 122/149/96 +f 131/158/101 136/163/26 137/164/104 132/159/102 +f 132/159/102 137/164/104 138/165/105 133/160/34 +f 133/160/34 138/165/105 139/166/28 134/161/33 +f 134/161/33 139/166/28 140/167/106 135/162/103 +f 135/57/103 140/68/106 136/163/26 131/158/101 +f 136/163/26 141/168/21 142/169/25 137/164/104 +f 137/164/104 142/169/25 143/170/24 138/165/105 +f 138/165/105 143/170/24 144/171/23 139/166/28 +f 139/166/28 144/171/23 145/172/22 140/167/106 +f 140/68/106 145/74/22 141/168/21 136/163/26 +f 141/168/21 146/173/16 147/174/107 142/169/25 +f 142/169/25 147/174/107 148/175/19 143/170/24 +f 143/170/24 148/175/19 149/176/18 144/171/23 +f 144/171/23 149/176/18 150/177/108 145/172/22 +f 145/74/22 150/80/108 146/173/16 141/168/21 +f 146/178/16 151/179/109 152/180/110 147/181/107 +f 147/181/107 152/180/110 153/182/14 148/183/19 +f 148/183/19 153/182/14 154/184/13 149/185/18 +f 149/185/18 154/184/13 155/186/111 150/187/108 +f 150/88/108 155/87/111 151/179/109 146/178/16 +f 151/179/109 156/188/112 157/189/113 152/180/110 +f 152/180/110 157/189/113 158/190/7 153/182/14 +f 153/182/14 158/190/7 159/191/5 154/184/13 +f 154/184/13 159/191/5 160/192/114 155/186/111 +f 155/87/111 160/97/114 156/188/112 151/179/109 +f 156/188/112 121/148/95 124/151/98 157/189/113 +f 157/189/113 124/151/98 126/153/8 158/190/7 +f 158/190/7 126/153/8 128/155/6 159/191/5 +f 159/191/5 128/155/6 130/157/100 160/192/114 +f 121/148/95 156/188/112 160/97/114 130/103/100 +f 161/193/80 162/194/115 163/60/82 164/59/83 +f 164/195/83 163/196/82 165/197/78 166/198/48 +f 166/198/48 165/197/78 167/199/77 168/200/46 +f 168/200/46 167/199/77 169/201/84 170/202/85 +f 161/193/80 170/202/85 169/201/84 162/194/115 +f 162/194/115 171/203/86 172/69/87 163/60/82 +f 163/196/82 172/204/87 173/205/73 165/197/78 +f 165/197/78 173/205/73 174/206/72 167/199/77 +f 167/199/77 174/206/72 175/207/88 169/201/84 +f 169/201/84 175/207/88 171/203/86 162/194/115 +f 171/203/86 176/208/116 177/75/69 172/69/87 +f 172/204/87 177/209/69 178/210/68 173/205/73 +f 173/205/73 178/210/68 179/211/67 174/206/72 +f 174/206/72 179/211/67 180/212/66 175/207/88 +f 175/207/88 180/212/66 176/208/116 171/203/86 +f 176/208/116 181/213/21 182/81/64 177/75/69 +f 177/209/69 182/214/64 183/215/63 178/210/68 +f 178/210/68 183/215/63 184/216/62 179/211/67 +f 179/211/67 184/216/62 185/217/61 180/212/66 +f 180/212/66 185/217/61 181/213/21 176/208/116 +f 181/34/21 186/218/117 187/89/60 182/35/64 +f 182/36/64 187/219/60 188/220/59 183/31/63 +f 183/31/63 188/220/59 189/221/58 184/32/62 +f 184/32/62 189/221/58 190/222/57 185/33/61 +f 185/33/61 190/222/57 186/218/117 181/34/21 +f 186/218/117 191/223/89 192/98/90 187/89/60 +f 187/219/60 192/224/90 193/225/54 188/220/59 +f 188/220/59 193/225/54 194/226/53 189/221/58 +f 189/221/58 194/226/53 195/227/91 190/222/57 +f 190/222/57 195/227/91 191/223/89 186/218/117 +f 191/223/89 196/228/92 197/104/93 192/98/90 +f 192/224/90 197/229/93 198/230/47 193/225/54 +f 193/225/54 198/230/47 199/231/45 194/226/53 +f 194/226/53 199/231/45 200/232/94 195/227/91 +f 195/227/91 200/232/94 196/228/92 191/223/89 +f 196/228/92 161/193/80 164/59/83 197/104/93 +f 197/229/93 164/195/83 166/198/48 198/230/47 +f 198/230/47 166/198/48 168/200/46 199/231/45 +f 199/231/45 168/200/46 170/202/85 200/232/94 +f 161/193/80 196/228/92 200/232/94 170/202/85 +f 201/233/1 202/234/2 203/235/118 204/236/119 +f 204/111/119 203/110/118 205/237/5 206/238/6 +f 206/238/6 205/237/5 207/239/7 208/240/8 +f 208/240/8 207/239/7 209/241/120 210/242/121 +f 201/233/1 210/242/121 209/241/120 202/234/2 +f 202/234/2 211/243/11 212/244/12 203/235/118 +f 203/110/118 212/119/12 213/245/13 205/237/5 +f 205/237/5 213/245/13 214/246/14 207/239/7 +f 207/239/7 214/246/14 215/247/15 209/241/120 +f 209/241/120 215/247/15 211/243/11 202/234/2 +f 211/243/11 216/248/16 217/249/108 212/244/12 +f 212/119/12 217/124/108 218/250/18 213/245/13 +f 213/245/13 218/250/18 219/251/19 214/246/14 +f 214/246/14 219/251/19 220/252/107 215/247/15 +f 215/247/15 220/252/107 216/248/16 211/243/11 +f 216/248/16 221/185/21 222/187/22 217/249/108 +f 217/124/108 222/88/22 223/178/23 218/250/18 +f 218/250/18 223/178/23 224/181/24 219/251/19 +f 219/251/19 224/181/24 225/183/25 220/252/107 +f 220/252/107 225/183/25 221/185/21 216/248/16 +f 221/253/21 226/254/26 227/255/106 222/256/22 +f 222/131/22 227/130/106 228/257/122 223/258/23 +f 223/258/23 228/257/122 229/259/29 224/260/24 +f 224/260/24 229/259/29 230/261/104 225/262/25 +f 225/262/25 230/261/104 226/254/26 221/253/21 +f 226/254/26 231/263/31 232/264/32 227/255/106 +f 227/130/106 232/139/32 233/265/33 228/257/122 +f 228/257/122 233/265/33 234/266/34 229/259/29 +f 229/259/29 234/266/34 235/267/123 230/261/104 +f 230/261/104 235/267/123 231/263/31 226/254/26 +f 231/263/31 236/268/36 237/269/37 232/264/32 +f 232/139/32 237/144/37 238/270/124 233/265/33 +f 233/265/33 238/270/124 239/271/125 234/266/34 +f 234/266/34 239/271/125 240/272/40 235/267/123 +f 235/267/123 240/272/40 236/268/36 231/263/31 +f 236/268/36 201/233/1 204/236/119 237/269/37 +f 237/144/37 204/111/119 206/238/6 238/270/124 +f 238/270/124 206/238/6 208/240/8 239/271/125 +f 239/271/125 208/240/8 210/242/121 240/272/40 +f 201/233/1 236/268/36 240/272/40 210/242/121 diff --git a/mods/basic_materials/nodes.lua b/mods/basic_materials/nodes.lua new file mode 100644 index 0000000..aa1d07c --- /dev/null +++ b/mods/basic_materials/nodes.lua @@ -0,0 +1,62 @@ +local S = core.get_translator("basic_materials") +local sound_api = xcompat.sounds +local chains_sbox = { type = "fixed", fixed = { -0.1, -0.5, -0.1, 0.1, 0.5, 0.1 } } + +core.register_node("basic_materials:cement_block", { + description = S("Cement"), + tiles = { "basic_materials_cement_block.png" }, + is_ground_content = false, + groups = { cracky = 2, dig_stone = 1, pickaxey = 5 }, + _mcl_hardness = 1.6, + sounds = sound_api.node_sound_stone_defaults(), +}) + +core.register_node("basic_materials:concrete_block", { + description = S("Concrete Block"), + tiles = { "basic_materials_concrete_block.png" }, + is_ground_content = false, + groups = { cracky = 1, concrete = 1, dig_stone = 1, pickaxey = 5 }, + _mcl_hardness = 1.6, + sounds = sound_api.node_sound_stone_defaults(), +}) + +core.register_node("basic_materials:chain_steel", { + description = S("Chain (steel, hanging)"), + drawtype = "mesh", + mesh = "basic_materials_chains.obj", + tiles = { "basic_materials_chain_steel.png" }, + walkable = false, + climbable = true, + sunlight_propagates = true, + paramtype = "light", + inventory_image = "basic_materials_chain_steel_inv.png", + is_ground_content = false, + groups = { cracky = 3, dig_stone = 1, pickaxey = 5 }, + _mcl_hardness = 1.6, + selection_box = chains_sbox, +}) + +core.register_node("basic_materials:chain_brass", { + description = S("Chain (brass, hanging)"), + drawtype = "mesh", + mesh = "basic_materials_chains.obj", + tiles = { "basic_materials_chain_brass.png" }, + walkable = false, + climbable = true, + sunlight_propagates = true, + paramtype = "light", + inventory_image = "basic_materials_chain_brass_inv.png", + is_ground_content = false, + groups = { cracky = 3, dig_stone = 1, pickaxey = 5 }, + _mcl_hardness = 1.6, + selection_box = chains_sbox, +}) + +core.register_node("basic_materials:brass_block", { + description = S("Brass Block"), + tiles = { "basic_materials_brass_block.png" }, + is_ground_content = false, + groups = { cracky = 1, dig_stone = 1, pickaxey = 5 }, + _mcl_hardness = 1.6, + sounds = sound_api.node_sound_metal_defaults(), +}) diff --git a/mods/basic_materials/textures/basic_materials_aluminum_bar.png b/mods/basic_materials/textures/basic_materials_aluminum_bar.png new file mode 100644 index 0000000..4ff13ae Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_aluminum_bar.png differ diff --git a/mods/basic_materials/textures/basic_materials_aluminum_strip.png b/mods/basic_materials/textures/basic_materials_aluminum_strip.png new file mode 100644 index 0000000..8957022 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_aluminum_strip.png differ diff --git a/mods/basic_materials/textures/basic_materials_aluminum_wire.png b/mods/basic_materials/textures/basic_materials_aluminum_wire.png new file mode 100644 index 0000000..7673bde Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_aluminum_wire.png differ diff --git a/mods/basic_materials/textures/basic_materials_brass_block.png b/mods/basic_materials/textures/basic_materials_brass_block.png new file mode 100644 index 0000000..c937800 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_brass_block.png differ diff --git a/mods/basic_materials/textures/basic_materials_brass_ingot.png b/mods/basic_materials/textures/basic_materials_brass_ingot.png new file mode 100644 index 0000000..0bd030a Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_brass_ingot.png differ diff --git a/mods/basic_materials/textures/basic_materials_carbon_steel_bar.png b/mods/basic_materials/textures/basic_materials_carbon_steel_bar.png new file mode 100644 index 0000000..34b0d83 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_carbon_steel_bar.png differ diff --git a/mods/basic_materials/textures/basic_materials_cement_block.png b/mods/basic_materials/textures/basic_materials_cement_block.png new file mode 100644 index 0000000..6d30f47 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_cement_block.png differ diff --git a/mods/basic_materials/textures/basic_materials_chain_brass.png b/mods/basic_materials/textures/basic_materials_chain_brass.png new file mode 100644 index 0000000..e2fb20d Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_chain_brass.png differ diff --git a/mods/basic_materials/textures/basic_materials_chain_brass_inv.png b/mods/basic_materials/textures/basic_materials_chain_brass_inv.png new file mode 100644 index 0000000..8c2d554 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_chain_brass_inv.png differ diff --git a/mods/basic_materials/textures/basic_materials_chain_steel.png b/mods/basic_materials/textures/basic_materials_chain_steel.png new file mode 100644 index 0000000..29af8db Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_chain_steel.png differ diff --git a/mods/basic_materials/textures/basic_materials_chain_steel_inv.png b/mods/basic_materials/textures/basic_materials_chain_steel_inv.png new file mode 100644 index 0000000..c552f7b Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_chain_steel_inv.png differ diff --git a/mods/basic_materials/textures/basic_materials_chainlink_brass.png b/mods/basic_materials/textures/basic_materials_chainlink_brass.png new file mode 100644 index 0000000..9a1ad87 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_chainlink_brass.png differ diff --git a/mods/basic_materials/textures/basic_materials_chainlink_steel.png b/mods/basic_materials/textures/basic_materials_chainlink_steel.png new file mode 100644 index 0000000..d7132c3 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_chainlink_steel.png differ diff --git a/mods/basic_materials/textures/basic_materials_concrete_block.png b/mods/basic_materials/textures/basic_materials_concrete_block.png new file mode 100644 index 0000000..5dd0d66 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_concrete_block.png differ diff --git a/mods/basic_materials/textures/basic_materials_copper_strip.png b/mods/basic_materials/textures/basic_materials_copper_strip.png new file mode 100644 index 0000000..22e572a Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_copper_strip.png differ diff --git a/mods/basic_materials/textures/basic_materials_copper_wire.png b/mods/basic_materials/textures/basic_materials_copper_wire.png new file mode 100644 index 0000000..c917982 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_copper_wire.png differ diff --git a/mods/basic_materials/textures/basic_materials_empty_spool.png b/mods/basic_materials/textures/basic_materials_empty_spool.png new file mode 100644 index 0000000..b51bb14 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_empty_spool.png differ diff --git a/mods/basic_materials/textures/basic_materials_energy_crystal.png b/mods/basic_materials/textures/basic_materials_energy_crystal.png new file mode 100644 index 0000000..f1c28e8 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_energy_crystal.png differ diff --git a/mods/basic_materials/textures/basic_materials_gear_steel.png b/mods/basic_materials/textures/basic_materials_gear_steel.png new file mode 100644 index 0000000..584f9a5 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_gear_steel.png differ diff --git a/mods/basic_materials/textures/basic_materials_gold_strip.png b/mods/basic_materials/textures/basic_materials_gold_strip.png new file mode 100644 index 0000000..9fe97a2 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_gold_strip.png differ diff --git a/mods/basic_materials/textures/basic_materials_gold_wire.png b/mods/basic_materials/textures/basic_materials_gold_wire.png new file mode 100644 index 0000000..781de7b Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_gold_wire.png differ diff --git a/mods/basic_materials/textures/basic_materials_heating_element.png b/mods/basic_materials/textures/basic_materials_heating_element.png new file mode 100644 index 0000000..42e00b7 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_heating_element.png differ diff --git a/mods/basic_materials/textures/basic_materials_ic.png b/mods/basic_materials/textures/basic_materials_ic.png new file mode 100644 index 0000000..4c88894 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_ic.png differ diff --git a/mods/basic_materials/textures/basic_materials_lead_strip.png b/mods/basic_materials/textures/basic_materials_lead_strip.png new file mode 100644 index 0000000..675933f Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_lead_strip.png differ diff --git a/mods/basic_materials/textures/basic_materials_motor.png b/mods/basic_materials/textures/basic_materials_motor.png new file mode 100644 index 0000000..f19ec0a Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_motor.png differ diff --git a/mods/basic_materials/textures/basic_materials_oil_extract.png b/mods/basic_materials/textures/basic_materials_oil_extract.png new file mode 100644 index 0000000..e34623d Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_oil_extract.png differ diff --git a/mods/basic_materials/textures/basic_materials_padlock.png b/mods/basic_materials/textures/basic_materials_padlock.png new file mode 100644 index 0000000..f938c3c Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_padlock.png differ diff --git a/mods/basic_materials/textures/basic_materials_paraffin.png b/mods/basic_materials/textures/basic_materials_paraffin.png new file mode 100644 index 0000000..77d2bbd Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_paraffin.png differ diff --git a/mods/basic_materials/textures/basic_materials_plastic_sheet.png b/mods/basic_materials/textures/basic_materials_plastic_sheet.png new file mode 100644 index 0000000..034dcc2 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_plastic_sheet.png differ diff --git a/mods/basic_materials/textures/basic_materials_plastic_strip.png b/mods/basic_materials/textures/basic_materials_plastic_strip.png new file mode 100644 index 0000000..288278b Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_plastic_strip.png differ diff --git a/mods/basic_materials/textures/basic_materials_silicon.png b/mods/basic_materials/textures/basic_materials_silicon.png new file mode 100644 index 0000000..847b366 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_silicon.png differ diff --git a/mods/basic_materials/textures/basic_materials_silver_wire.png b/mods/basic_materials/textures/basic_materials_silver_wire.png new file mode 100644 index 0000000..a38a45e Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_silver_wire.png differ diff --git a/mods/basic_materials/textures/basic_materials_stainless_steel_bar.png b/mods/basic_materials/textures/basic_materials_stainless_steel_bar.png new file mode 100644 index 0000000..e56c598 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_stainless_steel_bar.png differ diff --git a/mods/basic_materials/textures/basic_materials_stainless_steel_strip.png b/mods/basic_materials/textures/basic_materials_stainless_steel_strip.png new file mode 100644 index 0000000..3a33146 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_stainless_steel_strip.png differ diff --git a/mods/basic_materials/textures/basic_materials_stainless_steel_wire.png b/mods/basic_materials/textures/basic_materials_stainless_steel_wire.png new file mode 100644 index 0000000..54fab69 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_stainless_steel_wire.png differ diff --git a/mods/basic_materials/textures/basic_materials_steel_bar.png b/mods/basic_materials/textures/basic_materials_steel_bar.png new file mode 100644 index 0000000..850779b Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_steel_bar.png differ diff --git a/mods/basic_materials/textures/basic_materials_steel_strip.png b/mods/basic_materials/textures/basic_materials_steel_strip.png new file mode 100644 index 0000000..6384dc8 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_steel_strip.png differ diff --git a/mods/basic_materials/textures/basic_materials_steel_wire.png b/mods/basic_materials/textures/basic_materials_steel_wire.png new file mode 100644 index 0000000..a1e6906 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_steel_wire.png differ diff --git a/mods/basic_materials/textures/basic_materials_terracotta_base.png b/mods/basic_materials/textures/basic_materials_terracotta_base.png new file mode 100644 index 0000000..9f04aad Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_terracotta_base.png differ diff --git a/mods/basic_materials/textures/basic_materials_wet_cement.png b/mods/basic_materials/textures/basic_materials_wet_cement.png new file mode 100644 index 0000000..6a7fbf1 Binary files /dev/null and b/mods/basic_materials/textures/basic_materials_wet_cement.png differ diff --git a/mods/everness/LICENSE.txt b/mods/everness/LICENSE.txt new file mode 100644 index 0000000..6df428c --- /dev/null +++ b/mods/everness/LICENSE.txt @@ -0,0 +1,1865 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 2026 SaKeL + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +### Code + +GNU Lesser General Public License v2.1 or later + +### Textures + +**CC-BY-SA-4.0, by SaKeL** + +- everness_agave_leaf_1.png +- everness_agave_leaf_2.png +- everness_agave_leaf_3.png +- everness_amaranita_lantern_fur.png +- everness_amaranita_lantern_item.png +- everness_amaranita_lantern_light.png +- everness_amaranita_lantern_roots.png +- everness_ancient_emerald_ice.png +- everness_bamboo_block_side.png +- everness_bamboo_block_top.png +- everness_bamboo_forest_sun.png +- everness_bamboo_forest_sun_tonemap.png +- everness_bamboo_forest_sunrisebg.png +- everness_bamboo_item.png +- everness_bamboo_large_1.png +- everness_bamboo_large_2.png +- everness_bamboo_large_3.png +- everness_bamboo_large_bottom.png +- everness_bamboo_large_top.png +- everness_bamboo_mosaic.png +- everness_bamboo_palette.png +- everness_bamboo_small_1.png +- everness_bamboo_small_2.png +- everness_bamboo_small_top.png +- everness_bamboo_sprout.png +- everness_baobab_savanna_sun.png +- everness_baobab_tree_fruit.png +- everness_baobab_tree_fruit_roasted.png +- everness_baobab_tree_leaves.png +- everness_baobab_tree_sapling.png +- everness_baobab_tree_side.png +- everness_baobab_tree_top.png +- everness_baobab_wood.png +- everness_bloodspore_plant.png +- everness_bloodspore_plant_small.png +- everness_blooming_cooksonia.png +- everness_blue_crying_obsidian.png +- everness_blue_vine_lantern.png +- everness_blue_vine_lantern_item.png +- everness_blue_vine_lantern_leaves.png +- everness_blue_vine_lantern_roots.png +- everness_blue_weeping_obsidian.png +- everness_bone.png +- everness_bone_top.png +- everness_bubble.png +- everness_bucket_empty.png +- everness_bucket_lava.png +- everness_bucket_mineral_water.png +- everness_bulb_vine_1.png +- everness_bulb_vine_2.png +- everness_bulb_vine_end.png +- everness_cactus_blue_side.png +- everness_cactus_blue_top.png +- everness_cactus_side.png +- everness_cactus_top.png +- everness_candle_flame_animated.png +- everness_cave_barrel_cactus_item.png +- everness_cave_barrel_cactus_mesh.png +- everness_cave_flower_item.png +- everness_cave_flower_item_particles.png +- everness_cave_flower_mesh.png +- everness_cave_flower_mesh_particles.png +- everness_ceramic_pot_blank_mesh.png +- everness_ceramic_pot_blank_sherd.png +- everness_ceramic_pot_flowers_mesh.png +- everness_ceramic_pot_flowers_sherd.png +- everness_ceramic_pot_lines_mesh.png +- everness_ceramic_pot_lines_sherd.png +- everness_ceramic_pot_tribal_mesh.png +- everness_ceramic_pot_tribal_sherd.png +- everness_ceramic_sherds_ore.png +- everness_chest_front.png +- everness_chest_inside.png +- everness_chest_side.png +- everness_chest_top.png +- everness_chest_ui_bg.png -- Derived from texture by XSSheep (CC BY 4.0) +- everness_chest_ui_bg_hb_slot.png -- Derived from texture by XSSheep (CC BY 4.0) +- everness_chest_ui_bg_slot.png -- Derived from texture by XSSheep (CC BY 4.0) +- everness_clover.png +- everness_clover_with_flowers.png +- everness_cobweb.png +- everness_coconut_bottom.png +- everness_coconut_item.png +- everness_coconut_side.png +- everness_coconut_side_z.png +- everness_coconut_top.png +- everness_coral_bones.png +- everness_coral_bones_block.png +- everness_coral_bones_brick.png +- everness_coral_burdock_1.png +- everness_coral_burdock_2.png +- everness_coral_bush.png +- everness_coral_corals.png +- everness_coral_desert_cobble.png +- everness_coral_desert_mossy_cobble.png +- everness_coral_desert_stone.png +- everness_coral_desert_stone_block.png +- everness_coral_desert_stone_brick.png +- everness_coral_dirt.png +- everness_coral_forest_deep_ocean_lantern_animated.png +- everness_coral_forest_deep_ocean_lantern_bottom.png +- everness_coral_forest_deep_ocean_lantern_top.png +- everness_coral_forest_sun.png +- everness_coral_forest_sun_tonemap.png +- everness_coral_grass.png +- everness_coral_grass_1.png +- everness_coral_grass_2.png +- everness_coral_grass_3.png +- everness_coral_grass_4.png +- everness_coral_grass_5.png +- everness_coral_grass_globulagus.png +- everness_coral_grass_orange.png +- everness_coral_grass_side.png +- everness_coral_grass_tall.png +- everness_coral_jellyfish.png +- everness_coral_leaves.png +- everness_coral_leaves_particle_anim.png +- everness_coral_mushrooms_bioluminescent.png +- everness_coral_plant_bioluminescent.png +- everness_coral_sand.png +- everness_coral_sandstone.png +- everness_coral_sandstone_brick.png +- everness_coral_sandstone_carved_1.png +- everness_coral_sandstone_chiseled.png +- everness_coral_shrub.png +- everness_coral_skeleton.png +- everness_coral_stone_with_moss_side.png +- everness_coral_stone_with_moss_top.png +- everness_coral_tree.png +- everness_coral_tree_bioluminescent_particle_anim.png +- everness_coral_tree_bioluminescent_sapling.png +- everness_coral_tree_sapling.png +- everness_coral_white_sand.png +- everness_coral_white_sandstone.png +- everness_coral_white_sandstone_brick.png +- everness_coral_white_sandstone_pillar.png +- everness_coral_wood.png +- everness_creeping_moss_spores.png +- everness_crystal_block_cyan.png +- everness_crystal_block_cyan_top.png +- everness_crystal_block_orange.png +- everness_crystal_block_orange_top.png +- everness_crystal_block_purple.png +- everness_crystal_block_purple_top.png +- everness_crystal_bush_leaves.png +- everness_crystal_bush_sapling.png +- everness_crystal_bush_stem.png +- everness_crystal_cave_dirt.png +- everness_crystal_cave_dirt_side.png +- everness_crystal_cave_dirt_top.png +- everness_crystal_cave_moss.png +- everness_crystal_cluster_base.png +- everness_crystal_cluster_side.png +- everness_crystal_cluster_top.png +- everness_crystal_cobble.png +- everness_crystal_coral_dark_block.png +- everness_crystal_coral_light_block.png +- everness_crystal_cyan.png +- everness_crystal_dirt.png +- everness_crystal_forest_deep_ocean_coral_1.png +- everness_crystal_forest_deep_ocean_coral_2.png +- everness_crystal_forest_deep_ocean_coral_3.png +- everness_crystal_forest_deep_ocean_coral_plant_1.png +- everness_crystal_forest_deep_ocean_coral_plant_2.png +- everness_crystal_forest_deep_ocean_coral_plant_3.png +- everness_crystal_forest_deep_ocean_sand.png +- everness_crystal_forest_deep_ocean_sand_bubbles.png +- everness_crystal_forest_deep_ocean_sand_with_crack.png +- everness_crystal_forest_deep_ocean_sandstone_block.png +- everness_crystal_forest_deep_ocean_sandstone_brick.png +- everness_crystal_forest_moon.png +- everness_crystal_forest_moon_tonemap.png +- everness_crystal_forest_sun.png +- everness_crystal_forest_sun_tonemap.png +- everness_crystal_grass.png +- everness_crystal_grass_1.png +- everness_crystal_grass_2.png +- everness_crystal_grass_3.png +- everness_crystal_grass_side.png +- everness_crystal_leaves.png +- everness_crystal_leaves_particle_anim.png +- everness_crystal_lily_flower_small.png +- everness_crystal_lily_leaf_small.png +- everness_crystal_megalith_base.png +- everness_crystal_megalith_side_1.png +- everness_crystal_megalith_side_2.png +- everness_crystal_megalith_side_3.png +- everness_crystal_megalith_side_4.png +- everness_crystal_megalith_side_5.png +- everness_crystal_megalith_top.png +- everness_crystal_mossy_cobble.png +- everness_crystal_mushrooms.png +- everness_crystal_orange.png +- everness_crystal_palette.png +- everness_crystal_purple.png +- everness_crystal_sand.png +- everness_crystal_sandstone.png +- everness_crystal_sandstone_brick.png +- everness_crystal_sandstone_chiseled.png +- everness_crystal_stone.png +- everness_crystal_stone_brick.png +- everness_crystal_tree.png +- everness_crystal_tree_large_sapling.png +- everness_crystal_tree_sapling.png +- everness_crystal_tree_top.png +- everness_crystal_wood.png +- everness_cursed_bar.png +- everness_cursed_bar_top.png +- everness_cursed_brick.png +- everness_cursed_brick_carved.png +- everness_cursed_brick_mixed.png +- everness_cursed_brick_with_growth.png +- everness_cursed_bush_leaves.png +- everness_cursed_bush_sapling.png +- everness_cursed_bush_stem.png +- everness_cursed_dirt.png +- everness_cursed_dream_stone.png +- everness_cursed_dream_stone_particle_anim.png +- everness_cursed_dream_tree_sapling.png +- everness_cursed_dry_pine_leaves.png +- everness_cursed_energy_core_animated.png +- everness_cursed_energy_glow_animated.png +- everness_cursed_energy_palette.png +- everness_cursed_grass.png +- everness_cursed_grass_1.png +- everness_cursed_grass_side.png +- everness_cursed_hands.png +- everness_cursed_lands_deep_ocean_coral_alcyonacea.png +- everness_cursed_lands_deep_ocean_coral_anemone.png +- everness_cursed_lands_deep_ocean_coral_darkilluma.png +- everness_cursed_lands_deep_ocean_coral_demon.png +- everness_cursed_lands_deep_ocean_coral_octocurse.png +- everness_cursed_lands_deep_ocean_coral_ostracod.png +- everness_cursed_lands_deep_ocean_sand.png +- everness_cursed_lands_deep_ocean_sand_brick.png +- everness_cursed_lands_deep_ocean_sand_with_crack.png +- everness_cursed_lands_deep_ocean_sandblock.png +- everness_cursed_lands_moon.png +- everness_cursed_lands_moon_tonemap.png +- everness_cursed_lands_sun.png +- everness_cursed_lands_sun_tonemap.png +- everness_cursed_lands_sunrisebg.png +- everness_cursed_mud.png +- everness_cursed_pumpkin_bottom.png +- everness_cursed_pumpkin_front.png +- everness_cursed_pumpkin_side.png +- everness_cursed_pumpkin_top.png +- everness_cursed_ribs.png +- everness_cursed_sand.png +- everness_cursed_sandstone_block.png +- everness_cursed_sandstone_brick.png +- everness_cursed_skull_pole.png +- everness_cursed_stone.png +- everness_cursed_stone_carved.png +- everness_deep_ocean_coral_1.png +- everness_deep_ocean_coral_2.png +- everness_deep_ocean_coral_3.png +- everness_deep_ocean_coral_4.png +- everness_deep_ocean_coral_plant_1.png +- everness_deep_ocean_coral_plant_2.png +- everness_deep_ocean_coral_plant_3.png +- everness_deep_ocean_sand.png +- everness_deep_ocean_sandstone_block.png +- everness_deep_ocean_sandstone_brick.png +- everness_dense_emerald_ice.png +- everness_dense_vine_1.png +- everness_dense_vine_2.png +- everness_dense_vine_end.png +- everness_dirt.png +- everness_door_bamboo.png +- everness_door_bamboo_item.png +- everness_door_bone_pyrite.png +- everness_door_bone_pyrite_item.png +- everness_door_crystal_wood.png +- everness_door_crystal_wood_item.png +- everness_door_cursed_steel_bar.png +- everness_door_cursed_steel_bar_item.png +- everness_door_cursed_wood.png +- everness_door_cursed_wood_item.png +- everness_door_lava_tree_wood.png +- everness_door_lava_tree_wood_item.png +- everness_door_palm_wood.png +- everness_door_palm_wood_item.png +- everness_door_trapdoor_bamboo.png +- everness_door_trapdoor_bamboo_side.png +- everness_door_trapdoor_crystal_wood.png +- everness_door_trapdoor_crystal_wood_side.png +- everness_door_trapdoor_cursed_wood.png +- everness_door_trapdoor_cursed_wood_side.png +- everness_door_trapdoor_lava_tree_wood.png +- everness_door_trapdoor_lava_tree_wood_side.png +- everness_door_trapdoor_palm_wood.png +- everness_door_trapdoor_palm_wood_side.png +- everness_door_willow.png +- everness_door_willow_item.png +- everness_dry_bamboo_block_side.png +- everness_dry_bamboo_block_top.png +- everness_dry_branches.png +- everness_dry_branches_particle_anim.png +- everness_dry_dirt.png +- everness_dry_grass_1.png -- thanks to Khaz +- everness_dry_grass_2.png -- thanks to Khaz +- everness_dry_grass_3.png -- thanks to Khaz +- everness_dry_grass_4.png -- thanks to Khaz +- everness_dry_grass_side.png +- everness_dry_grass_top.png +- everness_dry_tree.png +- everness_dry_tree_sapling.png +- everness_dry_tree_top.png +- everness_dry_wood.png +- everness_egg_plant_bottom.png +- everness_egg_plant_item.png +- everness_egg_plant_side.png +- everness_egg_plant_top.png +- everness_emerald_ice.png +- everness_eye_vine_1.png +- everness_eye_vine_2.png +- everness_eye_vine_end_bottom.png +- everness_eye_vine_end_side.png +- everness_eye_vine_end_top.png +- everness_farming_soil_overlay.png -- Derived from texture by PilzAdam (CC BY 3.0) +- everness_farming_soil_wet_overlay.png -- Derived from texture by PilzAdam (CC BY 3.0) +- everness_farming_soil_wet_side_overlay.png -- Derived from texture by PilzAdam (CC BY 3.0) +- everness_fence_bamboo_wood.png +- everness_fence_coral_wood.png +- everness_fence_crystal_wood.png +- everness_fence_dry_wood.png +- everness_fence_lava_tree_wood.png +- everness_fence_palm_wood.png +- everness_fence_rail_bamboo_wood.png +- everness_fence_rail_coral_wood.png +- everness_fence_rail_crystal_wood.png +- everness_fence_rail_dry_wood.png +- everness_fence_rail_lava_tree_wood.png +- everness_fence_rail_palm_wood.png +- everness_fire_animated.png +- everness_flame_particle.png +- everness_flame_permanent.png +- everness_flame_permanent_blue.png +- everness_flame_permanent_blue_item.png +- everness_flame_permanent_item.png +- everness_flame_permanent_purple.png +- everness_flame_permanent_purple_item.png +- everness_floating_crystal_animated.png +- everness_flowered_vine_1.png +- everness_flowered_vine_2.png +- everness_flowered_vine_end.png +- everness_flowers.png +- everness_flowers_magenta.png +- everness_flowers_magenta_side_x.png +- everness_flowers_magenta_side_z.png +- everness_flowers_side_x.png +- everness_flowers_side_z.png +- everness_forsaken_desert_brick.png +- everness_forsaken_desert_brick_red.png +- everness_forsaken_desert_chiseled_stone_bottom.png +- everness_forsaken_desert_chiseled_stone_side.png +- everness_forsaken_desert_chiseled_stone_top.png +- everness_forsaken_desert_cobble.png +- everness_forsaken_desert_cobble_red.png +- everness_forsaken_desert_dry_ocean_dirt.png +- everness_forsaken_desert_engraved_stone.png +- everness_forsaken_desert_plant_1.png +- everness_forsaken_desert_plant_2.png +- everness_forsaken_desert_plant_3.png +- everness_forsaken_desert_sand.png +- everness_forsaken_desert_stone.png +- everness_forsaken_desert_sun.png +- everness_forsaken_desert_sun_tonemap.png +- everness_forsaken_fire_item.png +- everness_forsaken_fire_mesh.png +- everness_forsaken_tundra_beach_sand.png +- everness_forsaken_tundra_beach_sand_with_shells.png +- everness_forsaken_tundra_brick.png +- everness_forsaken_tundra_cobblestone.png +- everness_forsaken_tundra_dirt.png +- everness_forsaken_tundra_grass.png +- everness_forsaken_tundra_grass_side.png +- everness_forsaken_tundra_rocks_side.png +- everness_forsaken_tundra_rocks_top.png +- everness_forsaken_tundra_stone.png +- everness_forsaken_tundra_sun.png +- everness_forsaken_tundra_sun_tonemap.png +- everness_forsythia_item.png +- everness_forsythia_mesh.png +- everness_frosted_coral.png +- everness_frosted_ice.png +- everness_frosted_ice_translucent.png +- everness_frosted_icesheet_sun.png +- everness_frosted_icesheet_sun_tonemap.png +- everness_frosted_icicle.png +- everness_frosted_snow.png +- everness_glass.png +- everness_glass_detail.png +- everness_glossy_mushroom_bottom.png +- everness_glossy_mushroom_side_x.png +- everness_glossy_mushroom_side_z.png +- everness_glossy_mushroom_top.png +- everness_glowing_pillar_item.png +- everness_glowing_pillar_leaves.png +- everness_glowing_pillar_luminophor.png +- everness_glowing_pillar_roots.png +- everness_golden_vine_1.png +- everness_golden_vine_2.png +- everness_golden_vine_end.png +- everness_grass_extras_1.png +- everness_grass_extras_2.png +- everness_grass_side.png +- everness_grass_top.png +- everness_gravel.png +- everness_hammer_handle_mesh.png +- everness_hammer_item.png +- everness_hammer_mesh.png +- everness_hammer_mesh_transparent.png +- everness_hammer_sharp_handle_mesh.png +- everness_hammer_sharp_item.png +- everness_hammer_sharp_mesh.png +- everness_hammer_sharp_mesh_transparent.png +- everness_hollow_tree_side.png +- everness_hollow_tree_top.png +- everness_icecobble.png +- everness_illumi_root.png +- everness_invisible_node_overlay.png +- everness_ivis_moss.png +- everness_ivis_vine_1.png +- everness_ivis_vine_2.png +- everness_ivis_vine_end.png +- everness_lava_flowing_animated.png +- everness_lava_source_animated.png +- everness_lava_tree.png +- everness_lava_tree_animated.png +- everness_lava_tree_leaves.png +- everness_lava_tree_sapling.png +- everness_lava_tree_top.png +- everness_lava_tree_wood.png +- everness_logo.png +- everness_lootchest_marker_side.png +- everness_lootchest_marker_top.png +- everness_lotus_flower_mesh_not_animated.png +- everness_lotus_flower_pink_item.png +- everness_lotus_flower_pink_mesh.png +- everness_lotus_flower_pink_mesh_animated.png +- everness_lotus_flower_purple_item.png +- everness_lotus_flower_purple_mesh.png +- everness_lotus_flower_purple_mesh_animated.png +- everness_lotus_flower_white_item.png +- everness_lotus_flower_white_mesh.png +- everness_lotus_flower_white_mesh_animated.png +- everness_lotus_leaf_2_item.png +- everness_lotus_leaf_2_y.png +- everness_lotus_leaf_3_item.png +- everness_lotus_leaf_3_y.png +- everness_lotus_leaf_item.png +- everness_lotus_leaf_y.png +- everness_lumabus_bulb_purple.png +- everness_lumabus_leaves.png +- everness_lumabus_vine_1.png +- everness_lumabus_vine_2.png +- everness_lumabus_vine_end.png +- everness_lumecorn_item.png +- everness_lumecorn_leaf.png +- everness_lumecorn_light.png +- everness_lumecorn_root.png +- everness_luminous_mushroom_bottom.png +- everness_luminous_mushroom_side_x.png +- everness_luminous_mushroom_side_z.png +- everness_luminous_mushroom_top.png +- everness_magmacobble.png +- everness_magmacobble_animated.png +- everness_marsh_grass.png +- everness_mcl_bucket_lava.png +- everness_mcl_bucket_mineral_water.png +- everness_mcl_doors_door_bamboo_lower.png +- everness_mcl_doors_door_bamboo_lower_bottompart.png +- everness_mcl_doors_door_bamboo_lower_side.png +- everness_mcl_doors_door_bamboo_upper.png +- everness_mcl_doors_door_bamboo_upper_side.png +- everness_mcl_doors_door_bamboo_upper_toppart.png +- everness_mcl_doors_door_bone_pyrite_lower.png +- everness_mcl_doors_door_bone_pyrite_lower_bottompart.png +- everness_mcl_doors_door_bone_pyrite_lower_side.png +- everness_mcl_doors_door_bone_pyrite_upper.png +- everness_mcl_doors_door_bone_pyrite_upper_side.png +- everness_mcl_doors_door_bone_pyrite_upper_toppart.png +- everness_mcl_doors_door_crystal_wood_lower.png +- everness_mcl_doors_door_crystal_wood_lower_bottompart.png +- everness_mcl_doors_door_crystal_wood_lower_side.png +- everness_mcl_doors_door_crystal_wood_upper.png +- everness_mcl_doors_door_crystal_wood_upper_side.png +- everness_mcl_doors_door_crystal_wood_upper_toppart.png +- everness_mcl_doors_door_cursed_wood_lower.png +- everness_mcl_doors_door_cursed_wood_lower_bottompart.png +- everness_mcl_doors_door_cursed_wood_lower_side.png +- everness_mcl_doors_door_cursed_wood_upper.png +- everness_mcl_doors_door_cursed_wood_upper_side.png +- everness_mcl_doors_door_cursed_wood_upper_toppart.png +- everness_mcl_doors_door_willow_lower.png +- everness_mcl_doors_door_willow_lower_bottompart.png +- everness_mcl_doors_door_willow_lower_side.png +- everness_mcl_doors_door_willow_upper.png +- everness_mcl_doors_door_willow_upper_side.png +- everness_mcl_doors_door_willow_upper_toppart.png +- everness_mcl_doors_trapdoor_bamboo_side.png +- everness_mcl_doors_trapdoor_crystal_wood_side.png +- everness_mcl_doors_trapdoor_cursed_wood_side.png +- everness_mese_leaves.png +- everness_mese_tree_fruit_item.png +- everness_mese_tree_fruit_side.png +- everness_mese_tree_fruit_top.png +- everness_mese_tree_sapling.png +- everness_mese_tree_side_animated.png +- everness_mese_tree_top.png +- everness_mese_wood.png +- everness_mineral_cave_moss.png +- everness_mineral_cave_moss_grass.png +- everness_mineral_cave_moss_side.png +- everness_mineral_coal.png +- everness_mineral_cobblestone.png +- everness_mineral_cobblestone_under.png +- everness_mineral_lava_stone_animated.png +- everness_mineral_lava_stone_bottom.png +- everness_mineral_lava_stone_side.png +- everness_mineral_pyrite.png +- everness_mineral_sand.png +- everness_mineral_sandstone.png +- everness_mineral_sandstone_block.png +- everness_mineral_sandstone_brick.png +- everness_mineral_sandstone_brick_block.png +- everness_mineral_sandstone_brick_block_top.png +- everness_mineral_stone.png +- everness_mineral_stone_block.png +- everness_mineral_stone_brick.png +- everness_mineral_stone_brick_with_flower_growth.png +- everness_mineral_stone_brick_with_growth.png +- everness_mineral_stone_under.png +- everness_mineral_stone_under_top.png +- everness_mineral_torch_animated.png +- everness_mineral_torch_item.png +- everness_mineral_torch_mesh.png +- everness_mineral_water.png +- everness_mineral_water_flowing_animated.png +- everness_mineral_water_source_animated.png +- everness_mineral_water_weed_1.png +- everness_mineral_water_weed_2.png +- everness_mineral_water_weed_3.png +- everness_mineral_waters_skybox.png +- everness_mold_stone.png +- everness_mold_stone_with_moss_side.png +- everness_mold_stone_with_moss_top.png +- everness_moss_block.png +- everness_mtg_bucket_lava.png +- everness_mtg_bucket_mineral_water.png +- everness_mud.png +- everness_mud_2.png +- everness_ngrass_1.png +- everness_ngrass_2.png +- everness_palm_tree_leaves.png +- everness_palm_tree_sapling.png +- everness_palm_tree_side.png +- everness_palm_tree_top.png +- everness_palm_tree_wood.png +- everness_particle.png +- everness_pick_archeological.png +- everness_pick_illuminating.png +- everness_pyrite_block.png +- everness_pyrite_block_forged.png +- everness_pyrite_block_polished.png +- everness_pyrite_block_slab_brick.png +- everness_pyrite_block_spiral.png +- everness_pyrite_glass.png +- everness_pyrite_ingot.png +- everness_pyrite_lantern.png +- everness_pyrite_lump.png +- everness_pyrite_pillar_bottom.png +- everness_pyrite_pillar_middle.png +- everness_pyrite_pillar_small.png +- everness_pyrite_pillar_top.png +- everness_pyriteblock_brick.png +- everness_quartz.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_bottom.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_chiseled.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_chiseled_top.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_lines.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_lines_top.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_side.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_block_top.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_quartz_ore.png -- Derived from texture Pixel Perfection by XSSheep (CC-BY-SA-4.0) +- everness_red_castor_1.png +- everness_red_castor_2.png +- everness_red_castor_3.png +- everness_red_castor_4.png +- everness_reeds_vine_1.png +- everness_reeds_vine_2.png +- everness_reeds_vine_end.png +- everness_rising_soul_particle.png +- everness_rose_bush_item.png +- everness_rose_bush_mesh.png +- everness_scull_with_candle_inventory.png +- everness_sequoia_tree_leaves.png +- everness_sequoia_tree_sapling.png +- everness_sequoia_tree_side.png +- everness_sequoia_tree_top.png +- everness_sequoia_wood.png +- everness_shell_of_underwarer_breathing.png +- everness_shovel_silk.png +- everness_smoke_cloud_particle_animated.png +- everness_smoke_cloud_particle_static.png +- everness_snowcobble.png +- everness_soul_sandstone.png +- everness_soul_sandstone_veined_side.png +- everness_soul_sandstone_veined_top.png +- everness_spine_kelp.png +- everness_staghorn_coral_inv.png +- everness_staghorn_coral_nodebox_bottom.png +- everness_staghorn_coral_nodebox_side.png +- everness_staghorn_coral_nodebox_top.png +- everness_starfish.png +- everness_stone.png +- everness_sulfur_stone.png +- everness_tenanea_flowers_vine_1.png +- everness_tenanea_flowers_vine_2.png +- everness_tenanea_flowers_vine_end.png +- everness_termite_block.png +- everness_tinted_glass_base.png +- everness_tinted_glass_detail.png +- everness_trapdoor_cursed_steel_bar.png +- everness_trapdoor_cursed_steel_bar_side.png +- everness_twisted_crystal_grass.png +- everness_twisted_crystal_spire.png +- everness_twisted_crystal_spire_item.png +- everness_twisted_vine_1.png +- everness_twisted_vine_2.png +- everness_twisted_vine_end.png +- everness_venus_trap_item.png +- everness_venus_trap_mesh.png +- everness_vine_cave_1.png +- everness_vine_cave_2.png +- everness_vine_cave_end.png +- everness_vine_shears.png +- everness_volcanic_rock.png +- everness_volcanic_rock_with_magma_animated.png +- everness_volcanic_sulfur_stone.png +- everness_wall_vine_cave_blue.png +- everness_wall_vine_cave_blue_item.png +- everness_wall_vine_cave_cyan.png +- everness_wall_vine_cave_cyan_item.png +- everness_wall_vine_cave_green.png +- everness_wall_vine_cave_green_item.png +- everness_wall_vine_cave_violet.png +- everness_wall_vine_cave_violet_item.png +- everness_water_geyser_item.png +- everness_water_geyser_particle.png +- everness_weeping_obsidian.png +- everness_whispering_gourd_vine_1.png +- everness_whispering_gourd_vine_2.png +- everness_whispering_gourd_vine_end.png +- everness_willow_leaves.png +- everness_willow_sapling.png +- everness_willow_tree_sapling.png +- everness_willow_tree_side.png +- everness_willow_tree_top.png +- everness_willow_vine_1.png +- everness_willow_vine_2.png +- everness_willow_vine_end.png +- everness_willow_wood.png -- Derived from texture by BlockMen (CC BY-SA 3.0) +- everness_xpanes_edge_pyrite.png + +**CC-BY-SA-4.0, Pixel Perfection by XSSheep**, https://minecraft.curseforge.com/projects/pixel-perfection-freshly-updated + +- everness_fire_animated.png +- everness_flame_particle.png +- everness_rising_soul_particle.png + +### Sounds + +**CC0-1.0, by ProdMultimediasHQI**, https://freesound.org/people/ProdMultimediasHQI/sounds/512501/ + +- everness_frosted_snow_footstep.1.ogg +- everness_frosted_snow_footstep.2.ogg +- everness_frosted_snow_footstep.3.ogg +- everness_frosted_snow_footstep.4.ogg +- everness_frosted_snow_footstep.5.ogg + +**CC0-1.0, by patchytherat**, https://freesound.org + +- everness_crystal_chime.1.ogg +- everness_crystal_chime.2.ogg +- everness_crystal_chime.3.ogg +- everness_crystal_chime.4.ogg +- everness_crystal_chime.5.ogg +- everness_crystal_chime.6.ogg + +**CC0-1.0, by afleetingspeck**, https://freesound.org + +- everness_bamboo_hit.1.ogg +- everness_bamboo_hit.2.ogg +- everness_bamboo_hit.3.ogg +- everness_bamboo_hit.4.ogg +- everness_bamboo_hit.5.ogg + +**CC0-1.0, by se2001**, https://freesound.org + +- everness_bamboo_dug.1.ogg + +**CC-BY-4.0, by se2001**, https://www.playonloop.com + +- everness_ambience_graveyard_1.ogg +- everness_ambience_graveyard_7.ogg +- everness_ambience_graveyard_8.ogg +- everness_ambience_graveyard_9.ogg +- everness_ambience_graveyard_10.ogg +- everness_ambience_night_crickets_1.ogg +- everness_ambience_night_crickets_2.ogg +- everness_ambience_night_crickets_3.ogg +- everness_ambience_night_crickets_4.ogg +- everness_ambience_night_crickets_5.ogg +- everness_ambience_snow_storm_1.ogg +- everness_ambience_snow_storm_2.ogg +- everness_ambience_snow_storm_3.ogg +- everness_ambience_snow_storm_4.ogg +- everness_ambience_swamp_1.ogg +- everness_ambience_swamp_2.ogg +- everness_ambience_swamp_3.ogg +- everness_ambience_swamp_4.ogg + +**CC0-1.0, by mistersherlock**, https://freesound.org + +- everness_ambience_graveyard_2.ogg +- everness_ambience_graveyard_3.ogg +- everness_ambience_graveyard_4.ogg +- everness_ambience_graveyard_5.ogg +- everness_ambience_graveyard_6.ogg + +**CC-BY-3.0, by TinTinOko**, https://freesound.org + +- everness_ambience_monster_sigh_cave.ogg + +**CC-BY-4.0, by 150134**, https://freesound.org + +- everness_ambience_rocks_falling_cave.ogg + +**CC-BY-4.0, by tosha73**, https://freesound.org + +- everness_ambience_water_drips_cave_1.ogg + +**CC0-1.0, by SaltedMutton72**, https://freesound.org + +- everness_ambience_wind_cave_1.ogg + +**CC0-1.0, by shelbyshark**, https://freesound.org + +- everness_ambience_wind_cave_2.ogg +- everness_ambience_wind_cave_3.ogg +- everness_ambience_wind_cave_4.ogg +- everness_ambience_wind_cave_5.ogg + +**CC-BY-4.0, by LittleRobotSoundFactory**, https://freesound.org + +- everness_ambience_cave_1.ogg +- everness_ambience_cave_2.ogg +- everness_ambience_cave_6.ogg +- everness_ambience_cave_7.ogg +- everness_ambience_cave_8.ogg +- everness_ambience_cave_9.ogg + +**CC0-1.0, by szegvari**, https://freesound.org + +- everness_ambience_cave_3.ogg + +**CC0-1.0, by Bertsz**, https://freesound.org + +- everness_ambience_cave_4.ogg +- everness_ambience_cave_5.ogg + +**CC-BY-4.0, by erlipresidente**, https://freesound.org + +- everness_ambience_water_drips_cave_2.ogg + +**CC0-1.0, by qubodup**, https://freesound.org + +- everness_ambience_creepy_cave_1.ogg + +**CC0-1.0, by HorrorAudio**, https://freesound.org + +- everness_ambience_ghost_1.ogg + +**CC-BY-4.0, by klankbeeld**, https://freesound.org + +- everness_ambience_ghost_2.ogg +- everness_ambience_ghost_3.ogg +- everness_ambience_ghost_4.ogg +- everness_ambience_ghost_6.ogg + +**CC0-1.0, by Legnalegna55**, https://freesound.org + +- everness_ambience_ghost_5.ogg + +**CC-BY-4.0, by Benboncan**, https://freesound.org + +- everness_ambience_owl_1.ogg + +**CC0-1.0, by Foleyhaven**, https://freesound.org + +- everness_mud_footstep.1.ogg +- everness_mud_footstep.2.ogg +- everness_mud_footstep.3.ogg +- everness_mud_footstep.4.ogg +- everness_mud_footstep.5.ogg + +**CC-BY-4.0, by Peacewaves**, https://freesound.org + +- everness_ambience_sulfur_1.ogg +- everness_ambience_sulfur_2.ogg +- everness_ambience_sulfur_3.ogg +- everness_ambience_sulfur_4.ogg + +**CC0-1.0, by e__**, https://freesound.org + +- everness_ambience_hot_stone_1.ogg +- everness_ambience_hot_stone_2.ogg + +**CC-BY-4.0, by GregorQuendel**, https://freesound.org + +- everness_ambience_ice_cracking_1.ogg +- everness_ambience_ice_cracking_2.ogg +- everness_ambience_ice_cracking_3.ogg + +**CC-BY-SA-4.0, by SaKeL** + +- everness_door_bamboo_open.ogg + +**CC0-1.0, by onikage22**, https://freesound.org + +- everness_item_drop_pickup.1.ogg +- everness_item_drop_pickup.2.ogg +- everness_item_drop_pickup.3.ogg +- everness_item_drop_pickup.4.ogg + +**CC-BY-3.0, by murraysortz**, https://freesound.org + +- everness_underwater_bubbles.1.ogg +- everness_underwater_bubbles.2.ogg +- everness_underwater_bubbles.3.ogg + +**CC0-1.0, by Yuval**, https://freesound.org + +- everness_grass_footstep.1.ogg +- everness_grass_footstep.2.ogg +- everness_grass_footstep.3.ogg + +**CC0-1.0, by kyles**, https://freesound.org + +- everness_dirt_hit.1.ogg +- everness_dirt_hit.2.ogg +- everness_dirt_hit.3.ogg + +**CC0-1.0, by Nox_Sound**, https://freesound.org + +- everness_grass_hit.1.ogg +- everness_grass_hit.3.ogg +- everness_grass_hit.2.ogg + +**CC0-1.0, by Nox_Sound**, https://freesound.org/people/Nox_Sound/sounds/613849/ + +- everness_snow_footstep.1.ogg +- everness_snow_footstep.2.ogg +- everness_snow_footstep.3.ogg +- everness_snow_footstep.4.ogg + +**CC0-1.0, by Fission9**, https://freesound.org + +- everness_dirt_footstep.1.ogg +- everness_dirt_footstep.2.ogg +- everness_dirt_footstep.3.ogg +- everness_dirt_footstep.4.ogg +- everness_wood_footstep.1.ogg +- everness_wood_footstep.2.ogg +- everness_wood_footstep.3.ogg +- everness_wood_footstep.4.ogg +- everness_wood_footstep.5.ogg +- everness_wood_footstep.6.ogg + +**CC-BY-4.0, by InspectorJ**, https://freesound.org + +- everness_ice_footstep.1.ogg +- everness_ice_footstep.2.ogg +- everness_ice_footstep.3.ogg +- everness_ice_footstep.4.ogg + +**CC-BY-4.0, by EminYILDIRIM**, https://freesound.org + +- everness_ice_hit.1.ogg +- everness_ice_hit.2.ogg +- everness_ice_hit.3.ogg +- everness_ice_hit.4.ogg + +**CC-BY-4.0, by SFXAFRIK**, https://freesound.org/people/SFXAFRIK/sounds/584855/ + +- everness_door_glass_close.ogg +- everness_door_glass_open.ogg + +**CC-BY-4.0, by SFXAFRIK**, https://freesound.org/people/SFXAFRIK/sounds/584850/ + +- everness_chest_open.ogg +- everness_chest_close.ogg + +**CC0-1.0, by Nox_Sound**, https://freesound.org + +- everness_stone_dug.1.ogg +- everness_stone_dug.2.ogg +- everness_stone_dug.3.ogg +- everness_stone_footstep.1.ogg +- everness_stone_footstep.2.ogg +- everness_stone_footstep.3.ogg +- everness_stone_footstep.4.ogg +- everness_stone_footstep.5.ogg + +**CC0-1.0, by lolamadeus**, https://freesound.org + +- everness_stone_hit.1.ogg +- everness_stone_hit.2.ogg +- everness_stone_hit.3.ogg + +**CC-BY-4.0, by F.M.Audio**, https://freesound.org + +- everness_stone_place.1.ogg +- everness_stone_place.2.ogg +- everness_stone_place.3.ogg +- everness_stone_place.4.ogg + +**CC-BY-4.0, by elektroproleter**, https://freesound.org + +- everness_leaves_footstep.1.ogg +- everness_leaves_footstep.2.ogg +- everness_leaves_footstep.3.ogg +- everness_leaves_footstep.4.ogg + +**CC-BY-4.0, by Abacagi**, https://freesound.org + +- everness_leaves_hit.1.ogg +- everness_leaves_hit.2.ogg + +**CC-BY-4.0, by JanKoehl**, https://freesound.org + +- everness_leaves_dug.1.ogg +- everness_leaves_dug.2.ogg + +**CC0-1.0, by vgraham1**, https://freesound.org + +- everness_leaves_place.1.ogg +- everness_leaves_place.2.ogg + +**CC0-1.0, by worthahep88**, https://freesound.org + +- everness_plant_hit.1.ogg +- everness_plant_hit.2.ogg +- everness_plant_hit.3.ogg + +**CC0-1.0, by GiocoSound**, https://freesound.org/people/GiocoSound/ + +- everness_wood_hit.1.ogg +- everness_wood_hit.2.ogg +- everness_wood_hit.3.ogg +- everness_wood_hit.4.ogg +- everness_wood_hit.5.ogg +- everness_wood_hit.6.ogg + +**CC-BY-4.0, by RICHERlandTV**, https://freesound.org + +- everness_wood_place.1.ogg +- everness_wood_place.2.ogg +- everness_wood_place.3.ogg + +**CC0-1.0, by pan14**, https://freesound.org + +- everness_sand_footstep.1.ogg +- everness_sand_footstep.2.ogg +- everness_sand_footstep.3.ogg + +**CC-BY-3.0, by Coral_Island_Studios**, https://freesound.org + +- everness_sand_place.1.ogg +- everness_sand_place.2.ogg +- everness_sand_place.3.ogg +- everness_sand_place.4.ogg +- everness_sand_place.5.ogg + +**CC0-1.0, by schneidi67**, https://freesound.org + +- everness_sand_dug.1.ogg +- everness_sand_dug.2.ogg +- everness_sand_dug.3.ogg + +**CC0-1.0, by Lukeo135**, https://freesound.org + +- everness_sand_hit.1.ogg +- everness_sand_hit.2.ogg +- everness_sand_hit.3.ogg + +**CC0-1.0, by GiocoSound**, https://freesound.org + +- everness_metal_footstep.1.ogg +- everness_metal_footstep.2.ogg +- everness_metal_footstep.3.ogg +- everness_metal_footstep.4.ogg +- everness_metal_footstep.5.ogg + +**CC-BY-4.0, by DasDeer**, https://freesound.org + +- everness_metal_hit.1.ogg +- everness_metal_hit.2.ogg +- everness_metal_hit.3.ogg + +**CC-BY-4.0, by MoveAwayPodcast**, https://freesound.org + +- everness_metal_place.1.ogg +- everness_metal_place.2.ogg +- everness_metal_place.3.ogg + +**CC0-1.0, by craigsmith**, https://freesound.org + +- everness_metal_dug.1.ogg +- everness_metal_dug.2.ogg +- everness_metal_dug.3.ogg + +**CC0-1.0, by courtneyeck**, https://freesound.org + +- everness_glass_footstep.1.ogg +- everness_glass_footstep.2.ogg +- everness_glass_footstep.3.ogg + +**CC0-1.0, by Robson220pl**, https://freesound.org + +- everness_glass_place.1.ogg +- everness_glass_place.2.ogg +- everness_glass_place.3.ogg + +**CC-BY-4.0, by elfgrunge**, https://freesound.org + +- everness_glass_dug.1.ogg +- everness_glass_dug.2.ogg + +**CC-BY-3.0, by Mito551**, https://freesound.org + +- everness_thin_glass_footstep.ogg + +**CC-BY-3.0, by cmusounddesign**, http://www.freesound.org/people/cmusounddesign/sounds/71947/ + +- everness_break_thin_glass.1.ogg + +**CC-BY-3.0, by Tomlija**, http://www.freesound.org/people/Tomlija/sounds/97669/ + +- everness_break_thin_glass.2.ogg + +**CC-BY-3.0, by lsprice**, http://www.freesound.org/people/lsprice/sounds/88808/ + +- everness_break_thin_glass.3.ogg + +**CC-BY-3.0, by alexo400**, https://freesound.org/people/alexo400/sounds/543385/ + +- everness_snow_place.1.ogg +- everness_snow_place.2.ogg +- everness_snow_place.3.ogg + +**CC-BY-3.0, by soundscalpel.com** +https://freesound.org/people/soundscalpel.com/sounds/110619/ +https://freesound.org/people/soundscalpel.com/sounds/110609/ +https://freesound.org/people/soundscalpel.com/sounds/110620/ + +- everness_snow_hit.1.ogg +- everness_snow_hit.2.ogg +- everness_snow_hit.3.ogg + +**CC-BY-3.0, by soundscalpel.com** +https://freesound.org/people/cabled_mess/sounds/384423/ +https://freesound.org/people/cabled_mess/sounds/384422/ +https://freesound.org/people/cabled_mess/sounds/384421/ + +- everness_frosted_snow_place.1.ogg +- everness_frosted_snow_place.2.ogg +- everness_frosted_snow_place.3.ogg + +**CC-BY-3.0, by AtevonHes**, https://freesound.org/people/AtevonHes/sounds/454783/ + +- everness_frosted_snow_hit.1.ogg +- everness_frosted_snow_hit.2.ogg +- everness_frosted_snow_hit.3.ogg +- everness_frosted_snow_hit.4.ogg + +**CC-BY-4.0, by HerbertBoland**, https://freesound.org/people/AtevonHes/sounds/454783/ + +- everness_tool_breaks.1.ogg +- everness_tool_breaks.2.ogg +- everness_tool_breaks.3.ogg + +**CC0-1.0, by Rudmer_Rotteveel** + +https://freesound.org/people/Rudmer_Rotteveel/sounds/590949/ +https://freesound.org/people/Rudmer_Rotteveel/sounds/590948/ +https://freesound.org/people/Rudmer_Rotteveel/sounds/590950/ + +- everness_creaky_door_open.1.ogg +- everness_creaky_door_open.2.ogg +- everness_creaky_door_close.ogg + +**CC-BY-SA-3.0, celeron55, Perttu Ahola** + +- everness_cool_lava.1.ogg +- everness_cool_lava.2.ogg +- everness_cool_lava.3.ogg + +**CC-BY-4.0, by jorickhoofd**, https://freesound.org/people/jorickhoofd/ + +- everness_gravel_hit.1.ogg +- everness_gravel_hit.2.ogg +- everness_gravel_hit.3.ogg +- everness_gravel_place.1.ogg +- everness_gravel_place.2.ogg +- everness_gravel_place.3.ogg + +**CC-BY-3.0, by test_sound**, https://freesound.org/people/test_sound/ + +- everness_gravel_dug.1.ogg +- everness_gravel_dug.2.ogg +- everness_gravel_dug.3.ogg +- everness_gravel_dug.4.ogg + +**CC0-1.0, by Ali_6868**, https://freesound.org/people/Ali_6868/ + +- everness_gravel_footstep.1.ogg +- everness_gravel_footstep.2.ogg +- everness_gravel_footstep.3.ogg +- everness_gravel_footstep.4.ogg +- everness_gravel_footstep.5.ogg +- everness_gravel_footstep.6.ogg + +**CC-BY-4.0, by DelonOW**, https://freesound.org/people/DelonOW/ + +- everness_extinguish_flame.1.ogg + +**CC-BY-4.0, by nuFF3**, https://freesound.org + +- everness_ceramic_footstep.1.ogg +- everness_ceramic_footstep.2.ogg +- everness_ceramic_footstep.3.ogg +- everness_ceramic_footstep.4.ogg +- everness_ceramic_footstep.5.ogg +- everness_ceramic_footstep.6.ogg + +**CC-BY-4.0, by Anikadl**, https://freesound.org + +- everness_ceramic_hit.1.ogg +- everness_ceramic_hit.2.ogg +- everness_ceramic_hit.3.ogg +- everness_ceramic_hit.4.ogg +- everness_ceramic_hit.5.ogg +- everness_ceramic_hit.6.ogg + +**CC0-1.0, by kyles**, https://freesound.org, mixed with default_place_node_hard.1.ogg by Mito551 (CC-BY-SA 3.0) + +- everness_ceramic_place.1.ogg +- everness_ceramic_place.2.ogg +- everness_ceramic_place.3.ogg + +**CC0-1.0, by Kinoton**, https://freesound.org, mixed with default_hard_footstep.1.ogg by Erdie (CC-BY-SA 3.0) + +- everness_ceramic_dug.1.ogg +- everness_ceramic_dug.2.ogg +- everness_ceramic_dug.3.ogg + +**CC0-1.0, by Nox_Sound**, https://freesound.org/people/Nox_Sound/sounds/576593/ + +- everness_water_footstep.1.ogg +- everness_water_footstep.2.ogg +- everness_water_footstep.3.ogg +- everness_water_footstep.4.ogg + +**CC0-1.0, by adr1911**, https://freesound.org/people/adr1911/sounds/542585/ + +- everness_water_geyser.1.ogg + +**CC0-1.0, by Fission9**, https://freesound.org/people/Fission9/sounds/474850/ + +- everness_lava_1.ogg + +**CC0-1.0, by morganpurkis**, https://freesound.org/people/morganpurkis/sounds/385098/ + +- everness_lava_2.ogg + +### Models + +**CC-BY-SA-4.0, by SaKeL** + +- everness_barrel_cactus.obj +- everness_cave_flower.obj +- everness_cave_flower_with_particles.obj +- everness_ceramic_pot.obj +- everness_chest_closed.obj +- everness_chest_opened.obj +- everness_chest_protected_closed.obj +- everness_chest_protected_opened.obj +- everness_cursed_hands.obj +- everness_cursed_ribs.obj +- everness_cursed_skull_pole.obj +- everness_forsaken_fire.obj +- everness_forsythia_mesh.obj +- everness_glowing_pillar.obj +- everness_hammer_pick.obj +- everness_lotus_flower.obj +- everness_lumabus.obj +- everness_lumecorn.obj +- everness_mineral_torch.obj +- everness_mineral_torch_ceiling.obj +- everness_mineral_torch_wall.obj +- everness_skull_with_candle.obj +- everness_twisted_crystal_spire.obj +- everness_venus_trap.obj +- everness_vine_wall.obj +- everness_water_geyser.obj + +**CC-BY-SA-3.0, by sofar** + +- everness_chest_open + +### Assets + +**CC-BY-SA-4.0, by SaKeL** + +- everness_barrel_cactus.blend +- everness_cave_flower_with_particles.blend +- everness_cave_flower.blend +- everness_ceramic_pot.blend +- everness_forsaken_fire.blend +- everness_glowing_pillar.blend +- everness_hammer_pick.blend +- everness_lotus_flower.blend +- everness_lumabus.blend +- everness_lumecorn.blend +- everness_mesh_bush.blend +- everness_mineral_torch_ceiling.blend +- everness_mineral_torch_wall.blend +- everness_mineral_torch.blend +- everness_skull_with_candle.blend +- everness_venus_trap.blend +- everness_water_geyser.blend + +### Schematics + +**CC-BY-SA-4.0, by SaKeL** + +- everness_baobab_log.lua +- everness_baobab_log.mts +- everness_baobab_tree.lua +- everness_baobab_tree.mts +- everness_baobab_tree_from_sapling.lua +- everness_baobab_tree_from_sapling.mts +- everness_cemetery.lua +- everness_cemetery.mts +- everness_coral_bones_tree.lua +- everness_coral_bones_tree.mts +- everness_coral_forest_deep_ocean_coral_cyan.lua +- everness_coral_forest_deep_ocean_coral_cyan.mts +- everness_coral_forest_deep_ocean_coral_green.lua +- everness_coral_forest_deep_ocean_coral_green.mts +- everness_coral_forest_deep_ocean_coral_pink.lua +- everness_coral_forest_deep_ocean_coral_pink.mts +- everness_coral_forest_deep_ocean_coral_red.lua +- everness_coral_forest_deep_ocean_coral_red.mts +- everness_coral_forest_deep_ocean_coral_reef_cyan.lua +- everness_coral_forest_deep_ocean_coral_reef_cyan.mts +- everness_coral_forest_deep_ocean_coral_reef_green.lua +- everness_coral_forest_deep_ocean_coral_reef_green.mts +- everness_coral_forest_deep_ocean_coral_reef_pink.lua +- everness_coral_forest_deep_ocean_coral_reef_pink.mts +- everness_coral_forest_deep_ocean_coral_reef_red.lua +- everness_coral_forest_deep_ocean_coral_reef_red.mts +- everness_coral_forest_deep_ocean_house.lua +- everness_coral_forest_deep_ocean_house.mts +- everness_coral_forest_ocean_fishing_dock.lua +- everness_coral_forest_ocean_fishing_dock.mts +- everness_coral_tree.lua +- everness_coral_tree.mts +- everness_coral_tree_bioluminescent.lua +- everness_coral_tree_bioluminescent.mts +- everness_coral_tree_bioluminescent_from_sapling.lua +- everness_coral_tree_bioluminescent_from_sapling.mts +- everness_coral_tree_from_sapling.lua +- everness_coral_tree_from_sapling.mts +- everness_coral_volcano.lua +- everness_coral_volcano.mts +- everness_coral_volcano_x_clay.lua +- everness_coral_volcano_x_clay.mts +- everness_crystal_bush.lua +- everness_crystal_bush.mts +- everness_crystal_forest_deep_ocean_coral_1.lua +- everness_crystal_forest_deep_ocean_coral_1.mts +- everness_crystal_forest_deep_ocean_coral_2.lua +- everness_crystal_forest_deep_ocean_coral_2.mts +- everness_crystal_forest_deep_ocean_coral_3.lua +- everness_crystal_forest_deep_ocean_coral_3.mts +- everness_crystal_forest_deep_ocean_ruins.lua +- everness_crystal_forest_deep_ocean_ruins.mts +- everness_crystal_forest_ocean_shrine.lua +- everness_crystal_forest_ocean_shrine.mts +- everness_crystal_forest_ruins_1.lua +- everness_crystal_forest_ruins_1.mts +- everness_crystal_forest_ruins_2.lua +- everness_crystal_forest_ruins_2.mts +- everness_crystal_purple_cluster.lua +- everness_crystal_purple_cluster.mts +- everness_crystal_tree.lua +- everness_crystal_tree.mts +- everness_crystal_tree_large.lua +- everness_crystal_tree_large.mts +- everness_cursed_bush.mts +- everness_cursed_cabin.lua +- everness_cursed_cabin.mts +- everness_cursed_dream_tree.lua +- everness_cursed_dream_tree.mts +- everness_cursed_dream_tree_from_sapling.lua +- everness_cursed_dream_tree_from_sapling.mts +- everness_cursed_lands_deep_ocean_island.lua +- everness_cursed_lands_deep_ocean_island.mts +- everness_cursed_lands_deep_ocean_skull.lua +- everness_cursed_lands_deep_ocean_skull.mts +- everness_dry_tree.lua +- everness_dry_tree.mts +- everness_dry_tree_from_sapling.lua +- everness_dry_tree_from_sapling.mts +- everness_forsaken_desert_temple.lua +- everness_forsaken_desert_temple.mts +- everness_forsaken_desert_temple_2.lua +- everness_forsaken_desert_temple_2.mts +- everness_forsaken_desert_temple_3.lua +- everness_forsaken_desert_temple_3.mts +- everness_forsaken_lands_deep_ocean_coral_alcyonacea.lua +- everness_forsaken_lands_deep_ocean_coral_alcyonacea.mts +- everness_forsaken_lands_deep_ocean_coral_octocurse.lua +- everness_forsaken_lands_deep_ocean_coral_octocurse.mts +- everness_forsaken_lands_deep_ocean_coral_ostracod.lua +- everness_forsaken_lands_deep_ocean_coral_ostracod.mts +- everness_forsaken_tundra_rocks.lua +- everness_forsaken_tundra_rocks.mts +- everness_forsythia_on_moss.lua +- everness_forsythia_on_moss.mts +- everness_frosted_icesheet_igloo.lua +- everness_frosted_icesheet_igloo.mts +- everness_frosted_icicle_large_ceiling.lua +- everness_frosted_icicle_large_ceiling.mts +- everness_frosted_icicle_large_floor.lua +- everness_frosted_icicle_large_floor.mts +- everness_frosted_lands_fossils.lua +- everness_frosted_lands_fossils.mts +- everness_frosted_lands_stalagmite.lua +- everness_frosted_lands_stalagmite.mts +- everness_frosted_lands_volcanic_rock.lua +- everness_frosted_lands_volcanic_rock.mts +- everness_giant_sequoia_tree.lua +- everness_giant_sequoia_tree.mts +- everness_giant_sequoia_tree_from_sapling.lua +- everness_giant_sequoia_tree_from_sapling.mts +- everness_haunted_house.lua +- everness_haunted_house.mts +- everness_hollow_tree.lua +- everness_hollow_tree.mts +- everness_hollow_tree_large.lua +- everness_hollow_tree_large.mts +- everness_japanese_shrine.lua +- everness_japanese_shrine.mts +- everness_jungle_temple.lua +- everness_jungle_temple.mts +- everness_large_bamboo.lua +- everness_large_bamboo.mts +- everness_lava_tree.lua +- everness_lava_tree.mts +- everness_marsh_grass.lua +- everness_marsh_grass.mts +- everness_mese_tree.lua +- everness_mese_tree.mts +- everness_mineral_waters_tower.lua +- everness_mineral_waters_tower.mts +- everness_palm_tree.lua +- everness_palm_tree.mts +- everness_palm_tree_from_sapling.lua +- everness_palm_tree_from_sapling.mts +- everness_quartz_fountain.lua +- everness_quartz_fountain.mts +- everness_quartz_temple.lua +- everness_quartz_temple.mts +- everness_ruins_1.lua +- everness_ruins_1.mts +- everness_small_bamboo.lua +- everness_small_bamboo.mts +- everness_sulfur_volcano.lua +- everness_sulfur_volcano.mts +- everness_termite_nest.lua +- everness_termite_nest.mts +- everness_willow_tree.lua +- everness_willow_tree.mts +- everness_willow_tree_from_sapling.lua +- everness_willow_tree_from_sapling.mts diff --git a/mods/everness/README.md b/mods/everness/README.md new file mode 100644 index 0000000..1eee553 --- /dev/null +++ b/mods/everness/README.md @@ -0,0 +1,99 @@ +# Everness Mapgen [everness] + +Everness is a mapgen, which aims to provide an endless array of +beautiful biomes from the surface lands to the caverns with custom-painted +textures. It creates both a sense of discovery and of danger when one lands in the wrong biome. +It also adds structures, dungeons with loot chests, and custom skyboxes based on the biome. + +![screenshot](screenshot.png) + +## Features + +* supports MineClone2 - see attached `minetest.example.mcl.conf` for best optimized settings (looking for testing and contributors) +* player name tag will hide when sneaking +* item magnet pickup when holding sneak +* granular biome settings +* custom sounds, biomes +* custom textures +* custom biomes and cavern biomes +* custom tools, blocks +* custom skyboxes based on biome +* inlcudes (not for all) e.g. walls, doors, glass, stairs, vines, tools, panes, trees... +* unique set of tools +* pottery + +## Biomes + +Additionally adds extra biomes to the MT game default biomes: + +* Coral Forest +* Coral Forest Dunes +* Coral Forest Ocean +* Coral Forest Deep Ocean +* Coral Forest Under +* Frosted Icesheet +* Frosted Icesheet Ocean +* Frosted Icesheet Under +* Cursed Lands +* Cursed Lands Dunes +* Cursed Lands Swamp +* Cursed Lands Ocean +* Cursed Lands Deep Ocean +* Cursed Lands Under +* Crystal Forest +* Crystal Forest Dunes +* Crystal Forest Shore +* Crystal Forest Ocean +* Crystal Forest Deep Ocean +* Crystal Forest Under +* Bamboo Forest +* Bamboo Forest Under +* Forsaken Desert +* Forsaken Desert Ocean +* Forsaken Desert Under +* Baobab Savanna +* Forsaken Tundra +* Forsaken Tundra Beach +* Forsaken Tundra Ocean +* Forsaken Tundra Under +* Mineral Waters + +## Wiki + +https://bitbucket.org/minetest_gamers/everness/wiki/Home + +## Report Bugs/Suggestions + +https://bitbucket.org/minetest_gamers/everness/issues + +## Dependencies + +- *none* + +## Optional Dependencies + +- default (MTG) +- xpanes (MTG) +- doors (MTG) +- stairs (MTG) +- walls (MTG) +- x_obsidianmese (for paths) +- x_tumbleweed (adds tumbleweeds to deserts) +- x_farming (bonemeal, recipes...) +- x_clay (mapgen structures, loot chests...) +- mcl_core (MCL) +- mcl_fences (MCL) +- mcl_walls (MCL) +- mcl_stairs (MCL) +- mcl_util (MCL) +- mcl_autogroup (MCL) +- mcl_doors (MCL) +- mcl_mapgen_core (MCL) + +## License + +see included [LICENSE.txt](LICENSE.txt) file for more info + +## Installation + +see: https://docs.luanti.org/for-players/installing-mods/ diff --git a/mods/everness/api.lua b/mods/everness/api.lua new file mode 100644 index 0000000..939aa38 --- /dev/null +++ b/mods/everness/api.lua @@ -0,0 +1,2574 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = (core.get_translator and core.get_current_modname and core.get_translator(core.get_current_modname())) or function(s) return s end +local rand_global = PcgRandom(tonumber(tostring(os.time()):reverse():sub(1, 9))) + +--- Base class +---@class Everness +Everness = { + leafdecay_trunk_defs = {}, + bamboo = { + -- based on height + growth_stages = { + --height + [1] = { + -- next plant + { name = 'everness:bamboo_1' }, + { name = 'everness:bamboo_2' }, + }, + [2] = { + { name = 'everness:bamboo_1' }, + { name = 'everness:bamboo_2' }, + { name = 'everness:bamboo_2' }, + }, + [3] = { + { name = 'everness:bamboo_3' }, + { name = 'everness:bamboo_4' }, + { name = 'everness:bamboo_4' }, + { name = 'everness:bamboo_5' }, + }, + [4] = { + { name = 'everness:bamboo_3' }, + { name = 'everness:bamboo_3' }, + { name = 'everness:bamboo_4' }, + { name = 'everness:bamboo_5' }, + { name = 'everness:bamboo_5' }, + }, + }, + top_leaves_schem = { + { name = 'everness:bamboo_4' }, + { name = 'everness:bamboo_5' }, + { name = 'everness:bamboo_5' }, + } + }, + loot_chest = { + default = {}, + }, + settings = { + biomes = { + everness_coral_forest = { + enabled = core.settings:get_bool('everness_coral_forest', true), + y_max = tonumber(core.settings:get('everness_coral_forest_y_max')) or 31000, + y_min = tonumber(core.settings:get('everness_coral_forest_y_min')) or 6, + }, + everness_coral_forest_dunes = { + enabled = core.settings:get_bool('everness_coral_forest_dunes', true), + y_max = tonumber(core.settings:get('everness_coral_forest_dunes_y_max')) or 5, + y_min = tonumber(core.settings:get('everness_coral_forest_dunes_y_min')) or 4, + }, + everness_coral_forest_ocean = { + enabled = core.settings:get_bool('everness_coral_forest_ocean', true), + y_max = tonumber(core.settings:get('everness_coral_forest_ocean_y_max')) or 3, + y_min = tonumber(core.settings:get('everness_coral_forest_ocean_y_min')) or -10, + }, + everness_coral_forest_deep_ocean = { + enabled = core.settings:get_bool('everness_coral_forest_deep_ocean', true), + y_max = tonumber(core.settings:get('everness_coral_forest_deep_ocean_y_max')) or -11, + y_min = tonumber(core.settings:get('everness_coral_forest_deep_ocean_y_min')) or -255, + }, + everness_coral_forest_under = { + enabled = core.settings:get_bool('everness_coral_forest_under', true), + y_max = tonumber(core.settings:get('everness_coral_forest_under_y_max')) or -256, + y_min = tonumber(core.settings:get('everness_coral_forest_under_y_min')) or -31000, + }, + everness_frosted_icesheet = { + enabled = core.settings:get_bool('everness_frosted_icesheet', true), + y_max = tonumber(core.settings:get('everness_frosted_icesheet_y_max')) or 31000, + y_min = tonumber(core.settings:get('everness_frosted_icesheet_y_min')) or -8, + }, + everness_frosted_icesheet_ocean = { + enabled = core.settings:get_bool('everness_frosted_icesheet_ocean', true), + y_max = tonumber(core.settings:get('everness_frosted_icesheet_ocean_y_max')) or -9, + y_min = tonumber(core.settings:get('everness_frosted_icesheet_ocean_y_min')) or -255, + }, + everness_frosted_icesheet_under = { + enabled = core.settings:get_bool('everness_frosted_icesheet_under', true), + y_max = tonumber(core.settings:get('everness_frosted_icesheet_under_y_max')) or -256, + y_min = tonumber(core.settings:get('everness_frosted_icesheet_under_y_min')) or -31000, + }, + everness_cursed_lands = { + enabled = core.settings:get_bool('everness_cursed_lands', true), + y_max = tonumber(core.settings:get('everness_cursed_lands_y_max')) or 31000, + y_min = tonumber(core.settings:get('everness_cursed_lands_y_min')) or 6, + }, + everness_cursed_lands_dunes = { + enabled = core.settings:get_bool('everness_cursed_lands_dunes', true), + y_max = tonumber(core.settings:get('everness_cursed_lands_dunes_y_max')) or 5, + y_min = tonumber(core.settings:get('everness_cursed_lands_dunes_y_min')) or 1, + }, + everness_cursed_lands_swamp = { + enabled = core.settings:get_bool('everness_cursed_lands_swamp', true), + y_max = tonumber(core.settings:get('everness_cursed_lands_swamp_y_max')) or 0, + y_min = tonumber(core.settings:get('everness_cursed_lands_swamp_y_min')) or -1, + }, + everness_cursed_lands_ocean = { + enabled = core.settings:get_bool('everness_cursed_lands_ocean', true), + y_max = tonumber(core.settings:get('everness_cursed_lands_ocean_y_max')) or -2, + y_min = tonumber(core.settings:get('everness_cursed_lands_ocean_y_min')) or -10, + }, + everness_cursed_lands_deep_ocean = { + enabled = core.settings:get_bool('everness_cursed_lands_ocean', true), + y_max = tonumber(core.settings:get('everness_cursed_lands_ocean_y_max')) or -11, + y_min = tonumber(core.settings:get('everness_cursed_lands_ocean_y_min')) or -255, + }, + everness_cursed_lands_under = { + enabled = core.settings:get_bool('everness_cursed_lands_under', true), + y_max = tonumber(core.settings:get('everness_cursed_lands_under_y_max')) or -256, + y_min = tonumber(core.settings:get('everness_cursed_lands_under_y_min')) or -31000, + }, + everness_crystal_forest = { + enabled = core.settings:get_bool('everness_crystal_forest', true), + y_max = tonumber(core.settings:get('everness_crystal_forest_y_max')) or 31000, + y_min = tonumber(core.settings:get('everness_crystal_forest_y_min')) or 6, + }, + everness_crystal_forest_dunes = { + enabled = core.settings:get_bool('everness_crystal_forest_dunes', true), + y_max = tonumber(core.settings:get('everness_crystal_forest_dunes_y_max')) or 5, + y_min = tonumber(core.settings:get('everness_crystal_forest_dunes_y_min')) or 1, + }, + everness_crystal_forest_shore = { + enabled = core.settings:get_bool('everness_crystal_forest_shore', true), + y_max = tonumber(core.settings:get('everness_crystal_forest_shore_y_max')) or 0, + y_min = tonumber(core.settings:get('everness_crystal_forest_shore_y_min')) or -1, + }, + everness_crystal_forest_ocean = { + enabled = core.settings:get_bool('everness_crystal_forest_ocean', true), + y_max = tonumber(core.settings:get('everness_crystal_forest_ocean_y_max')) or -2, + y_min = tonumber(core.settings:get('everness_crystal_forest_ocean_y_min')) or -10, + }, + everness_crystal_forest_deep_ocean = { + enabled = core.settings:get_bool('everness_crystal_forest_deep_ocean', true), + y_max = tonumber(core.settings:get('everness_crystal_forest_deep_ocean_y_max')) or -11, + y_min = tonumber(core.settings:get('everness_crystal_forest_deep_ocean_y_min')) or -255, + }, + everness_crystal_forest_under = { + enabled = core.settings:get_bool('everness_crystal_forest_under', true), + y_max = tonumber(core.settings:get('everness_crystal_forest_under_y_max')) or -256, + y_min = tonumber(core.settings:get('everness_crystal_forest_under_y_min')) or -31000, + }, + everness_bamboo_forest = { + enabled = core.settings:get_bool('everness_bamboo_forest', true), + y_max = tonumber(core.settings:get('everness_bamboo_forest_y_max')) or 31000, + y_min = tonumber(core.settings:get('everness_bamboo_forest_y_min')) or 1, + }, + everness_bamboo_forest_under = { + enabled = core.settings:get_bool('everness_bamboo_forest_under', true), + y_max = tonumber(core.settings:get('everness_bamboo_forest_under_y_max')) or -256, + y_min = tonumber(core.settings:get('everness_bamboo_forest_under_y_min')) or -31000, + }, + everness_forsaken_desert = { + enabled = core.settings:get_bool('everness_forsaken_desert', true), + y_max = tonumber(core.settings:get('everness_forsaken_desert_y_max')) or 31000, + y_min = tonumber(core.settings:get('everness_forsaken_desert_y_min')) or 4, + }, + everness_forsaken_desert_ocean = { + enabled = core.settings:get_bool('everness_forsaken_desert_ocean', true), + y_max = tonumber(core.settings:get('everness_forsaken_desert_ocean_y_max')) or 3, + y_min = tonumber(core.settings:get('everness_forsaken_desert_ocean_y_min')) or -8, + }, + everness_forsaken_desert_under = { + enabled = core.settings:get_bool('everness_forsaken_desert_under', true), + y_max = tonumber(core.settings:get('everness_forsaken_desert_under_y_max')) or -256, + y_min = tonumber(core.settings:get('everness_forsaken_desert_under_y_min')) or -31000, + }, + everness_baobab_savanna = { + enabled = core.settings:get_bool('everness_baobab_savanna', true), + y_max = tonumber(core.settings:get('everness_baobab_savanna_y_max')) or 31000, + y_min = tonumber(core.settings:get('everness_baobab_savanna_y_min')) or 1, + }, + everness_forsaken_tundra = { + enabled = core.settings:get_bool('everness_forsaken_tundra', true), + y_max = tonumber(core.settings:get('everness_forsaken_tundra_y_max')) or 31000, + y_min = tonumber(core.settings:get('everness_forsaken_tundra_y_min')) or 2, + }, + everness_forsaken_tundra_beach = { + enabled = core.settings:get_bool('everness_forsaken_tundra_beach', true), + y_max = tonumber(core.settings:get('everness_forsaken_tundra_beach_y_max')) or 1, + y_min = tonumber(core.settings:get('everness_forsaken_tundra_beach_y_min')) or -3, + }, + everness_forsaken_tundra_ocean = { + enabled = core.settings:get_bool('everness_forsaken_tundra_ocean', true), + y_max = tonumber(core.settings:get('everness_forsaken_tundra_ocean_y_max')) or -4, + y_min = tonumber(core.settings:get('everness_forsaken_tundra_ocean_y_min')) or -255, + }, + everness_forsaken_tundra_under = { + enabled = core.settings:get_bool('everness_forsaken_tundra_under', true), + y_max = tonumber(core.settings:get('everness_forsaken_tundra_under_y_max')) or -256, + y_min = tonumber(core.settings:get('everness_forsaken_tundra_under_y_min')) or -31000, + }, + everness_mineral_waters = { + enabled = core.settings:get_bool('everness_mineral_waters', true), + y_max = tonumber(core.settings:get('everness_mineral_waters_y_max')) or 31000, + y_min = tonumber(core.settings:get('everness_mineral_waters_y_min')) or 1, + }, + everness_mineral_waters_under = { + enabled = core.settings:get_bool('everness_mineral_waters_under', true), + y_max = tonumber(core.settings:get('everness_mineral_waters_under_y_max')) or -256, + y_min = tonumber(core.settings:get('everness_mineral_waters_under_y_min')) or -31000, + }, + }, + features = { + everness_feature_sneak_pickup = not core.get_modpath('mcl_core') and core.settings:get_bool('everness_feature_sneak_pickup', true), + everness_feature_skybox = core.settings:get_bool('everness_feature_skybox', true), + everness_enable_moreblocks = core.settings:get_bool('everness_enable_moreblocks', true), + } + }, + hammer_cid_data = {}, + colors = { + brown = '#DEB887', + }, + registered_nodes = {}, + registered_tools = {}, + registered_abms = {}, + registered_lbms = {}, + registered_craftitems = {}, + registered_biomes = {}, + registered_decorations = {}, + registered_ores = {}, + on_generated_queue = {}, + gen_notify_deco_ids = {} +} + +function Everness.register_gen_notify_decoration(self, deco_id) + if type(deco_id) == 'table' then + for _, id in ipairs(deco_id) do + if id then + table.insert(self.gen_notify_deco_ids, id) + end + end + elseif deco_id then + table.insert(self.gen_notify_deco_ids, deco_id) + end + if core.set_gen_notify and #self.gen_notify_deco_ids > 0 then + core.set_gen_notify({ decoration = true }, self.gen_notify_deco_ids) + end +end + +function Everness.to_set(tbl) + if type(tbl) == 'string' then + return { [tbl] = true } + end + local s = {} + for _, v in ipairs(tbl or {}) do + s[v] = true + end + return s +end + +function Everness.grow_cactus(self, pos, node, params) + local node_copy = table.copy(node) + + if node.param2 >= 4 then + return + end + + pos.y = pos.y - 1 + + local under_node_name = core.get_node(pos).name + if core.get_item_group(under_node_name, 'sand') == 0 + and core.get_item_group(under_node_name, 'everness_sand') == 0 + then + return + end + + pos.y = pos.y + 1 + + local height = 0 + + while (node.name == 'everness:cactus_orange' or node.name == 'everness:cactus_blue') and height < 5 do + height = height + 1 + pos.y = pos.y + 1 + node = core.get_node(pos) + end + + if height == 5 or node.name ~= 'air' then + return + end + + if core.get_node_light(pos) < 13 then + return + end + + core.set_node(pos, { name = node_copy.name }) + + return true +end + +function Everness.emerge_area(self, blockpos, action, calls_remaining, param) + if not param.total then + param.total = calls_remaining + 1 + param.current = 0 + end + + param.current = param.current + 1 + + if param.total == param.current then + param.callback(param.data) + end +end + +-- how often node timers for plants will tick, +/- some random value +function Everness.tick_vine(self, pos) + core.get_node_timer(pos):start(math.random(5, 10)) +end + +-- how often a growth failure tick is retried (e.g. too dark) +function Everness.tick_vine_again(self, pos) + core.get_node_timer(pos):start(math.random(40, 80)) +end + +-- how often node timers for plants will tick, +/- some random value +function Everness.tick_sulfur_stone(self, pos) + core.get_node_timer(pos):start(math.random(5, 10)) +end + +-- how often a growth failure tick is retried (e.g. too dark) +function Everness.tick_sulfur_stone_again(self, pos) + core.get_node_timer(pos):start(math.random(40, 80)) +end + +-- Grows vines +-- @param pos {vector} +function Everness.grow_vine(self, pos, elapsed, params) + local node = core.get_node(pos) + local pos_under = vector.new(pos.x, pos.y - 1, pos.z) + local node_under = core.get_node(pos_under) + local node_names = params.node_names + local end_node_name = params.end_node_name + local end_node_param2 = params.end_node_param2 + + -- get length + local length = 0 + local temp_node = node + + while core.get_item_group(temp_node.name, 'vine') > 0 and length < 16 do + length = length + 1 + temp_node = core.get_node(vector.new(pos.x, pos.y + length, pos.z)) + end + + -- stop growing - random height between 12 - 16 nodes + if length > 11 and length < 16 then + if math.random(1, 3) == 2 then + return + end + end + + if length >= 16 then + return + end + + if core.get_item_group(node_under.name, 'vine') > 0 then + -- stop timer for gown vine + return + end + + if node_under.name ~= 'air' then + Everness:tick_vine_again(pos) + return + end + + local new_node_name = node_names[math.random(1, #node_names)] + + core.set_node(pos, { name = new_node_name, param2 = new_node_name.param2 or 0 }) + -- last hanging vine + core.set_node(pos_under, { name = end_node_name, param2 = end_node_param2 and end_node_param2 or node.param2 }) + + Everness:tick_vine(pos_under) +end + +-- +-- Sounds +-- + +function Everness.node_sound_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = '', gain = 1.0 } + table.dug = table.dug or { name = 'everness_stone_hit', gain = 1.0 } + table.place = table.place or { name = 'everness_stone_dug', gain = 0.6 } + return table +end + +function Everness.node_sound_frosted_snow_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_frosted_snow_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_frosted_snow_hit', gain = 0.2 } + table.dug = table.dug or { name = 'everness_frosted_snow_footstep', gain = 0.3 } + table.place = table.place or { name = 'everness_frosted_snow_place', gain = 0.25 } + return table +end + +function Everness.node_sound_crystal_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_crystal_chime', gain = 0.2 } + table.dig = table.dig or { name = 'everness_crystal_chime', gain = 0.3 } + table.dug = table.dug or { name = 'everness_stone_footstep', gain = 0.3 } + table.place = table.place or { name = 'everness_crystal_chime', gain = 1.0 } + return table +end + +function Everness.node_sound_bamboo_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_bamboo_hit', gain = 0.2 } + table.dig = table.dig or { name = 'everness_bamboo_hit', gain = 0.3 } + table.dug = table.dug or { name = 'everness_bamboo_dug', gain = 0.1 } + table.place = table.place or { name = 'everness_bamboo_hit', gain = 1.0 } + return table +end + +function Everness.node_sound_mud_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_mud_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_mud_footstep', gain = 0.3 } + table.dug = table.dug or { name = 'everness_mud_footstep', gain = 0.1 } + table.place = table.place or { name = 'everness_mud_footstep', gain = 1.0 } + return table +end + +function Everness.node_sound_grass_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_grass_footstep', gain = 0.4 } + table.dig = table.dig or { name = 'everness_grass_hit', gain = 1.2 } + table.dug = table.dug or { name = 'everness_dirt_hit', gain = 1.0 } + table.place = table.place or { name = 'everness_dirt_hit', gain = 1.0 } + return table +end + +function Everness.node_sound_dirt_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_dirt_footstep', gain = 0.15 } + table.dig = table.dig or { name = 'everness_dirt_hit', gain = 0.4 } + table.dug = table.dug or { name = 'everness_dirt_hit', gain = 1.0 } + table.place = table.place or { name = 'everness_dirt_hit', gain = 1.0 } + return table +end + +function Everness.node_sound_ice_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_ice_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_ice_hit', gain = 0.4 } + table.dug = table.dug or { name = 'everness_ice_hit', gain = 1.0 } + table.place = table.place or { name = 'everness_ice_hit', gain = 1.0 } + return table +end + +function Everness.node_sound_stone_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_stone_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_stone_hit', gain = 1.0 } + table.dug = table.dug or { name = 'everness_stone_dug', gain = 0.6 } + table.place = table.place or { name = 'everness_stone_place', gain = 1.0 } + return table +end + +function Everness.node_sound_leaves_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_leaves_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'everness_leaves_hit', gain = 0.25 } + table.dug = table.dug or { name = 'everness_leaves_dug', gain = 0.5 } + table.place = table.place or { name = 'everness_leaves_place', gain = 0.4 } + return table +end + +function Everness.node_sound_wood_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_wood_footstep', gain = 0.15 } + table.dig = table.dig or { name = 'everness_wood_hit', gain = 0.8 } + table.dug = table.dug or { name = 'everness_wood_place', gain = 0.1 } + table.place = table.place or { name = 'everness_wood_place', gain = 0.15 } + return table +end + +function Everness.node_sound_sand_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_sand_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'everness_sand_hit', gain = 0.5 } + table.dug = table.dug or { name = 'everness_sand_dug', gain = 0.1 } + table.place = table.place or { name = 'everness_sand_place', gain = 0.15 } + return table +end + +function Everness.node_sound_metal_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_metal_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'everness_metal_hit', gain = 0.5 } + table.dug = table.dug or { name = 'everness_metal_dug', gain = 0.1 } + table.place = table.place or { name = 'everness_metal_place', gain = 0.15 } + return table +end + +function Everness.node_sound_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_glass_footstep', gain = 0.02 } + table.dig = table.dig or { name = 'everness_glass_footstep', gain = 0.05 } + table.dug = table.dug or { name = 'everness_glass_dug', gain = 0.4 } + table.place = table.place or { name = 'everness_glass_place', gain = 0.2 } + return table +end + +function Everness.node_sound_thin_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_thin_glass_footstep', gain = 0.3 } + table.dig = table.dig or { name = 'everness_thin_glass_footstep', gain = 0.5 } + table.dug = table.dug or { name = 'everness_break_thin_glass', gain = 1.0 } + table.place = table.place or { name = 'everness_glass_place', gain = 0.2 } + return table +end + +function Everness.node_sound_snow_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_snow_footstep', gain = 0.1 } + table.dig = table.dig or { name = 'everness_snow_hit', gain = 0.2 } + table.dug = table.dug or { name = 'everness_snow_footstep', gain = 0.2 } + table.place = table.place or { name = 'everness_snow_place', gain = 0.3 } + return table +end + +function Everness.node_sound_gravel_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_gravel_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_gravel_hit', gain = 1.0 } + table.dug = table.dug or { name = 'everness_gravel_dug', gain = 0.6 } + table.place = table.place or { name = 'everness_gravel_place', gain = 1.0 } + return table +end + +function Everness.node_sound_ceramic_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_ceramic_footstep', gain = 0.2 } + table.dig = table.dig or { name = 'everness_ceramic_hit', gain = 1.0 } + table.dug = table.dug or { name = 'everness_ceramic_dug', gain = 1.0 } + table.place = table.place or { name = 'everness_ceramic_place', gain = 1.0 } + return table +end + +function Everness.node_sound_water_defaults(table) + table = table or {} + table.footstep = table.footstep or { name = 'everness_water_footstep', gain = 0.05 } + Everness.node_sound_defaults(table) + return table +end + +-- +-- Forsted Cave Icicles +-- + +function Everness.stack_icicle_recursive(node, pos_node, incrementer, pos_marker, direction) + local nb = node + local pos = pos_node + local inc = incrementer + local m_pos = pos_marker + + while nb.name == 'air' or nb.name == 'ignore' do + if nb.name == 'ignore' then + Everness.emerge_icicle_area_recursive(pos, inc, m_pos, direction) + break + else + core.set_node(pos, { name = 'everness:frosted_cave_ice_illuminating' }) + -- Shift 1 down + inc = inc + 1 + local y_offset = (direction == 'down') and (m_pos.y - inc) or (m_pos.y + inc) + pos = vector.new(m_pos.x, y_offset, m_pos.z) + nb = core.get_node(pos) + end + end +end + +function Everness.emerge_icicle_area_recursive(pos_node, incrementer, pos_marker, direction) + local y_offset = (direction == 'down') and (pos_node.y - 16) or (pos_node.y + 16) + + core.emerge_area( + vector.new(pos_node.x - 1, pos_node.y, pos_node.z - 1), + vector.new(pos_node.x + 1, y_offset, pos_node.z + 1), + function(blockpos, action, calls_remaining, param) + Everness:emerge_area(blockpos, action, calls_remaining, param) + end, + { + callback = function(data) + local incrementer_cllbck = data.incrementer + local pos_node_cllbck = data.pos_node + local node_cllbck = core.get_node(pos_node_cllbck) + + Everness.stack_icicle_recursive(node_cllbck, pos_node_cllbck, incrementer_cllbck, pos_marker, direction) + end, + data = { + incrementer = incrementer, + pos_node = pos_node + } + } + ) +end + +function Everness.use_shell_of_underwater_breathing(self, itemstack, user, pointed_thing) + if not user then + return + end + + local pos_player = user:get_pos() + + if pointed_thing.type == 'node' then + local pos_pt = core.get_pointed_thing_position(pointed_thing) + + if not pos_pt then + return itemstack + end + + local pointed_node = core.get_node(pos_pt) + local pointed_node_def = core.registered_nodes[pointed_node.name] + + if not pointed_node or not pointed_node_def then + return itemstack + end + + if pointed_node_def.on_rightclick then + return pointed_node_def.on_rightclick(pos_pt, pointed_node, user, itemstack, pointed_thing) + end + end + + local node_head = core.get_node( + vector.new( + math.floor(pos_player.x + 0.5), + math.ceil(pos_player.y + 1), + math.floor(pos_player.z + 0.5) + ) + ) + local breath = user:get_breath() + + if core.get_item_group(node_head.name, 'water') > 0 and breath < 9 then + -- Under water + user:set_breath(9) + + if not core.settings:get_bool('creative_mode') + or not core.check_player_privs(user:get_player_name(), { creative = true }) + then + local wear_to_add = 65535 / 20 + + if itemstack:get_wear() + wear_to_add > 65535 then + local itemstack_def = itemstack:get_definition() + + -- Break tool + core.sound_play(itemstack_def.sound.breaks, { + pos = pos_player, + gain = 0.5 + }, true) + end + + itemstack:add_wear(wear_to_add) + end + + core.sound_play('everness_underwater_bubbles', { + object = user, + gain = 1.0, + max_hear_distance = 16 + }) + + core.add_particlespawner({ + amount = 40, + time = 0.1, + pos = { + min = vector.new(pos_player.x - 0.25, pos_player.y + 1.25, pos_player.z - 0.25), + max = vector.new(pos_player.x + 0.25, pos_player.y + 1.5, pos_player.z + 0.25) + }, + vel = { + min = vector.new(-0.5, 0, -0.5), + max = vector.new(0.5, 0, 0.5) + }, + acc = { + min = vector.new(-0.5, 4, -0.5), + max = vector.new(0.5, 1, 0.5), + }, + exptime = { + min = 1, + max = 2 + }, + size = { + min = 0.5, + max = 2 + }, + texture = { + name = 'everness_bubble.png', + alpha_tween = { + 1, 0, + start = 0.75 + } + } + }) + end + + return itemstack +end + +-- +-- Sapling 'on place' function to check protection of node and resulting tree volume +-- copy from MTG +-- +function Everness.sapling_on_place(self, itemstack, placer, pointed_thing, props) + if core.get_modpath('mcl_util') and core.global_exists('mcl_util') then + local on_place_func = mcl_util.generate_on_place_plant_function(function(pos, node) + local node_below = core.get_node_or_nil({ x = pos.x, y = pos.y - 1, z = pos.z }) + + if not node_below then + return false + end + + local nn = node_below.name + + return core.get_item_group(nn, 'grass_block') == 1 + or (nn == 'everness:mineral_sand' and itemstack:get_name() == 'everness:palm_tree_sapling') + or nn == 'mcl_core:podzol' + or nn == 'mcl_core:podzol_snow' + or nn == 'mcl_core:dirt' + or nn == 'mcl_core:mycelium' + or nn == 'mcl_core:coarse_dirt' + end) + + return on_place_func(itemstack, placer, pointed_thing) + else + local _props = props or {} + local sapling_name = _props.sapling_name + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + local minp_relative = _props.minp_relative + local maxp_relative = _props.maxp_relative + -- maximum interval of interior volume check + local interval = _props.interval + + -- Position of sapling + local pos = pointed_thing.under + local node = core.get_node_or_nil(pos) + local pdef = node and core.registered_nodes[node.name] + + if pdef and node and pdef.on_rightclick + and not (placer and placer:is_player() + and placer:get_player_control().sneak) + then + return pdef.on_rightclick(pos, node, placer, itemstack, pointed_thing) + end + + if not pdef or not pdef.buildable_to then + pos = pointed_thing.above + node = core.get_node_or_nil(pos) + pdef = node and core.registered_nodes[node.name] + + if not pdef or not pdef.buildable_to then + return itemstack + end + end + + local player_name = placer and placer:get_player_name() or '' + + -- Check sapling position for protection + if core.is_protected(pos, player_name) then + core.record_protection_violation(pos, player_name) + return itemstack + end + + -- Check tree volume for protection + if core.is_area_protected( + vector.add(pos, minp_relative), + vector.add(pos, maxp_relative), + player_name, + interval + ) + then + core.record_protection_violation(pos, player_name) + core.chat_send_player( + player_name, + S('@1 will intersect protection on growth.', itemstack:get_definition().description) + ) + + return itemstack + end + + Everness.log_player_action(placer, 'places node', sapling_name, 'at', pos) + + local take_item = not core.is_creative_enabled(player_name) + local newnode = { name = sapling_name } + local ndef = core.registered_nodes[sapling_name] + + core.set_node(pos, newnode) + + -- Run callback + if ndef and ndef.after_place_node then + -- Deepcopy place_to and pointed_thing because callback can modify it + if ndef.after_place_node(table.copy(pos), placer, + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + -- Run script hook + for _, callback in ipairs(core.registered_on_placenodes or {}) do + -- Deepcopy pos, node and pointed_thing because callback can modify them + if callback(table.copy(pos), table.copy(newnode), + placer, table.copy(node or {}), + itemstack, table.copy(pointed_thing)) then + take_item = false + end + end + + if take_item then + itemstack:take_item() + end + + return itemstack + end +end + +-- +-- Leafdecay - taken from MTG +-- + +-- Prevent decay of placed leaves + +Everness.after_place_leaves = function(self, pos, placer, itemstack, pointed_thing) + if placer and placer:is_player() then + local node = core.get_node(pos) + node.param2 = 1 + core.set_node(pos, node) + end +end + +-- Leafdecay +function Everness.leafdecay_after_destruct(pos, oldnode, def) + for _, v in pairs(core.find_nodes_in_area(vector.subtract(pos, def.radius), + vector.add(pos, def.radius), def.leaves)) + do + local node = core.get_node(v) + local timer = core.get_node_timer(v) + if node.param2 ~= 1 + and core.get_meta(v):get_int('everness_prevent_leafdecay') ~= 1 + and not timer:is_started() + then + timer:start(math.random(20, 120) / 10) + end + end +end + +local movement_gravity = tonumber(core.settings:get('movement_gravity')) or 9.81 + +local function leafdecay_on_timer(pos, def) + if core.find_node_near(pos, def.radius, def.trunks) then + return false + end + + local node = core.get_node(pos) + local drops = core.get_node_drops(node.name) + + for _, item in ipairs(drops) do + local is_leaf + for _, v in pairs(def.leaves) do + if v == item then + is_leaf = true + end + end + if item and item ~= '' and (core.get_item_group(item, 'leafdecay_drop') ~= 0 + or not is_leaf) + then + core.add_item({ + x = pos.x - 0.5 + math.random(), + y = pos.y - 0.5 + math.random(), + z = pos.z - 0.5 + math.random(), + }, item) + end + end + + core.remove_node(pos) + core.check_for_falling(pos) + + -- spawn a few particles for the removed node + core.add_particlespawner({ + amount = 8, + time = 0.001, + minpos = vector.subtract(pos, { x = 0.5, y = 0.5, z = 0.5 }), + maxpos = vector.add(pos, { x = 0.5, y = 0.5, z = 0.5 }), + minvel = vector.new(-0.5, -1, -0.5), + maxvel = vector.new(0.5, 0, 0.5), + minacc = vector.new(0, -movement_gravity, 0), + maxacc = vector.new(0, -movement_gravity, 0), + minsize = 0, + maxsize = 0, + node = node, + }) +end + +function Everness.register_leafdecay(self, def) + assert(def.leaves) + assert(def.trunks) + assert(def.radius) + + for _, v in pairs(def.trunks) do + self.leafdecay_trunk_defs[v] = def + core.override_item(v, { + after_destruct = function(pos, oldnode) + Everness.leafdecay_after_destruct(pos, oldnode, def) + end, + }) + end + + for _, v in pairs(def.leaves) do + core.override_item(v, { + on_timer = function(pos) + leafdecay_on_timer(pos, def) + end, + }) + end +end + +function Everness.register_node(self, name, def) + local _def = table.copy(def) + local _name = name + + _def.mod_origin = 'everness' + + -- X Farming composter description + if core.get_modpath('x_farming') and core.global_exists and core.global_exists('x_farming') then + -- X Farming + if _def.groups and (_def.groups.compost or 0) > 0 then + _def.description = _def.description .. '\n' .. S('Compost chance') .. ': ' .. def.groups.compost .. '%' + end + end + + -- MCL compatibility: + -- In VoxeLibre and Mineclonia, _mcl_autogroup maps oddly_breakable_by_hand to handy = X, + -- and cracky to pickaxey = X. + -- In MTG, 3 means fastest/easiest, but in MCL 3 means tier 3 (diamond / impossible for hand). + -- Setting oddly_breakable_by_hand = 1 and handy = 1 prevents _mcl_autogroup from assigning handy = 3. + -- And if pickaxey is 1, cracky must not exceed 1 so wooden pickaxes can harvest it. + if core.get_modpath('mcl_core') and _def.groups then + if _def.groups.oddly_breakable_by_hand then + _def.groups.oddly_breakable_by_hand = 1 + _def.groups.handy = 1 + end + if _def.groups.pickaxey == 1 and _def.groups.cracky and _def.groups.cracky > 1 then + _def.groups.cracky = 1 + end + end + + self.registered_nodes[_name] = _def + if core.register_node then + core.register_node(_name, _def) + end +end + +function Everness.register_tool(self, name, def) + local _def = table.copy(def) + local _name = name + + _def.mod_origin = 'everness' + + self.registered_tools[_name] = _def + if core.register_tool then + core.register_tool(_name, _def) + end +end + +function Everness.register_abm(self, def) + local _def = table.copy(def) + local _name = _def.label + + self.registered_abms[_name] = _def + if core.register_abm then + core.register_abm(_def) + end +end + +function Everness.register_lbm(self, def) + local _def = table.copy(def) + local _name = _def.name + + self.registered_lbms[_name] = _def + if core.register_lbm then + core.register_lbm(_def) + end +end + +function Everness.register_craftitem(self, name, def) + local _def = table.copy(def) + local _name = name + + _def.mod_origin = 'everness' + + self.registered_craftitems[_name] = _def + if core.register_craftitem then + core.register_craftitem(_name, _def) + end +end + +function Everness.register_biome(self, def) + local _def = table.copy(def) + local _name = _def.name + + self.registered_biomes[_name] = _def + if core.register_biome then + core.register_biome(_def) + end +end + +function Everness.register_decoration(self, def) + local _def = table.copy(def) + local _name = _def.name + + self.registered_decorations[_name] = _def + if core.registered_decorations then + core.registered_decorations[_name] = _def + end + if core.register_decoration then + core.register_decoration(_def) + end +end + +function Everness.register_ore(self, def) + local _def = table.copy(def) + -- @TOTO using `ore` as name here will override the entry when there are multiple ore registrations for the same ore (different noise) + -- using indexed table would be more appropriate here + local _name = _def.ore + + self.registered_ores[_name] = _def + if core.register_ore then + core.register_ore(_def) + end +end + +-- +-- Log API / helpers - copy from MTG +-- + +local log_non_player_actions = core.settings:get_bool('log_non_player_actions', false) + +local is_pos = function(v) + return type(v) == 'table' + and type(v.x) == 'number' + and type(v.y) == 'number' + and type(v.z) == 'number' +end + +function Everness.log_player_action(player, ...) + local msg = player:get_player_name() + if player.is_fake_player or not player:is_player() then + if not log_non_player_actions then + return + end + + msg = msg .. '(' .. (type(player.is_fake_player) == 'string' + and player.is_fake_player or '*') .. ')' + end + for _, v in ipairs({ ... }) do + -- translate pos + local part = is_pos(v) and core.pos_to_string(v) or v + -- no leading spaces before punctuation marks + msg = msg .. (string.match(part, '^[;,.]') and '' or ' ') .. part + end + + core.log('action', msg) +end + +function Everness.set_inventory_action_loggers(def, name) + def.on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + Everness.log_player_action(player, 'moves stuff in', name, 'at', pos) + end + def.on_metadata_inventory_put = function(pos, listname, index, stack, player) + Everness.log_player_action(player, 'moves', stack:get_name(), 'to', name, 'at', pos) + end + def.on_metadata_inventory_take = function(pos, listname, index, stack, player) + Everness.log_player_action(player, 'takes', stack:get_name(), 'from', name, 'at', pos) + end +end + +-- 'can grow' function - copy from MTG + +function Everness.can_grow(pos, groups_under) + local node_under = core.get_node_or_nil({ x = pos.x, y = pos.y - 1, z = pos.z }) + + if not node_under then + return false + end + + local _groups_under = groups_under + + if not groups_under then + _groups_under = { 'soil' } + end + + local has_fertile_under = false + + -- Check is one of the `groups_under` are under the sapling + for i, v in ipairs(_groups_under) do + if core.get_item_group(node_under.name, v) > 0 then + has_fertile_under = true + break + end + end + + if not has_fertile_under then + return false + end + + local light_level = core.get_node_light(pos) + + if not light_level or light_level < 13 then + return false + end + + return true +end + +-- +-- This method may change in future. +-- Copy from MTG +-- + +function Everness.can_interact_with_node(player, pos) + if player and player:is_player() then + if core.check_player_privs(player, 'protection_bypass') then + return true + end + else + return false + end + + local meta = core.get_meta(pos) + local owner = meta:get_string('owner') + + if not owner or owner == '' or owner == player:get_player_name() then + return true + end + + -- Is player wielding the right key? + local item = player:get_wielded_item() + + if core.get_item_group(item:get_name(), 'key') == 1 then + local key_meta = item:get_meta() + + if key_meta:get_string('secret') == '' then + local key_oldmeta = item:get_metadata() + + if key_oldmeta == '' or not core.parse_json(key_oldmeta) then + return false + end + + key_meta:set_string('secret', core.parse_json(key_oldmeta).secret) + item:set_metadata('') + end + + return meta:get_string('key_lock_secret') == key_meta:get_string('secret') + end + + return false +end + +-- +-- Optimized helper to put all items in an inventory into a drops list +-- copy from MTG +-- + +function Everness.get_inventory_drops(pos, inventory, drops) + local inv = core.get_meta(pos):get_inventory() + local n = #drops + for i = 1, inv:get_size(inventory) do + local stack = inv:get_stack(inventory, i) + if stack:get_count() > 0 then + drops[n + 1] = stack:to_table() + n = n + 1 + end + end +end + +function Everness.set_loot_chest_items() + local loot_items = {} + + for name, def in pairs(core.registered_items) do + local craft_recipe = core.get_craft_recipe(name) + local mod_name = name:split(':')[1] + + if def.groups + and next(def.groups) + and (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) + and (craft_recipe.items or mod_name == 'default' or mod_name == 'mcl_core') + then + table.insert(loot_items, { + name = name, + max_count = 10, + chance = 25 + }) + end + end + + Everness.loot_chest.default = table.copy(loot_items) +end + +function Everness.populate_loot_chests(self, positions, params) + local _params = params or {} + local _loot_chest_items_group = _params.loot_chest_items_group or 'default' + + -- Get inventories + local string_positions = ''; + local inventories = {} + + for i, pos in ipairs(positions) do + local inv = core.get_inventory({ type = 'node', pos = pos }) + + if not inv then + local chest_def = core.registered_nodes['everness:chest'] + chest_def.on_construct(pos) + inv = core.get_inventory({ type = 'node', pos = pos }) + end + + if inv then + table.insert(inventories, inv) + string_positions = string_positions .. ' ' .. pos:to_string() + else + core.log('warning', '[Everness] FAILED to populate loot chests inventory at ' .. pos:to_string()) + end + end + + if #inventories > 0 and self.loot_chest[_loot_chest_items_group] and #self.loot_chest[_loot_chest_items_group] > 0 then + for index, value in ipairs(inventories[1]:get_list('main')) do + local rand_idx = rand_global:next(1, #self.loot_chest[_loot_chest_items_group]) + local item_def = self.loot_chest[_loot_chest_items_group][rand_idx] + + if item_def and core.registered_items[item_def.name] then + if rand_global:next(0, 100) <= item_def.chance then + local stack = ItemStack(item_def.name) + + if core.registered_tools[item_def.name] then + stack:set_wear(rand_global:next(1, 65535)) + else + stack:set_count(rand_global:next(1, math.min(item_def.max_count, stack:get_stack_max()))) + end + + local rand_inv = inventories[rand_global:next(1, #inventories)] + rand_inv:set_stack('main', index, stack) + end + end + end + + core.log('action', '[Everness] Loot chests inventory populated at ' .. string_positions) + end +end + +-- +-- Hammer +-- Modified version of default:tnt from MT +-- @license MIT + +local function rand_pos(center, pos, radius) + local def + local reg_nodes = core.registered_nodes + local i = 0 + + repeat + -- Give up and use the center if this takes too long + if i > 4 then + pos.x, pos.z = center.x, center.z + break + end + + pos.x = center.x + math.random(-radius, radius) + pos.z = center.z + math.random(-radius, radius) + def = reg_nodes[core.get_node(pos).name] + i = i + 1 + until def and not def.walkable +end + +local function eject_drops(drops, pos, radius) + local drop_pos = vector.new(pos) + + for _, item in pairs(drops) do + local total_count = item:get_count() + local stack_max = item:get_stack_max() + + while total_count > 0 do + local take = math.min(total_count, stack_max) + + -- `drop_pos` is being randomized here + rand_pos(pos, drop_pos, radius) + + local dropitem = ItemStack(item) + dropitem:set_count(take) + + local obj = core.add_item(drop_pos, dropitem) + + if obj then + local ent = obj:get_luaentity() + if ent then + ent.collect = true + end + obj:set_acceleration({ x = 0, y = -10, z = 0 }) + obj:set_velocity({ + x = math.random(-2, 2), + y = math.random(0, 2), + z = math.random(-2, 2) + }) + end + + total_count = total_count - take + end + end +end + +-- Populate `drops` table +local function add_drop(drops, item) + item = ItemStack(item) + + local name = item:get_name() + local drop = drops[name] + + if drop == nil then + drops[name] = item + else + drop:set_count(drop:get_count() + item:get_count()) + end +end + +local function destroy(drops, npos, cid, c_air, digger, owner) + if core.is_protected(npos, owner) then + return cid + end + + local def = Everness.hammer_cid_data[cid] + + if not def then + return cid + elseif def.can_dig and not def.can_dig(npos, digger) then + return cid + else + local node_drops = core.get_node_drops(def.name, '') + + for _, item in pairs(node_drops) do + add_drop(drops, item) + end + + return c_air + end +end + +-- Draw wear bar texture overlay +function Everness.draw_wear_bar(itemstack, wear) + local itemstack_meta = itemstack:get_meta() + local px_width = 14 + local px_one = 65535 / px_width + local px_color = px_width - math.floor(wear / px_one) + + local inventory_overlay = '[combine:16x16' + + for i = 1, px_width do + if i > px_color then + inventory_overlay = inventory_overlay .. ':' .. i .. ',14=[combine\\:1x1\\^[noalpha\\^[colorize\\:#000000\\:255' + else + local color + + if px_color < px_width / 4 then + -- below 25% + color = '#FF0000' + elseif px_color < (px_width / 4) * 2 then + -- below 50% + color = '#FFA500' + elseif px_color < (px_width / 4) * 3 then + -- below 75% + color = '#FFFF00' + else + -- above 75% + color = '#00FF00' + end + + inventory_overlay = inventory_overlay .. ':' .. i .. ',14=[combine\\:1x1\\^[noalpha\\^[colorize\\:' .. color .. '\\:255' + end + end + + itemstack_meta:set_string('inventory_overlay', inventory_overlay) +end + +function Everness.hammer_after_dig_node(pos, node, metadata, digger) + if not digger then + return + end + + local wielditem = digger:get_wielded_item() + + if not (wielditem:get_name() == 'everness:hammer' or wielditem:get_name() == 'everness:hammer_sharp') then + return + end + + local radius = 1 + local orig_pos = vector.copy(pos) + local raw_look_dir = digger:get_look_dir() or vector.new(0, 0, 1) + local look_dir_norm = vector.length(raw_look_dir) > 0 and vector.normalize(raw_look_dir) or vector.new(0, 0, 1) + + -- Determine dominant step direction along cardinal axes to center blast 1 block in front of player + local abs_x = math.abs(look_dir_norm.x) + local abs_y = math.abs(look_dir_norm.y) + local abs_z = math.abs(look_dir_norm.z) + + local step_dir + if abs_y > abs_x and abs_y > abs_z then + step_dir = vector.new(0, look_dir_norm.y > 0 and 1 or -1, 0) + elseif abs_x > abs_z then + step_dir = vector.new(look_dir_norm.x > 0 and 1 or -1, 0, 0) + else + step_dir = vector.new(0, 0, look_dir_norm.z > 0 and 1 or -1) + end + + pos = vector.add(pos, step_dir) + local c_air = core.CONTENT_AIR + local c_ignore = core.CONTENT_IGNORE + local vm = VoxelManip() + local p1 = vector.subtract(pos, radius) + local p2 = vector.add(pos, radius) + local minp, maxp = vm:read_from_map(p1, p2) + local voxel_area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + -- `drops` are being populated in `add_drop` method, called from `destroy` method + local drops = {} + local p_name = digger:get_player_name() + + if not core.is_creative_enabled(p_name) then + local wielditem_meta = wielditem:get_meta() + local wielditem_wear = wielditem_meta:get_int('everness_wear') + local node_def = core.registered_nodes[node.name] + local wielditem_def = wielditem:get_definition() + local dig_params = core.get_dig_params(node_def and node_def.groups, wielditem_def and wielditem_def.tool_capabilities, wielditem:get_wear()) + local new_wear = wielditem_wear + dig_params.wear + + -- Add wear + wielditem_meta:set_int('everness_wear', new_wear) + + -- Draw wear bar texture overlay + Everness.draw_wear_bar(wielditem, new_wear) + + if new_wear > 65535 then + -- Break tool + core.sound_play(wielditem_def.sound.breaks, { + pos = pos, + gain = 0.5 + }, true) + + digger:set_wielded_item(ItemStack('')) + else + -- Save wear + digger:set_wielded_item(wielditem) + end + end + + local is_regular_hammer = wielditem:get_name() == 'everness:hammer' + local lx, ly, lz = look_dir_norm.x, look_dir_norm.y, look_dir_norm.z + local max_depth = 2.0 + + -- Digging blast + for z = -radius, radius do + for y = -radius, radius do + local vi = voxel_area:index(pos.x + (-radius), pos.y + y, pos.z + z) + + for x = -radius, radius do + local cid = data[vi] + + if cid ~= c_air and cid ~= c_ignore then + local px, py, pz = pos.x + x, pos.y + y, pos.z + z + + if is_regular_hammer then + local vx = px - orig_pos.x + local vy = py - orig_pos.y + local vz = pz - orig_pos.z + local depth = vx * lx + vy * ly + vz * lz + + if depth >= -0.35 and depth <= max_depth then + local perpx = vx - depth * lx + local perpy = vy - depth * ly + local perpz = vz - depth * lz + local r_perp = math.sqrt(perpx * perpx + perpy * perpy + perpz * perpz) + local norm_d = math.max(0.0, depth) / max_depth + local r_allow = 1.45 * math.sqrt(math.max(0.0, 1.0 - norm_d * norm_d)) + local delta = r_allow - r_perp + + if delta >= 0.20 then + -- Solid core of dome: 100% reliably excavated + local p = vector.new(px, py, pz) + data[vi] = destroy(drops, p, cid, c_air, digger, p_name) + elseif delta > -0.30 then + -- Jagged rim: probabilistic fracture at the outer edge + local prob = (delta + 0.30) / 0.50 + if math.random() <= prob then + local p = vector.new(px, py, pz) + data[vi] = destroy(drops, p, cid, c_air, digger, p_name) + end + end + end + else + local p = vector.new(px, py, pz) + data[vi] = destroy(drops, p, cid, c_air, digger, p_name) + end + end + + vi = vi + 1 + end + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() + vm:update_liquids() + + -- Call `check_single_for_falling` for everything within 1.5x blast radius + for y = math.round(-radius * 1.5), math.round(radius * 1.5) do + for z = math.round(-radius * 1.5), math.round(radius * 1.5) do + for x = math.round(-radius * 1.5), math.round(radius * 1.5) do + core.check_single_for_falling(vector.new(pos.x + x, pos.y + y, pos.z + z)) + end + end + end + + eject_drops(drops, pos, radius) + + -- Get texture for particles from majority of the dug nodes + local node_for_particles + local most = 0 + local majority_def + + for name, stack in pairs(drops) do + local count = stack:get_count() + + if count > most then + most = count + local def = core.registered_nodes[name] + + if def then + node_for_particles = { name = name } + majority_def = def + end + end + end + + -- Play sounds once for majority dug node + if majority_def and majority_def.sounds and majority_def.sounds.dug then + for _ = 1, math.random(2, 4) do + local drop_pos = vector.new(pos) + rand_pos(pos, drop_pos, radius) + + core.after( + math.random(2, 8) / 10, + function() + core.sound_play(majority_def.sounds.dug, { + pos = drop_pos, + pitch = math.random(8, 12) / 10 + }, true) + end + ) + end + end + + if node_for_particles then + core.add_particlespawner({ + amount = 64, + time = 0.1, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x = -2, y = 0, z = -2}, + maxvel = {x = 2, y = 5, z = 2}, + minacc = {x = 0, y = -10, z = 0}, + maxacc = {x = 0, y = -10, z = 0}, + minexptime = 0.8, + maxexptime = 2.0, + minsize = radius * 0.33, + maxsize = radius, + node = node_for_particles, + collisiondetection = true, + }) + end +end + +-- Function triggered for each qualifying node. +-- `dtime_s` is the in-game time (in seconds) elapsed since the block +-- was last active +function Everness.cool_lava(pos, node, dtime_s, prev_cool_lava_action) + -- Variant Obsidian + if + node.name == 'default:lava_source' + or node.name == 'mcl_core:lava_source' + or node.name == 'everness:lava_source' + then + if math.random(1, 10) == 1 then + local obi_nodes = { + { name = 'everness:blue_crying_obsidian', color = '#2978A6'}, + { name = 'everness:blue_weeping_obsidian', color = '#25B8FF'}, + { name = 'everness:weeping_obsidian', color = '#C90FFF'}, + } + local rand_node = obi_nodes[math.random(1, #obi_nodes)] + + core.set_node(pos, { + name = rand_node.name + }) + + core.sound_play('everness_cool_lava', + { + pos = pos, + max_hear_distance = 16, + gain = 0.2 + }, + true + ) + + if core.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + core.add_particlespawner({ + amount = 80, + time = 1, + size = { + min = 0.5, + max = 1, + }, + exptime = 1, + pos = pos, + glow = 7, + attract = { + kind = 'point', + strength = 0.5, + origin = pos, + die_on_contact = true + }, + radius = 3, + texture = { + name = 'everness_particle.png^[colorize:' .. rand_node.color .. ':255', + alpha_tween = { + 0, 1, + style = 'fwd', + reps = 1 + }, + scale_tween = { + 0.25, 1, + style = 'fwd', + reps = 1 + } + } + }) + end + elseif node.name == 'everness:lava_source' then + -- Lava flowing + core.set_node(pos, {name = 'default:obsidian'}) + elseif node.name == 'everness:lava_flowing' then + -- Lava flowing + core.set_node(pos, {name = 'default:stone'}) + else + prev_cool_lava_action(pos, node, dtime_s) + end + else + prev_cool_lava_action(pos, node, dtime_s) + end +end +function Everness.get_pot_formspec(pos, label, model_texture) + local spos = pos.x .. ',' .. pos.y .. ',' .. pos.z + local hotbar_bg = '' + local list_bg = '' + + for i = 0, 7, 1 do + hotbar_bg = hotbar_bg .. 'image[' .. 0 + i .. ', ' .. 4.85 .. ';1,1;everness_chest_ui_bg_hb_slot.png]' + end + + for row = 0, 2, 1 do + for i = 0, 7, 1 do + list_bg = list_bg .. 'image[' .. 0 + i .. ',' .. 6.08 + row .. ';1,1;everness_chest_ui_bg_slot.png]' + end + end + + local model = 'model[0,0.5;2.5,2.5;everness_ceramic_pot;everness_ceramic_pot.obj;' .. model_texture .. ';0,0;true;false;]' + + local formspec = { + 'size[8,9]', + 'listcolors[#FFFFFF00;#FFFFFF1A;#5E5957]', + 'background[5,5;1,1;everness_chest_ui_bg.png;true]', + 'list[nodemeta:' .. spos .. ';main;0.5,3;1,1;]', + 'list[current_player;main;0,4.85;8,1;]', + 'list[current_player;main;0,6.08;8,3;8]', + 'listring[nodemeta:' .. spos .. ';main]', + 'listring[current_player;main]', + list_bg, + hotbar_bg, + 'image[0.5,3;1,1;everness_chest_ui_bg_hb_slot.png]', + 'label[2.5,0.5;' .. core.formspec_escape(label) .. ']', + model + } + + formspec = table.concat(formspec, '') + + return formspec +end + +-- +-- Encyclopedia +-- + +local ency_data = { + nodes = {}, + tools = {}, + abms = {}, + lbms = {}, + craftitems = {}, + biomes = {}, + decorations = {}, + ores = {}, +} + +-- +-- Encyclopedia Helpers +-- + +local function tchelper(first, rest) + return first:upper()..rest:lower() +end + +local function capitalize(str) + -- Add extra characters to the pattern if you need to. _ and ' are + -- found in the middle of identifiers and English words. + -- We must also put %w_' into [%w_'] to make it handle normal stuff + -- and extra stuff the same. + -- This also turns hex numbers into, eg. 0Xa7d4 + return str:gsub("(%a)([%w_']*)", tchelper) +end + +local function tech_name_to_pretty_name(tech_name) + local short_name = tech_name:split(':')[2] + short_name = short_name:gsub('_', ' ') + short_name = capitalize(short_name) + + return short_name +end + +local function get_model_texture_from_tile_definition(tile_def) + -- Assumptions its a string + local texture = '' + + for i, v in ipairs(tile_def) do + local temp = tile_def[i] + + if type(temp) == 'table' then + if temp.name then + temp = temp.name + else + temp = temp[i] + end + end + + texture = texture .. (i == 1 and '' or ',') .. temp + end + + return texture +end + +local function get_unordered_list(tbl, pos, formspec, lvl) + local _formspec = formspec or {} + local _lvl = lvl or 1 + + for k, v in pairs(tbl) do + if type(v) == 'table' then + -- Label + pos.y = pos.y + 0.25 + _formspec[#_formspec + 1] = ('label[%f,%f;%s]'):format(pos.x + 0.25 * _lvl, pos.y, k .. ':') + get_unordered_list(v, pos, _formspec, _lvl + 1) + else + if core.registered_items[v] then + pos.y = pos.y + 0.25 + -- Label + _formspec[#_formspec + 1] = ('label[%f,%f;%s]'):format(pos.x + 0.25 * _lvl, pos.y, k .. ':') + pos.y = pos.y + 0.25 + -- Item image + _formspec[#_formspec + 1] = ('item_image[%f,%f;1,1;%s]'):format(pos.x + 0.25 * _lvl, pos.y, v) + -- Tooltip for description + _formspec[#_formspec + 1] = ('tooltip[%f,%f;1,1;%s]'):format(pos.x + 0.25 * _lvl, pos.y, core.formspec_escape(v)) + pos.y = pos.y + 1 + else + pos.y = pos.y + 0.25 + -- List "bullet" + _formspec[#_formspec + 1] = ('label[%f,%f;%s]'):format(pos.x + 0.25 * _lvl, pos.y, k .. ': ' .. v) + end + end + end + + _formspec = table.concat(_formspec, '') + + return _formspec +end + +-- +-- Encyclopedia API +-- + +function Everness.encyclopedia_init(self) + -- Nodes + for name, def in pairs(self.registered_nodes) do + if def.groups + and (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) + then + table.insert(ency_data.nodes, name) + end + end + + -- Tools + for name, def in pairs(self.registered_tools) do + if def.groups + and (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) + then + table.insert(ency_data.tools, name) + end + end + + -- ABMs + for name, def in pairs(self.registered_abms) do + table.insert(ency_data.abms, name) + end + + -- LBMs + for name, def in pairs(self.registered_lbms) do + table.insert(ency_data.lbms, name) + end + + -- Craftitems + for name, def in pairs(self.registered_craftitems) do + if def.groups + and (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) + then + table.insert(ency_data.craftitems, name) + end + end + + -- Biomes + for name, def in pairs(self.registered_biomes) do + table.insert(ency_data.biomes, name) + end + + -- Decorations + for name, def in pairs(self.registered_decorations) do + table.insert(ency_data.decorations, name) + end + + -- Ores + for name, def in pairs(self.registered_ores) do + table.insert(ency_data.ores, name) + end + + -- Sort alphabetically + table.sort(ency_data.nodes, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.tools, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.abms, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.lbms, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.craftitems, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.biomes, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.decorations, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + table.sort(ency_data.ores, function(a ,b) + return tech_name_to_pretty_name(a) < tech_name_to_pretty_name(b) + end) + + if core.get_modpath('unified_inventory') then + self:encyclopedia_ui_register_page() + elseif core.get_modpath('i3') then + self:encyclopedia_i3_register_page() + elseif core.get_modpath('sfinv') and sfinv.enabled then + self:encyclopedia_sfinv_register_page() + end +end + +function Everness.encyclopedia_get_formspec(self, context) + local pos_primary = vector.new() + local pos_secondary = vector.new() + local pos_secondary_container = vector.new() + local primary_selected_idx = context.everness_ency_primary_selected_idx or 1 + local dropdown_idx = context.everness_ency_dropdown_idx or 1 + + context.everness_ency_primary_selected_idx = primary_selected_idx + context.everness_ency_dropdown_idx = dropdown_idx + + -- Get dropdown items + local ency_dropdown_items = {} + + for k, v in pairs(ency_data) do + table.insert(ency_dropdown_items, k) + end + + table.sort(ency_dropdown_items) + + -- Dropdown string value (main category) + local dropdown_value = ency_dropdown_items[dropdown_idx] + -- Data to show in secondary container (corresponding to selected index in primary item list) + local primary_list_data = ency_data[dropdown_value] + -- Get primary list items (list on the left) + local primary_list_items = {} + + for k, v in ipairs(primary_list_data) do + table.insert(primary_list_items, tech_name_to_pretty_name(v)) + end + + -- Primary list selected item value (item technical name, e.g. 'everness:palm_tree_wood') + local primary_list_selected_value = primary_list_data[primary_selected_idx] + local def = self['registered_' .. dropdown_value][primary_list_selected_value] + + pos_primary.x = pos_primary.x + 0.25 + pos_primary.y = pos_primary.y + 0.5 + + local formspec = { + -- Title + 'real_coordinates[true]', + ('label[%f,%f;%s]'):format(pos_primary.x, pos_primary.y, core.formspec_escape(S('Everness Encyclopedia'))), + } + + -- Dropdown (main categories) + pos_primary.y = pos_primary.y + 0.4 + formspec[#formspec + 1] = ('dropdown[%f,%f;4,0.4;everness_ency_dropdown;%s;%d;true]'):format(pos_primary.x, pos_primary.y, table.concat(ency_dropdown_items, ','), dropdown_idx) + -- Primary list + pos_primary.y = pos_primary.y + 0.6 + formspec[#formspec + 1] = ('textlist[%f,%f;4,9;everness_ency_main_list;%s;%d;false]'):format(pos_primary.x, pos_primary.y, table.concat(primary_list_items, ','), primary_selected_idx) + -- Secondary (details on the right) + pos_secondary.x = pos_secondary.x + 4.5 + pos_secondary.y = pos_secondary.y + 1.4 + formspec[#formspec + 1] = ('scroll_container[%f,%f;5.5,9;everness_ency_detail_view_scrollbar;vertical;0.1]'):format(pos_secondary.x, pos_secondary.y) + -- Secondary title + pos_secondary_container.y = pos_secondary_container.y + 0.25 + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, primary_list_selected_value) + -- Margin + pos_secondary_container.y = pos_secondary_container.y + 0.5 + + if core['registered_' .. dropdown_value][primary_list_selected_value] + and dropdown_value ~= 'biomes' + and dropdown_value ~= 'decorations' + and dropdown_value ~= 'ores' + then + if def.mesh then + -- Item model + formspec[#formspec + 1] = ('model[%f,%f;2,2;%s;%s;%s;-30,0;true;true;]'):format(pos_secondary_container.x, pos_secondary_container.y, primary_list_selected_value, def.mesh, get_model_texture_from_tile_definition(def.tiles)) + else + -- Item image + formspec[#formspec + 1] = ('item_image[%f,%f;2,2;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, primary_list_selected_value) + end + + if def.description then + -- Tooltip for description + formspec[#formspec + 1] = ('tooltip[%f,%f;2,2;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, core.formspec_escape(def.description)) + end + + pos_secondary_container.y = pos_secondary_container.y + 2 + elseif def and def.description then + -- Label description + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, core.formspec_escape(def.description)) + end + + if def and def.label then + pos_secondary_container.y = pos_secondary_container.y + 0.25 + -- Label description + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, core.formspec_escape(def.label)) + end + + -- Groups + if def and def.groups and next(def.groups) then + pos_secondary_container.y = pos_secondary_container.y + 0.5 + -- Title + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, 'Groups:') + -- Unordered list + formspec[#formspec + 1] = get_unordered_list((def.groups or {}), pos_secondary_container) + end + + -- Tool capabilities + if def and def.tool_capabilities and next(def.tool_capabilities) then + pos_secondary_container.y = pos_secondary_container.y + 0.5 + -- Title + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, 'Tool Capabilities:') + -- Unordered list + formspec[#formspec + 1] = get_unordered_list((def.tool_capabilities or {}), pos_secondary_container) + end + + -- ABM/LBM nodenames + if def and def.nodenames then + pos_secondary_container.y = pos_secondary_container.y + 0.5 + -- Title + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, 'Apply "action" function to these nodes:') + -- Unordered list + formspec[#formspec + 1] = get_unordered_list((def.nodenames or {}), pos_secondary_container) + end + + -- ABM neighbors + if def and def.neighbors and next(def.neighbors) then + pos_secondary_container.y = pos_secondary_container.y + 0.5 + -- Title + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, 'Only apply "action" to nodes that have one of, or any combination of, these neighbors:') + -- Unordered list + formspec[#formspec + 1] = get_unordered_list((def.neighbors or {}), pos_secondary_container) + end + + if def and def.run_at_every_load then + pos_secondary_container.y = pos_secondary_container.y + 0.5 + formspec[#formspec + 1] = ('label[%f,%f;%s]'):format(pos_secondary_container.x, pos_secondary_container.y, 'Run at every load: ' .. (def.run_at_every_load and 'yes' or 'no')) + end + + -- Biomes + if def and dropdown_value == 'biomes' then + -- Unordered list + formspec[#formspec + 1] = get_unordered_list(def, pos_secondary_container) + end + + -- Decorations + if def and dropdown_value == 'decorations' then + -- Unordered list + formspec[#formspec + 1] = get_unordered_list(def, pos_secondary_container) + end + + -- Ores + if def and dropdown_value == 'ores' then + -- Unordered list + formspec[#formspec + 1] = get_unordered_list(def, pos_secondary_container) + end + + -- Close secondary container + formspec[#formspec + 1] = 'scroll_container_end[]' + -- Add scrollbar to secondary container + formspec[#formspec + 1] = ('scrollbaroptions[min=0;max=%d;smallstep=10;largestep=100;thumbsize=10;arrows=default]'):format(math.ceil(pos_secondary_container.y * 10)) + formspec[#formspec + 1] = ('scrollbar[%f,%f;0.15,9;vertical;everness_ency_detail_view_scrollbar;]'):format(pos_secondary.x + 5.5 + 0.15, pos_secondary.y) + + return formspec +end + +function Everness.encyclopedia_i3_register_page(self) + i3.new_tab('everness_encyclopedia', { + description = 'Everness', + image = 'everness_logo.png', + slots = false, + formspec = function(player, data, fs) + local context = data or {} + local formspec = self:encyclopedia_get_formspec(context) + formspec = table.concat(formspec, '') + fs(formspec) + end, + fields = function(player, data, fields) + if fields.everness_ency_main_list then + local main_list_event = core.explode_textlist_event(fields.everness_ency_main_list) + + -- Set context data + if main_list_event.type == 'CHG' then + data.everness_ency_primary_selected_idx = main_list_event.index + end + elseif fields.everness_ency_dropdown then + local prev_everness_ency_dropdown_idx = data.everness_ency_dropdown_idx + local new_everness_ency_dropdown_idx = tonumber(fields.everness_ency_dropdown) + data.everness_ency_dropdown_idx = new_everness_ency_dropdown_idx + + -- Change to 1st primary list item index only when changing dropdown + if prev_everness_ency_dropdown_idx ~= new_everness_ency_dropdown_idx then + data.everness_ency_primary_selected_idx = 1 + end + end + end, + access = function(player, data) + return core.check_player_privs(player:get_player_name(), 'everness_encyclopedia') + end, + }) +end + +function Everness.encyclopedia_ui_register_page(self) + unified_inventory.register_page('everness:encyclopedia', { + get_formspec = function(player) + local context = unified_inventory.everness_context[player:get_player_name()] + local formspec = self:encyclopedia_get_formspec(context) + + return { + formspec = table.concat(formspec, ''), + draw_inventory = false, + draw_item_list = false + } + end + }) + + core.register_on_joinplayer(function(player) + local pname = player:get_player_name() + + unified_inventory.everness_context = {} + unified_inventory.everness_context[pname] = { + everness_ency_dropdown_idx = 1, + everness_ency_primary_selected_idx = 1, + } + end) + + core.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= '' then + return + end + + local pname = player:get_player_name() + + if fields.everness_ency_main_list then + local main_list_event = core.explode_textlist_event(fields.everness_ency_main_list) + + -- Set context data + if main_list_event.type == 'CHG' then + unified_inventory.everness_context[pname].everness_ency_primary_selected_idx = main_list_event.index + unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[pname]) + end + elseif fields.everness_ency_dropdown then + local prev_everness_ency_dropdown_idx = unified_inventory.everness_context[pname].everness_ency_dropdown_idx + local new_everness_ency_dropdown_idx = tonumber(fields.everness_ency_dropdown) + unified_inventory.everness_context[pname].everness_ency_dropdown_idx = new_everness_ency_dropdown_idx + + -- Change to 1st primary list item index only when changing dropdown + if prev_everness_ency_dropdown_idx ~= new_everness_ency_dropdown_idx then + unified_inventory.everness_context[pname].everness_ency_primary_selected_idx = 1 + end + + unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[pname]) + end + end) + + unified_inventory.register_button('everness:encyclopedia', { + type = 'image', + image = 'everness_logo.png', + tooltip = 'Everness Encyclopedia', + condition = function(player) + return core.check_player_privs(player:get_player_name(), 'everness_encyclopedia') + end, + action = function(player) + local pname = player:get_player_name() + + if not core.check_player_privs(pname, 'everness_encyclopedia') then + core.chat_send_player(pname, S('You need "everness_encyclopedia" privilige to access this button.')) + unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[pname]) + return + end + + unified_inventory.current_page[pname] = 'everness:encyclopedia' + unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[pname]) + end, + }) +end + +function Everness.encyclopedia_sfinv_register_page(self) + sfinv.register_page('everness:encyclopedia', { + title = 'Everness', + is_in_nav = function(_self, player, context) + return core.check_player_privs(player:get_player_name(), 'everness_encyclopedia') + end, + get = function(_self, player, context) + local formspec = self:encyclopedia_get_formspec(context) + return sfinv.make_formspec(player, context, table.concat(formspec, '')) + end, + on_player_receive_fields = function (_self, player, context, fields) + if fields.everness_ency_main_list then + local main_list_event = core.explode_textlist_event(fields.everness_ency_main_list) + + -- Set context data + if main_list_event.type == 'CHG' then + context.everness_ency_primary_selected_idx = main_list_event.index + sfinv.set_player_inventory_formspec(player) + end + end + + if fields.everness_ency_dropdown then + local prev_everness_ency_dropdown_idx = context.everness_ency_dropdown_idx + local new_everness_ency_dropdown_idx = tonumber(fields.everness_ency_dropdown) + context.everness_ency_dropdown_idx = new_everness_ency_dropdown_idx + + -- Change to 1st primary list item index only when changing dropdown + if prev_everness_ency_dropdown_idx ~= new_everness_ency_dropdown_idx then + context.everness_ency_primary_selected_idx = 1 + end + + sfinv.set_player_inventory_formspec(player) + end + end + }) +end + +function Everness.find_content_in_vm_area(minp, maxp, contentIds, data, area) + local indexes = {} + local id_count = {} + + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + + if table.indexof(contentIds, data[ai]) ~= -1 then + id_count[data[ai]] = (id_count[data[ai]] or 0) + 1 + table.insert(indexes, ai) + end + end + end + end + + return indexes, id_count +end + +function Everness.find_content_under_air_in_vm_area(minp, maxp, contentIds, data, area) + local indexes = {} + local id_count = {} + + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + + if table.indexof(contentIds, data[ai]) ~= -1 + and data[ai + area.ystride] == core.CONTENT_AIR + then + id_count[data[ai]] = (id_count[data[ai]] or 0) + 1 + table.insert(indexes, ai) + end + end + end + end + + return indexes, id_count +end + + +function Everness.add_to_queue_on_generated(self, def) + if type(def) ~= 'table' then + core.log('warning', '[add_to_queue_on_generated] Callback definition is not a table, not adding to queue! It was type of ' .. type(def)) + return + end + + table.insert(self.on_generated_queue, def) +end + +---Merge two tables with key/value pair +---@param t1 table +---@param t2 table +---@return table +function Everness.mergeTables(t1, t2) + for k, v in pairs(t2) do t1[k] = v end + return t1 +end + +-- +-- Columnar Crystal Cluster Generator +-- + +local math_sqrt = math.sqrt +local math_random = math.random + +-- Content ID cache per color +local crystal_cid_cache = {} +local function get_crystal_cids(color_name) + local col = color_name or 'orange' + if not crystal_cid_cache[col] then + crystal_cid_cache[col] = { + c_block = core.get_content_id('everness:crystal_block_' .. col), + c_shard = core.get_content_id('everness:crystal_' .. col), + } + end + return crystal_cid_cache[col] +end + +---Generate Columnar Crystal Cluster / Multi-Spire Geometry +---Creates distinct crystal columns rising upwards with spaces/air between them. +---Tallest spire is strictly at the center with cascading satellite pillars. +---@param stage_idx number +---@param rand any +---@return table blocks, table shards +local function generate_crystal_cluster_geometry(stage_idx, rand) + local stage = stage_idx or 1 + local blocks = {} + local block_map = {} + + local function add_block(bx, by, bz) + local key = bx .. ',' .. by .. ',' .. bz + if not block_map[key] then + block_map[key] = true + blocks[#blocks + 1] = { x = bx, y = by, z = bz } + end + end + + local columns = {} + + if stage == 1 then + -- Central column (Height 4) + columns[#columns + 1] = { x = 0, z = 0, h = 4 } + -- Surrounding discrete satellite columns (separated by 2 blocks of air) + local offsets = { { 2, 0 }, { -2, 0 }, { 0, 2 }, { 0, -2 } } + for _, off in ipairs(offsets) do + local h = rand and rand:next(2, 3) or math_random(2, 3) + columns[#columns + 1] = { x = off[1], z = off[2], h = h } + end + -- Floor base plate (only y=0) + for x = -2, 2 do + for z = -2, 2 do + if math_sqrt(x * x + z * z) <= 2.2 then + local roll = rand and rand:next(1, 100) or math_random(1, 100) + if roll <= 55 then + add_block(x, 0, z) + end + end + end + end + + elseif stage == 2 then + -- Central spire (Height 6, 2x2 core) + columns[#columns + 1] = { x = 0, z = 0, h = 6 } + columns[#columns + 1] = { x = 1, z = 0, h = 5 } + columns[#columns + 1] = { x = 0, z = 1, h = 5 } + -- Ring 1 satellites (radius ~2.5, Height 3-4 with air gaps) + local ring1 = { + { 2, 2 }, { -2, 2 }, { 2, -2 }, { -2, -2 }, + { 3, 0 }, { -3, 0 }, { 0, 3 }, { 0, -3 } + } + for _, off in ipairs(ring1) do + local roll = rand and rand:next(1, 100) or math_random(1, 100) + if roll <= 85 then + local h = rand and rand:next(3, 4) or math_random(3, 4) + columns[#columns + 1] = { x = off[1], z = off[2], h = h } + end + end + -- Floor base plate (only y=0) + for x = -3, 3 do + for z = -3, 3 do + if math_sqrt(x * x + z * z) <= 3.3 then + local roll = rand and rand:next(1, 100) or math_random(1, 100) + if roll <= 45 then + add_block(x, 0, z) + end + end + end + end + + else + -- Stage 3: Grand Multi-Spire Forest (Height up to 8-9) + columns[#columns + 1] = { x = 0, z = 0, h = 8 } + columns[#columns + 1] = { x = 1, z = 0, h = 7 } + columns[#columns + 1] = { x = 0, z = 1, h = 7 } + columns[#columns + 1] = { x = -1, z = 0, h = 7 } + columns[#columns + 1] = { x = 0, z = -1, h = 7 } + + -- Ring 1 satellites (radius ~2.5, Height 4-6) + local ring1 = { + { 2, 1 }, { -2, 1 }, { 1, 2 }, { -1, 2 }, + { 2, -1 }, { -2, -1 }, { 1, -2 }, { -1, -2 } + } + for _, off in ipairs(ring1) do + local roll = rand and rand:next(1, 100) or math_random(1, 100) + if roll <= 80 then + local h = rand and rand:next(4, 6) or math_random(4, 6) + columns[#columns + 1] = { x = off[1], z = off[2], h = h } + end + end + + -- Ring 2 satellites (radius ~4, Height 2-4) + local ring2 = { + { 4, 0 }, { -4, 0 }, { 0, 4 }, { 0, -4 }, + { 3, 3 }, { -3, 3 }, { 3, -3 }, { -3, -3 } + } + for _, off in ipairs(ring2) do + local roll = rand and rand:next(1, 100) or math_random(1, 100) + if roll <= 75 then + local h = rand and rand:next(2, 4) or math_random(2, 4) + columns[#columns + 1] = { x = off[1], z = off[2], h = h } + end + end + + -- Floor base plate (only y=0) + for x = -4, 4 do + for z = -4, 4 do + if math_sqrt(x * x + z * z) <= 4.2 then + local roll = rand and rand:next(1, 100) or math_random(1, 100) + if roll <= 40 then + add_block(x, 0, z) + end + end + end + end + end + + -- Build vertical crystal columns + for _, col in ipairs(columns) do + for y = 0, col.h do + add_block(col.x, y, col.z) + end + end + + -- Candidate faces to attach crystal shards + -- { dx, dy, dz, param2 } + local candidate_faces = { + { 0, 1, 0, 1 }, -- Top face -> shard stands on floor (+Y, param2=1) + { 1, 0, 0, 3 }, -- +X face -> shard attached to -X wall (param2=3) + { -1, 0, 0, 2 }, -- -X face -> shard attached to +X wall (param2=2) + { 0, 0, 1, 5 }, -- +Z face -> shard attached to -Z wall (param2=5) + { 0, 0, -1, 4 }, -- -Z face -> shard attached to +Z wall (param2=4) + } + + local shards = {} + local shard_map = {} + + for _, b in ipairs(blocks) do + for _, f in ipairs(candidate_faces) do + local sx = b.x + f[1] + local sy = b.y + f[2] + local sz = b.z + f[3] + local skey = sx .. ',' .. sy .. ',' .. sz + + if not block_map[skey] and not shard_map[skey] then + local spawn_chance = (f[2] == 1) and 85 or 35 + local roll = rand and rand:next(1, 100) or math_random(1, 100) + if roll <= spawn_chance then + shard_map[skey] = true + shards[#shards + 1] = { + x = sx, + y = sy, + z = sz, + param2 = f[4], + parent_x = b.x, + parent_y = b.y, + parent_z = b.z, + } + end + end + end + end + + return blocks, shards +end + +-- Replaceable / passable foliage content ID cache +local replaceable_cid_cache = nil +local function get_replaceable_cids() + if not replaceable_cid_cache then + replaceable_cid_cache = { + [core.get_content_id('air')] = true, + } + local function add_replaceable(name) + local id = core.get_content_id(name) + if id and id ~= core.CONTENT_IGNORE and id ~= core.CONTENT_AIR then + replaceable_cid_cache[id] = true + end + end + add_replaceable('everness:twisted_crystal_grass') + add_replaceable('everness:twisted_crystal_spire') + add_replaceable('everness:crystal_cyan') + add_replaceable('everness:crystal_purple') + add_replaceable('everness:crystal_orange') + end + return replaceable_cid_cache +end + +---VoxelManip Crystal Cluster Placer +---@param vm any +---@param area any +---@param data table +---@param p2data table +---@param pos table +---@param color_name string +---@param stage_idx number +---@param rand any +function Everness.spawn_crystal_cluster_vmanip(vm, area, data, p2data, pos, color_name, stage_idx, rand) + local stage = stage_idx or 1 + local cids = get_crystal_cids(color_name) + local replaceable = get_replaceable_cids() + local blocks, shards = generate_crystal_cluster_geometry(stage, rand) + + local c_block = cids.c_block + local c_shard = cids.c_shard + + -- Pass 1: Place solid crystal blocks (force placed over air, grass, and crystal foliage) + for _, b in ipairs(blocks) do + local vx = pos.x + b.x + local vy = pos.y + b.y + local vz = pos.z + b.z + + if area:containsp(vector.new(vx, vy, vz)) then + local vi = area:index(vx, vy, vz) + local cur_id = data[vi] + if replaceable[cur_id] or cur_id == c_shard then + data[vi] = c_block + p2data[vi] = 0 + end + end + end + + -- Pass 2: Place attached crystal shards with guaranteed parent block validation + for _, s in ipairs(shards) do + local vx = pos.x + s.x + local vy = pos.y + s.y + local vz = pos.z + s.z + + local px = pos.x + s.parent_x + local py = pos.y + s.parent_y + local pz = pos.z + s.parent_z + + if area:containsp(vector.new(vx, vy, vz)) and area:containsp(vector.new(px, py, pz)) then + local vi = area:index(vx, vy, vz) + local pvi = area:index(px, py, pz) + + -- Strictly verify parent is a solid crystal block and target is air or replaceable grass + if replaceable[data[vi]] and data[pvi] == c_block then + data[vi] = c_shard + p2data[vi] = s.param2 + end + end + end +end + +---World / Node Crystal Cluster Placer (Live World fallback) +---@param pos table +---@param color_name string +---@param stage_idx number +function Everness.spawn_crystal_cluster(pos, color_name, stage_idx) + local stage = stage_idx or 1 + local col = color_name or 'orange' + local blocks, shards = generate_crystal_cluster_geometry(stage, nil) + + local block_name = 'everness:crystal_block_' .. col + local shard_name = 'everness:crystal_' .. col + + local function is_replaceable(name) + return name == 'air' + or name == 'everness:twisted_crystal_grass' + or name == 'everness:twisted_crystal_spire' + or name:find('crystal_') ~= nil + end + + -- Pass 1: Place solid blocks + for _, b in ipairs(blocks) do + local npos = { x = pos.x + b.x, y = pos.y + b.y, z = pos.z + b.z } + local cur = core.get_node(npos) + if cur and is_replaceable(cur.name) then + core.set_node(npos, { name = block_name, param2 = 0 }) + end + end + + -- Pass 2: Place attached shards + for _, s in ipairs(shards) do + local npos = { x = pos.x + s.x, y = pos.y + s.y, z = pos.z + s.z } + local parent_pos = { x = pos.x + s.parent_x, y = pos.y + s.parent_y, z = pos.z + s.parent_z } + local cur = core.get_node(npos) + local parent = core.get_node(parent_pos) + if cur and is_replaceable(cur.name) and parent and parent.name == block_name then + core.set_node(npos, { name = shard_name, param2 = s.param2 }) + end + end +end + diff --git a/mods/everness/bamboo.lua b/mods/everness/bamboo.lua new file mode 100644 index 0000000..0e59d04 --- /dev/null +++ b/mods/everness/bamboo.lua @@ -0,0 +1,182 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- how often node timers for plants will tick, +/- some random value +function Everness.tick_bamboo(self, pos) + core.get_node_timer(pos):start(math.random(83, 143)) +end + +-- how often a growth failure tick is retried (e.g. too dark) +function Everness.tick_bamboo_again(self, pos) + core.get_node_timer(pos):start(math.random(40, 80)) +end + +--- Rotate placed bamboo based on the stem below/above +function Everness.place_bamboo(self, pos, placer, itemstack, pointed_thing) + local node_under = core.get_node(vector.new(pos.x, pos.y - 1, pos.z)) + local node_above = core.get_node(vector.new(pos.x, pos.y + 1, pos.z)) + + if core.get_item_group(node_under.name, 'bamboo') > 0 then + core.swap_node(pos, { name = itemstack:get_name(), param2 = node_under.param2 }) + return + elseif core.get_item_group(node_above.name, 'bamboo') > 0 then + core.swap_node(pos, { name = itemstack:get_name(), param2 = node_above.param2 }) + return + end + + local rand_color = math.random(0, 7) * 32 + local rand_param2 = rand_color + math.random(0, 3) + core.swap_node(pos, { name = itemstack:get_name(), param2 = rand_param2 }) +end + +--- Dig bamboo all the way up and simulate digging particles +function Everness.dig_up_bamboo(self, pos, oldnode, oldmetadata, digger) + if digger == nil then + return + end + + local pos_above = { x = pos.x, y = pos.y + 1, z = pos.z } + local pos_below = { x = pos.x, y = pos.y - 1, z = pos.z } + local node_above = core.get_node(pos_above) + local node_below = core.get_node(pos_below) + + if core.get_item_group(node_below.name, 'bamboo') > 0 then + self:tick_bamboo(pos_below) + end + + if core.get_item_group(node_above.name, 'bamboo') > 0 then + core.node_dig(pos_above, node_above, digger) + + core.add_particlespawner({ + amount = 10, + time = 0.5, + minpos = { x = pos_above.x - 0.7, y = pos_above.y, z = pos_above.z - 0.7 }, + maxpos = { x = pos_above.x + 0.7, y = pos_above.y + 0.75, z = pos_above.z + 0.7 }, + minvel = { x = -0.5, y = -4, z = -0.5 }, + maxvel = { x = 0.5, y = -2, z = 0.5 }, + minacc = { x = -0.5, y = -4, z = -0.5 }, + maxacc = { x = 0.5, y = -2, z = 0.5 }, + minexptime = 0.5, + maxexptime = 1, + minsize = 0.5, + maxsize = 1, + collisiondetection = true, + node = { name = node_above.name } + }) + end +end + +function Everness.grow_bamboo(self, pos, elapsed) + + local _pos = vector.new(pos) + _pos.y = _pos.y - 1 + + -- local name = core.get_node(_pos).name + local node_below = core.get_node(_pos) + local _node = core.get_node(pos) + + if core.get_item_group(node_below.name, 'soil') == 0 + and core.get_item_group(node_below.name, 'sand') == 0 + and core.get_item_group(node_below.name, 'everness_sand') == 0 + then + + if core.get_item_group(node_below.name, 'bamboo') > 0 then + self:grow_bamboo(_pos, elapsed) + return + end + + self:tick_bamboo_again(pos) + return + end + + _pos.y = _pos.y + 1 + + local height = 0 + + + while core.get_item_group(_node.name, 'bamboo') > 0 and height < 16 do + height = height + 1 + _pos.y = _pos.y + 1 + _node = core.get_node(_pos) + end + + -- stop growing - random height between 12 - 16 nodes + if height > 11 and height < 16 then + if math.random(1, 3) == 2 then + return + end + end + + if height >= 16 then + return + end + + if _node.name ~= 'air' then + self:tick_bamboo_again(_pos) + return + end + + + if core.get_node_light(_pos) < 9 then + self:tick_bamboo_again(pos) + return + end + + local height_offset = height + + -- variant appearance for this growth stages + local rand_color = math.random(0, 7) * 32 + local rand_param2 = rand_color + math.random(0, 3) + + if height < 5 then + local next_plant_schem = self.bamboo.growth_stages[height] + + for i, v in ipairs(next_plant_schem) do + local pos_to_swap = vector.new(_pos.x, _pos.y - height_offset, _pos.z) + local node_to_swap = core.get_node(pos_to_swap) + height_offset = height_offset - 1 + + if i == 1 then + if core.get_item_group(node_to_swap.name, 'seed') == 0 and node_to_swap.name ~= 'air' then + rand_param2 = node_to_swap.param2 + end + end + + core.set_node(pos_to_swap, { name = v.name, param2 = rand_param2 }) + + if i == #next_plant_schem then + self:tick_bamboo(_pos) + return + end + end + end + + -- grow verically while keeping the top 3 nodes with leaves + local start_pos = vector.new(_pos.x, _pos.y - 3, _pos.z) + local prev_node = core.get_node(vector.new(start_pos.x, start_pos.y - 1, start_pos.z)) + + core.set_node(start_pos, { name = 'everness:bamboo_3', param2 = prev_node.param2 }) + + for k, v in ipairs(self.bamboo.top_leaves_schem) do + core.set_node( + vector.new(start_pos.x, start_pos.y + k, start_pos.z), + { name = v.name, param2 = prev_node.param2 } + ) + end + + self:tick_bamboo(_pos) + return false +end diff --git a/mods/everness/buckets.lua b/mods/everness/buckets.lua new file mode 100644 index 0000000..bb8e414 --- /dev/null +++ b/mods/everness/buckets.lua @@ -0,0 +1,238 @@ +--[[ + Authors of original source code + ---------------------- + Kahrl (LGPLv2.1+) + celeron55, Perttu Ahola (LGPLv2.1+) + Various Luanti developers and contributors (LGPLv2.1+) + Everness. Never ending discovery in Everness mapgen. + + Modified by: + + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. +--]] + +-- Load support for MT game translation. +local S = core.get_translator(core.get_current_modname()) + +core.register_craft({ + output = 'everness:bucket_empty 1', + recipe = { + { 'everness:pyrite_ingot', '', 'everness:pyrite_ingot' }, + { '', 'everness:pyrite_ingot', '' }, + } +}) + +local bucket = { + liquids = {} +} + +local function check_protection(pos, name, text) + if core.is_protected(pos, name) then + core.log('action', (name ~= '' and name or 'A mod') + .. ' tried to ' .. text + .. ' at protected position ' + .. core.pos_to_string(pos) + .. ' with a bucket') + core.record_protection_violation(pos, name) + return true + end + return false +end + +-- Register a new liquid +-- source = name of the source node +-- flowing = name of the flowing node +-- itemname = name of the new bucket item (or nil if liquid is not takeable) +-- inventory_image = texture of the new bucket item (ignored if itemname == nil) +-- name = text description of the bucket item +-- groups = (optional) groups of the bucket item, for example {water_bucket = 1} +-- force_renew = (optional) bool. Force the liquid source to renew if it has a +-- source neighbour, even if defined as 'liquid_renewable = false'. +-- Needed to avoid creating holes in sloping rivers. +-- This function can be called from any mod (that depends on bucket). +function bucket.register_liquid(source, flowing, itemname, inventory_image, name, + groups, force_renew) + bucket.liquids[source] = { + source = source, + flowing = flowing, + itemname = itemname, + force_renew = force_renew, + } + bucket.liquids[flowing] = bucket.liquids[source] + + if itemname ~= nil then + Everness:register_craftitem(itemname, { + description = name, + inventory_image = inventory_image, + stack_max = 1, + liquids_pointable = true, + groups = groups, + wield_scale = { x = 2, y = 2, z = 1 }, + + on_place = function(itemstack, user, pointed_thing) + -- Must be pointing to node + if pointed_thing.type ~= 'node' then + return + end + + local node = core.get_node_or_nil(pointed_thing.under) + local ndef = node and core.registered_nodes[node.name] + + -- Call on_rightclick if the pointed node defines it + if ndef and ndef.on_rightclick and + not (user and user:is_player() and + user:get_player_control().sneak) then + return ndef.on_rightclick( + pointed_thing.under, + node, user, + itemstack) + end + + local lpos + + -- Check if pointing to a buildable node + if ndef and ndef.buildable_to then + -- buildable; replace the node + lpos = pointed_thing.under + else + -- not buildable to; place the liquid above + -- check if the node above can be replaced + + lpos = pointed_thing.above + node = core.get_node_or_nil(lpos) + local above_ndef = node and core.registered_nodes[node.name] + + if not above_ndef or not above_ndef.buildable_to then + -- do not remove the bucket with the liquid + return itemstack + end + end + + if check_protection(lpos, user + and user:get_player_name() + or '', 'place '..source) then + return + end + + core.set_node(lpos, {name = source}) + return ItemStack('everness:bucket_empty') + end + }) + end +end + +Everness:register_craftitem('everness:bucket_empty', { + description = S('Empty Bucket'), + inventory_image = 'everness_bucket_empty.png', + groups = { tool = 1 }, + liquids_pointable = true, + wield_scale = { x = 2, y = 2, z = 1 }, + + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type == 'object' then + pointed_thing.ref:punch(user, 1.0, { full_punch_interval=1.0 }, nil) + return user:get_wielded_item() + elseif pointed_thing.type ~= 'node' then + -- do nothing if it's neither object nor node + return + end + -- Check if pointing to a liquid source + local node = core.get_node(pointed_thing.under) + local liquiddef = bucket.liquids[node.name] + local item_count = user:get_wielded_item():get_count() + + if liquiddef ~= nil + and liquiddef.itemname ~= nil + and node.name == liquiddef.source + then + if check_protection(pointed_thing.under, + user:get_player_name(), + 'take '.. node.name) then + return + end + + -- default set to return filled bucket + local giving_back = liquiddef.itemname + + -- check if holding more than 1 empty bucket + if item_count > 1 then + -- if space in inventory add filled bucked, otherwise drop as item + local inv = user:get_inventory() + + if inv:room_for_item('main', { name = liquiddef.itemname }) then + inv:add_item('main', liquiddef.itemname) + else + local pos = user:get_pos() + pos.y = math.floor(pos.y + 0.5) + core.add_item(pos, liquiddef.itemname) + end + + -- set to return empty buckets minus 1 + giving_back = 'everness:bucket_empty '.. tostring(item_count - 1) + end + + -- force_renew requires a source neighbour + local source_neighbor = false + + if liquiddef.force_renew then + source_neighbor = core.find_node_near(pointed_thing.under, 1, liquiddef.source) + end + + if not (source_neighbor and liquiddef.force_renew) then + core.add_node(pointed_thing.under, { name = 'air' }) + end + + return ItemStack(giving_back) + else + -- non-liquid nodes will have their on_punch triggered + local node_def = core.registered_nodes[node.name] + + if node_def then + node_def.on_punch(pointed_thing.under, node, user, pointed_thing) + end + + return user:get_wielded_item() + end + end, +}) + +-- Mineral water source is 'liquid_renewable = false' to avoid horizontal spread +-- of water sources in sloping rivers that can cause water to overflow +-- riverbanks and cause floods. +-- River water source is instead made renewable by the 'force renew' option +-- used here. + +bucket.register_liquid( + 'everness:mineral_water_source', + 'everness:mineral_water_flowing', + 'everness:bucket_mineral_water', + 'everness_bucket_mineral_water.png', + S('Mineral') .. ' ' .. S('Water') .. ' ' .. S('Bucket'), + { tool = 1, water_bucket = 1 } +) + +bucket.register_liquid( + 'everness:lava_source', + 'everness:lava_flowing', + 'everness:bucket_lava', + 'everness_bucket_lava.png', + S('Lava Bucket'), + { tool = 1 } +) + +core.register_craft({ + type = 'fuel', + recipe = 'everness:bucket_lava', + burntime = 370, + replacements = {{ 'everness:bucket_lava', 'everness:bucket_empty' }}, +}) diff --git a/mods/everness/chat_commands.lua b/mods/everness/chat_commands.lua new file mode 100644 index 0000000..d16838d --- /dev/null +++ b/mods/everness/chat_commands.lua @@ -0,0 +1,25 @@ +local S = core.get_translator(core.get_current_modname()) + +core.register_chatcommand('everness:getbiomename', { + description = S('Get biome name where you are standing.'), + params = '', + privs = { creative = true }, + func = function(name, param) + local player = core.get_player_by_name(name) + + if not player then + return false, S('This command can only be executed in-game!') + end + + local p_pos = player:get_pos() + local biome_data = core.get_biome_data(p_pos) + + if not biome_data then + return false + end + + local biome_name = core.get_biome_name(biome_data.biome) + + core.chat_send_player(name, 'Biome name: ' .. biome_name) + end, +}) diff --git a/mods/everness/chests.lua b/mods/everness/chests.lua new file mode 100644 index 0000000..ce305ef --- /dev/null +++ b/mods/everness/chests.lua @@ -0,0 +1,435 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + GNU Lesser General Public License, version 2.1 + Copyright (C) 2011-2018 celeron55, Perttu Ahola + Copyright (C) 2011-2018 Various Luanti developers and contributors + Copyright (C) 2022 SaKeL + + This program is free software; you can redistribute it and/or modify it under the terms + of the GNU Lesser General Public License as published by the Free Software Foundation; + either version 2.1 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details: + https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html +--]] + +Everness.chest = {} + +-- support for MT game translation. +local S = core.get_translator(core.get_current_modname()) + +function Everness.chest.get_chest_formspec(pos) + local spos = pos.x .. ',' .. pos.y .. ',' .. pos.z + local hotbar_bg = '' + local list_bg = '' + local chest_bg = '' + + for i = 0, 7, 1 do + hotbar_bg = hotbar_bg .. 'image[' .. 0 + i .. ', ' .. 4.85 .. ';1,1;everness_chest_ui_bg_hb_slot.png]' + end + + for row = 0, 2, 1 do + for i = 0, 7, 1 do + list_bg = list_bg .. 'image[' .. 0 + i .. ',' .. 6.08 + row .. ';1,1;everness_chest_ui_bg_slot.png]' + end + end + + for row = 0, 3, 1 do + for i = 0, 7, 1 do + chest_bg = chest_bg .. 'image[' .. 0 + i .. ',' .. 0.3 + row .. ';1,1;everness_chest_ui_bg_slot.png]' + end + end + + local formspec = + 'size[8,9]' .. + 'listcolors[#FFFFFF00;#FFFFFF1A;#5E5957]' .. + 'background[5,5;1,1;everness_chest_ui_bg.png;true]' .. + 'list[nodemeta:' .. spos .. ';main;0,0.3;8,4;]' .. + 'list[current_player;main;0,4.85;8,1;]' .. + 'list[current_player;main;0,6.08;8,3;8]' .. + 'listring[nodemeta:' .. spos .. ';main]' .. + 'listring[current_player;main]' .. + list_bg .. + hotbar_bg .. + chest_bg + return formspec +end + +function Everness.chest.chest_lid_obstructed(pos) + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + local def = core.registered_nodes[core.get_node(above).name] + + -- allow ladders, signs, wallmounted things and torches to not obstruct + if def and + (def.drawtype == 'airlike' or + def.drawtype == 'signlike' or + def.drawtype == 'torchlike' or + (def.drawtype == 'nodebox' and def.paramtype2 == 'wallmounted')) + then + return false + end + + return true +end + +function Everness.chest.chest_lid_close(pn) + local chest_open_info = Everness.chest.open_chests[pn] + local pos = chest_open_info.pos + local sound = chest_open_info.sound + local swap = chest_open_info.swap + + Everness.chest.open_chests[pn] = nil + + for _, v in pairs(Everness.chest.open_chests) do + if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then + return true + end + end + + local node = core.get_node(pos) + + core.after(0.2, core.swap_node, pos, { name = swap, param2 = node.param2 }) + core.sound_play(sound, { gain = 0.3, pos = pos, max_hear_distance = 10 }, true) +end + +Everness.chest.open_chests = {} + +core.register_on_player_receive_fields(function(player, formname, fields) + local pn = player:get_player_name() + + if formname ~= 'everness:chest' then + if Everness.chest.open_chests[pn] then + Everness.chest.chest_lid_close(pn) + end + + return + end + + if not (fields.quit and Everness.chest.open_chests[pn]) then + return + end + + Everness.chest.chest_lid_close(pn) + + return true +end) + +core.register_on_leaveplayer(function(player) + local pn = player:get_player_name() + + if Everness.chest.open_chests[pn] then + Everness.chest.chest_lid_close(pn) + end +end) + +function Everness.chest.register_chest(prefixed_name, d) + local name = prefixed_name:sub(1, 1) == ':' and prefixed_name:sub(2, -1) or prefixed_name + local def = table.copy(d) + def.drawtype = 'mesh' + def.visual = 'mesh' + def.paramtype = 'light' + def.paramtype2 = 'facedir' + def.legacy_facedir_simple = true + def.is_ground_content = false + def.use_texture_alpha = 'clip' + def.backface_culling = false + + if def.protected then + -- Locked chest + def.on_construct = function(pos) + local meta = core.get_meta(pos) + meta:set_string('infotext', S('Locked Chest')) + meta:set_string('owner', '') + local inv = meta:get_inventory() + inv:set_size('main', 8 * 4) + end + + def.after_place_node = function(pos, placer) + local meta = core.get_meta(pos) + meta:set_string('owner', placer:get_player_name() or '') + meta:set_string('infotext', S('Locked Chest (owned by @1)', meta:get_string('owner'))) + end + + def.can_dig = function(pos,player) + local meta = core.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty('main') and Everness.can_interact_with_node(player, pos) + end + + def.allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if not Everness.can_interact_with_node(player, pos) then + return 0 + end + + return count + end + + def.allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not Everness.can_interact_with_node(player, pos) then + return 0 + end + + return stack:get_count() + end + + def.allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not Everness.can_interact_with_node(player, pos) then + return 0 + end + + return stack:get_count() + end + + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not Everness.can_interact_with_node(clicker, pos) then + return itemstack + end + + local cn = clicker:get_player_name() + + if Everness.chest.open_chests[cn] then + Everness.chest.chest_lid_close(cn) + end + + core.sound_play(def.sound_open, { gain = 0.3, pos = pos, max_hear_distance = 10 }, true) + + if not Everness.chest.chest_lid_obstructed(pos) then + core.swap_node(pos, { name = name .. '_open', param2 = node.param2 }) + end + + core.after( + 0.2, + core.show_formspec, + cn, + 'everness:chest', + Everness.chest.get_chest_formspec(pos) + ) + Everness.chest.open_chests[cn] = { pos = pos, sound = def.sound_close, swap = name } + end + + def.on_blast = function() end + + def.on_key_use = function(pos, player) + local secret = core.get_meta(pos):get_string('key_lock_secret') + local itemstack = player:get_wielded_item() + local key_meta = itemstack:get_meta() + + if itemstack:get_metadata() == '' then + return + end + + if key_meta:get_string('secret') == '' then + key_meta:set_string('secret', core.parse_json(itemstack:get_metadata()).secret) + itemstack:set_metadata('') + end + + if secret ~= key_meta:get_string('secret') then + return + end + + core.show_formspec( + player:get_player_name(), + 'everness:chest_locked', + Everness.chest.get_chest_formspec(pos) + ) + end + + def.on_skeleton_key_use = function(pos, player, newsecret) + local meta = core.get_meta(pos) + local owner = meta:get_string('owner') + local pn = player:get_player_name() + + -- verify placer is owner of lockable chest + if owner ~= pn then + core.record_protection_violation(pos, pn) + core.chat_send_player(pn, S('You do not own this chest.')) + return nil + end + + local secret = meta:get_string('key_lock_secret') + if secret == '' then + secret = newsecret + meta:set_string('key_lock_secret', secret) + end + + return secret, S('a locked chest'), owner + end + else + -- Public (unlocked) chest + def.on_construct = function(pos) + local meta = core.get_meta(pos) + meta:set_string('infotext', S('Chest')) + local inv = meta:get_inventory() + inv:set_size('main', 8 * 4) + end + + def.can_dig = function(pos,player) + local meta = core.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty('main') + end + + def.on_rightclick = function(pos, node, clicker) + core.sound_play(def.sound_open, { gain = 0.3, pos = pos, max_hear_distance = 10 }, true) + + if not Everness.chest.chest_lid_obstructed(pos) then + core.swap_node(pos, { name = name .. '_open', param2 = node.param2 }) + end + + core.after(0.2, core.show_formspec, clicker:get_player_name(), 'everness:chest', Everness.chest.get_chest_formspec(pos)) + Everness.chest.open_chests[clicker:get_player_name()] = { pos = pos, sound = def.sound_close, swap = name } + end + + def.on_blast = function(pos) + local drops = {} + Everness.get_inventory_drops(pos, 'main', drops) + drops[#drops + 1] = name + core.remove_node(pos) + return drops + end + end + + Everness.set_inventory_action_loggers(def, 'chest') + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + if def.protected then + def_opened.mesh = 'everness_chest_protected_opened.obj' + def_opened.tiles = { + 'everness_chest_front.png', + 'everness_chest_top.png', + 'everness_chest_side.png', + 'everness_chest_front.png' + } + + def_closed.mesh = 'everness_chest_protected_closed.obj' + def_closed.tiles = { + 'everness_chest_front.png', + 'everness_chest_top.png', + 'everness_chest_side.png', + 'everness_chest_front.png' + } + else + def_opened.mesh = 'everness_chest_opened.obj' + def_opened.tiles = { + 'everness_chest_front.png', + 'everness_chest_top.png', + 'everness_chest_side.png' + } + + def_closed.mesh = 'everness_chest_closed.obj' + def_closed.tiles = { + 'everness_chest_front.png', + 'everness_chest_top.png', + 'everness_chest_side.png' + } + end + + def_opened.drop = name + def_opened.groups.not_in_creative_inventory = 1 + def_opened.selection_box = { + type = 'fixed', + fixed = { -1 / 2, -1 / 2, -1 / 2, 1 / 2, 3 / 16, 1 / 2 }, + } + def_opened.can_dig = function() + return false + end + def_opened.on_blast = function() end + + Everness:register_node(prefixed_name, def_closed) + Everness:register_node(prefixed_name .. '_open', def_opened) + + -- close opened chests on load + Everness:register_lbm({ + label = 'Everness close opened chests on load', + name = 'everness:close_' .. prefixed_name:gsub(':', '_') .. '_open', + nodenames = { prefixed_name .. '_open' }, + run_at_every_load = true, + action = function(pos, node) + node.name = prefixed_name + core.swap_node(pos, node) + end + }) +end + +Everness.chest.register_chest('everness:chest', { + description = S('Chest'), + sounds = Everness.node_sound_wood_defaults(), + sound_open = 'everness_chest_open', + sound_close = 'everness_chest_close', + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + -- MCL + handy = 1, + axey = 1, + container = 2, + deco_block = 1, + material_wood = 1, + flammable = -1, + }, + _mcl_blast_resistance = 2.5, + _mcl_hardness = 2.5, +}) + +Everness.chest.register_chest('everness:chest_locked', { + description = S('Locked Chest'), + sounds = Everness.node_sound_wood_defaults(), + sound_open = 'everness_chest_open', + sound_close = 'everness_chest_close', + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + -- MCL + handy = 1, + axey = 1, + container = 2, + deco_block = 1, + material_wood = 1, + flammable = -1, + }, + _mcl_blast_resistance = 2.5, + _mcl_hardness = 2.5, + protected = true +}) + +core.register_craft({ + output = 'everness:chest', + recipe = { + { 'group:everness_wood', 'group:everness_wood', 'group:everness_wood' }, + { 'group:everness_wood', '', 'group:everness_wood' }, + { 'group:everness_wood', 'group:everness_wood', 'group:everness_wood' }, + } +}) + +minetest.register_craft({ + output = 'everness:chest_locked', + recipe = { + { 'group:everness_wood', 'group:everness_wood', 'group:everness_wood' }, + { 'group:everness_wood', 'everness:pyrite_ingot', 'group:everness_wood' }, + { 'group:everness_wood', 'group:everness_wood', 'group:everness_wood' }, + } +}) + +minetest.register_craft( { + type = 'shapeless', + output = 'everness:chest_locked', + recipe = { 'everness:chest', 'everness:pyrite_ingot' }, +}) + +core.register_craft({ + type = 'fuel', + recipe = 'everness:chest', + burntime = 30, +}) + +core.register_craft({ + type = 'fuel', + recipe = 'everness:chest_locked', + burntime = 30, +}) diff --git a/mods/everness/crafting.lua b/mods/everness/crafting.lua new file mode 100644 index 0000000..074c19c --- /dev/null +++ b/mods/everness/crafting.lua @@ -0,0 +1,614 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. +--]] + +--- Single shapeless craft +---@param input_name string +---@param output_name string +local function register_craft_single(input_name, output_name) + core.register_craft({ + type = 'shapeless', + output = output_name, + recipe = { input_name } + }) +end + +--- 2x2 same material shaped craft +---@param input_name string +---@param output_name string +local function register_craft_2x2(input_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_name, input_name}, + {input_name, input_name}, + } + }) +end + +--- 3x2 same material shaped craft +---@param input_name string +---@param output_name string +local function register_craft_3x2(input_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_name, input_name, input_name}, + {input_name, input_name, input_name}, + } + }) +end + +--- 3x2 shaped craft, top same material, bottom (different from top) same material +---@param input_top_name string +---@param input_bottom_name string +---@param output_name string +local function register_craft_3x2_composite(input_top_name, input_bottom_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_top_name, input_top_name, input_top_name}, + {input_bottom_name, input_bottom_name, input_bottom_name}, + } + }) +end + +--- 1x2 shaped craft, top same material, bottom (different from top) same material +---@param input_top_name string +---@param input_bottom_name string +---@param output_name string +local function register_craft_1x2_composite(input_top_name, input_bottom_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_top_name}, + {input_bottom_name}, + } + }) +end + +--- 1x3 same material shaped craft +---@param input_name string +---@param output_name string +local function register_craft_1x3(input_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_name}, + {input_name}, + {input_name}, + } + }) +end + +--- 2x1 same material shaped craft +---@param input_name string +---@param output_name string +local function register_craft_2x1(input_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_name, input_name}, + } + }) +end + +--- 2x1 shaped craft, each material different +---@param input_first_name string +---@param input_second_name string +---@param output_name string +local function register_craft_2x1_composite(input_first_name, input_second_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_first_name, input_second_name}, + } + }) +end + +--- 2x3 same material shaped craft +---@param input_name string +---@param output_name string +local function register_craft_2x3(input_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_name, input_name}, + {input_name, input_name}, + {input_name, input_name}, + } + }) +end + +--- 3x1 same material shaped craft +---@param input_name string +---@param output_name string +local function register_craft_3x1(input_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_name, input_name, input_name}, + } + }) +end + +--- 3x3 same material shaped craft +---@param input_name string +---@param output_name string +local function register_craft_3x3(input_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_name, input_name, input_name}, + {input_name, input_name, input_name}, + {input_name, input_name, input_name}, + } + }) +end + +--- 'anvil' pattern, same material shaped craft +---@param input_name string +---@param output_name string +local function register_craft_anvil_pattern(input_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_name, input_name, input_name}, + {'', input_name, ''}, + {input_name, input_name, input_name}, + } + }) +end + +--- 'bullseye' pattern, shaped craft, same material around the center, center different material +---@param input_around_name string +---@param input_center_name string +---@param output_name string +local function register_craft_bullseye_pattern(input_around_name, input_center_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_around_name, input_around_name, input_around_name}, + {input_around_name, input_center_name, input_around_name}, + {input_around_name, input_around_name, input_around_name}, + } + }) +end + +--- 'sandwich' pattern, shaped craft, same material top/bottom rows, center row different material +---@param input_around_name string +---@param input_center_name string +---@param output_name string +local function register_craft_sandwich_pattern(input_around_name, input_center_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_around_name, input_around_name, input_around_name}, + {input_center_name, input_center_name, input_center_name}, + {input_around_name, input_around_name, input_around_name}, + } + }) +end + +--- 'pillar top' pattern, same material shaped craft +---@param input_name string +---@param output_name string +local function register_craft_pillar_top(input_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {input_name, input_name, input_name}, + {'', input_name, ''}, + {'', input_name, ''}, + } + }) +end + +--- 'pillar bottom' pattern, same material shaped craft +---@param input_name string +---@param output_name string +local function register_craft_pillar_bottom(input_name, output_name) + core.register_craft({ + type = 'shaped', + output = output_name, + recipe = { + {'', input_name, ''}, + {'', input_name, ''}, + {input_name, input_name, input_name}, + } + }) +end + +-- +-- Default Blocks +-- +if core.get_modpath('default') then + register_craft_3x3('default:snowblock', 'everness:snowcobble 9') + register_craft_3x3('default:ice', 'everness:icecobble 9') + register_craft_single('everness:chest', 'default:chest') +elseif core.get_modpath('mcl_core') then + register_craft_3x3('mcl_core:snowblock', 'everness:snowcobble 9') + register_craft_3x3('mcl_core:ice', 'everness:icecobble 9') + register_craft_single('everness:chest', 'mcl_chests:chest') +end + +-- +-- Cobbles +-- +register_craft_3x3('everness:frosted_ice', 'everness:icecobble 9') +register_craft_3x3('everness:frosted_snowblock', 'everness:snowcobble 9') + +-- +-- Bamboo +-- +register_craft_2x2('everness:bamboo_item', 'everness:bamboo_wood') +register_craft_3x3('everness:bamboo_item', 'everness:bamboo_block') +register_craft_2x2('everness:bamboo_wood', 'everness:bamboo_mosaic_wood') +register_craft_3x2('everness:bamboo_wood', 'everness:trapdoor_bamboo 2') + +-- +-- Ice +-- +register_craft_single('everness:frosted_ice', 'everness:frosted_ice_translucent') +register_craft_single('everness:frosted_ice_translucent', 'everness:frosted_ice') + +-- +-- Trapdoors +-- +register_craft_3x2('everness:crystal_wood', 'everness:trapdoor_crystal_wood 2') +register_craft_3x2('everness:dry_wood', 'everness:trapdoor_cursed_wood 2') +register_craft_3x2('everness:lava_tree_wood', 'everness:trapdoor_lava_tree 2') +register_craft_3x2('everness:palm_tree_wood', 'everness:trapdoor_palm_wood 2') + +-- +-- Pyrite +-- +register_craft_3x3('everness:pyrite_ingot', 'everness:pyriteblock') + +register_craft_2x2('everness:pyriteblock_forged', 'everness:pyriteblock_brick 4') +register_craft_3x3('everness:pyriteblock_forged', 'everness:pyriteblock_polished 9') +register_craft_2x3('everness:pyriteblock_forged', 'everness:pyrite_roof_tile 6') + +register_craft_1x2_composite('group:glass', 'everness:pyrite_ingot', 'everness:pyrite_glass') + +if core.get_modpath('default') then + register_craft_1x2_composite('default:glass', 'everness:pyrite_ingot', 'everness:pyrite_glass') +elseif core.get_modpath('mcl_core') then + register_craft_1x2_composite('mcl_core:glass', 'everness:pyrite_ingot', 'everness:pyrite_glass') +end + +register_craft_1x2_composite('everness:pyrite_glass', 'everness:pyrite_ingot', 'everness:pyrite_lantern') +register_craft_2x1('everness:pyriteblock_forged', 'everness:pyriteblock_slab_brick 2') + +register_craft_bullseye_pattern('everness:pyriteblock_forged', '', 'everness:pyriteblock_spiral 8') + +register_craft_pillar_bottom('everness:pyriteblock_forged', 'everness:pyrite_pillar_bottom 5') +register_craft_1x3('everness:pyriteblock_forged', 'everness:pyrite_pillar_middle 3') +register_craft_pillar_top('everness:pyriteblock_forged', 'everness:pyrite_pillar_top 5') + +register_craft_anvil_pattern('everness:pyriteblock_forged', 'everness:pyrite_pillar_small 7') + +-- +-- Glass +-- +register_craft_bullseye_pattern('everness:glass', 'everness:bloodspore_plant', 'everness:tinted_glass_red 8') +register_craft_bullseye_pattern('everness:glass', 'everness:bloodspore_plant_small', 'everness:tinted_glass_red 8') + +-- +-- Tree into wood +-- +local recipes_wood = { + {'everness:baobab_tree', 'everness:baobab_wood 4'}, + {'everness:coral_tree', 'everness:coral_wood 4'}, + {'everness:crystal_tree', 'everness:crystal_wood 4'}, + {'everness:dry_tree', 'everness:dry_wood 4'}, + {'everness:lava_tree', 'everness:lava_tree_wood 4'}, + {'everness:lava_tree_with_lava', 'everness:lava_tree_wood 4'}, + {'everness:mese_tree', 'everness:mese_wood 4'}, + {'everness:sequoia_tree', 'everness:sequoia_wood 4'}, + {'everness:willow_tree', 'everness:willow_wood 4'}, + {'everness:palm_tree', 'everness:palm_tree_wood 4'}, +} + +for _, data in ipairs(recipes_wood) do + register_craft_single(data[1], data[2]) +end + +-- +-- Sand into sandstone +-- +local recipes_sandstone = { + {'everness:coral_forest_deep_ocean_sand', 'everness:coral_deep_ocean_sandstone_block 4'}, + {'everness:coral_sand', 'everness:coral_sandstone 4'}, + {'everness:coral_white_sand', 'everness:coral_white_sandstone 4'}, + {'everness:crystal_forest_deep_ocean_sand', 'everness:crystal_forest_deep_ocean_sandstone_block 4'}, + {'everness:crystal_sand', 'everness:crystal_sandstone 4'}, + {'everness:cursed_lands_deep_ocean_sand', 'everness:cursed_lands_deep_ocean_sandstone_block 4'}, + {'everness:cursed_sand', 'everness:cursed_sandstone_block 4'}, + {'everness:mineral_sand', 'everness:mineral_sandstone 4'}, +} + +for _, data in ipairs(recipes_sandstone) do + register_craft_2x2(data[1], data[2]) +end + +-- +-- Stone and bone into brick +-- +local recipes_brick = { + {'everness:coral_bones_block', 'everness:coral_bones_brick 4'}, + {'everness:coral_deep_ocean_sandstone_block', 'everness:coral_deep_ocean_sandstone_brick 4'}, + {'everness:coral_desert_stone', 'everness:coral_desert_stone_brick 4'}, + {'everness:coral_sandstone', 'everness:coral_sandstone_brick 4'}, + {'everness:coral_white_sandstone', 'everness:coral_white_sandstone_brick 4'}, + {'everness:crystal_forest_deep_ocean_sandstone_block', 'everness:crystal_forest_deep_ocean_sandstone_brick 4'}, + {'everness:crystal_sandstone', 'everness:crystal_sandstone_brick 4'}, + {'everness:cursed_lands_deep_ocean_sandstone_block', 'everness:cursed_lands_deep_ocean_sandstone_brick 4'}, + {'everness:cursed_sandstone_block', 'everness:cursed_sandstone_brick 4'}, + {'everness:cursed_stone', 'everness:cursed_brick 4'}, + {'everness:forsaken_desert_stone', 'everness:forsaken_desert_brick_red 4'}, + {'everness:forsaken_tundra_stone', 'everness:forsaken_tundra_brick 4'}, + {'everness:mineral_sandstone', 'everness:mineral_sandstone_brick 4'}, + {'everness:mineral_stone', 'everness:mineral_stone_brick 4'}, +} + +for _, data in ipairs(recipes_brick) do + register_craft_2x2(data[1], data[2]) +end + +-- +-- Base materials into blocks +-- +register_craft_2x2('everness:quartz_crystal', 'everness:quartz_block 4') + +register_craft_3x3('everness:coral_bones', 'everness:coral_bones_block 9') +register_craft_3x3('everness:coral_desert_stone', 'everness:coral_desert_stone_block 9') +register_craft_3x3('everness:crystal_cyan', 'everness:crystal_block_cyan') +register_craft_3x3('everness:crystal_orange', 'everness:crystal_block_orange') +register_craft_3x3('everness:crystal_purple', 'everness:crystal_block_purple') +register_craft_3x3('everness:mineral_sandstone', 'everness:mineral_sandstone_block 9') +register_craft_3x3('everness:mineral_stone', 'everness:mineral_stone_block 9') + +-- +-- Blocks into base materials +-- +register_craft_single('everness:crystal_block_cyan', 'everness:crystal_cyan 9') +register_craft_single('everness:crystal_block_orange', 'everness:crystal_orange 9') +register_craft_single('everness:crystal_block_purple', 'everness:crystal_purple 9') + +-- +-- Carved and chiseled blocks +-- +register_craft_2x2('everness:coral_sandstone_chiseled', 'everness:coral_sandstone_carved_1 9') +register_craft_2x2('everness:quartz_block', 'everness:quartz_chiseled 4') + +register_craft_3x3('everness:coral_sandstone', 'everness:coral_sandstone_chiseled 9') +register_craft_3x3('everness:crystal_sandstone', 'everness:crystal_sandstone_chiseled 9') +register_craft_3x3('everness:cursed_brick', 'everness:cursed_brick_carved 9') + +register_craft_1x2_composite('everness:forsaken_desert_brick_red', 'everness:forsaken_desert_brick', 'everness:forsaken_desert_chiseled_stone') + +-- +-- Masonry items +-- +register_craft_1x3('everness:coral_white_sandstone', 'everness:coral_white_sandstone_pillar 3') +register_craft_1x3('everness:quartz_block', 'everness:quartz_pillar 3') + +register_craft_2x1_composite('everness:cursed_brick', 'group:leaves', 'everness:cursed_brick_with_growth 4') + +core.register_craft({ + output = 'everness:cursed_brick_mixed 4', + recipe = { + { 'everness:cursed_stone', 'everness:cursed_brick' }, + { 'everness:cursed_brick', 'everness:cursed_stone' }, + } +}) + +register_craft_2x1_composite('everness:forsaken_desert_cobble_red', 'everness:forsaken_desert_sand', 'everness:forsaken_desert_cobble') +register_craft_2x1_composite('everness:forsaken_desert_brick_red', 'everness:forsaken_desert_sand', 'everness:forsaken_desert_brick') + +register_craft_2x2('everness:forsaken_desert_brick', 'everness:forsaken_desert_engraved_stone 4') + +-- +-- Misc items +-- +core.register_craft({ + output = 'everness:coral_forest_deep_ocean_lantern 1', + recipe = { + { 'everness:coral_deep_ocean_sandstone_block', 'group:glass', 'everness:coral_deep_ocean_sandstone_block' }, + { 'group:glass', 'group:torch', 'group:glass' }, + { 'everness:coral_deep_ocean_sandstone_block', 'group:glass', 'everness:coral_deep_ocean_sandstone_block' }, + } +}) + +if core.get_modpath('default') then + core.register_craft({ + output = 'everness:coral_forest_deep_ocean_lantern 1', + recipe = { + { 'everness:coral_deep_ocean_sandstone_block', 'default:glass', 'everness:coral_deep_ocean_sandstone_block' }, + { 'default:glass', 'group:torch', 'default:glass' }, + { 'everness:coral_deep_ocean_sandstone_block', 'default:glass', 'everness:coral_deep_ocean_sandstone_block' }, + } + }) +elseif core.get_modpath('mcl_core') then + core.register_craft({ + output = 'everness:coral_forest_deep_ocean_lantern 1', + recipe = { + { 'everness:coral_deep_ocean_sandstone_block', 'mcl_core:glass', 'everness:coral_deep_ocean_sandstone_block' }, + { 'mcl_core:glass', 'group:torch', 'mcl_core:glass' }, + { 'everness:coral_deep_ocean_sandstone_block', 'mcl_core:glass', 'everness:coral_deep_ocean_sandstone_block' }, + } + }) +end + +core.register_craft({ + output = 'everness:shell_of_underwater_breathing', + recipe = { + { '', '', 'group:everness_crystal_forest_deep_ocean_coral' }, + { '', 'group:everness_cursed_lands_deep_ocean_coral', '' }, + { 'group:everness_coral_forest_deep_ocean_coral', '', '' }, + } +}) + +register_craft_3x3('everness:mese_tree_fruit', 'default:mese_crystal_fragment') + +register_craft_3x1('everness:lotus_leaf_3', 'default:paper') + +register_craft_single('everness:mineral_sandstone', 'everness:mineral_sand 4') + +register_craft_3x2_composite('everness:mineral_sandstone', 'everness:mineral_sandstone_brick', 'everness:mineral_sandstone_brick_block 6') + +register_craft_sandwich_pattern('group:flora', 'everness:mineral_stone_brick', 'everness:mineral_stone_brick_with_growth 3') +register_craft_sandwich_pattern('everness:mineral_stone_brick_with_growth', 'group:flower', 'everness:mineral_stone_brick_with_flower_growth 6') + +register_craft_3x2('everness:mineral_sandstone', 'everness:sand_castle_wall 6') + +core.register_craft({ + output = 'everness:ceramic_pot_blank', + recipe = { + { '', 'everness:ceramic_pot_sherd_blank', ''}, + { 'everness:ceramic_pot_sherd_blank', '', 'everness:ceramic_pot_sherd_blank'}, + { '', 'everness:ceramic_pot_sherd_blank', ''}, + } +}) + +register_craft_single('everness:ceramic_pot_blank', 'everness:ceramic_pot_sherd_blank 4') + +-- +-- Tools +-- +local recipes_tool = { + {'everness:hammer', { + { 'group:everness_obsidian', 'group:everness_obsidian', 'group:everness_obsidian' }, + { 'group:everness_obsidian', 'everness:pyriteblock_forged', 'group:everness_obsidian' }, + { '', 'group:stick', '' } + }}, + {'everness:hammer_sharp', { + { 'everness:pyriteblock_forged', 'everness:pyriteblock_forged', 'everness:pyriteblock_forged' }, + { 'everness:pyriteblock_forged', 'everness:hammer', 'everness:pyriteblock_forged' }, + { '', 'everness:hammer', '' } + }}, + {'everness:pick_archeological', { + { 'group:stone', 'group:stone', 'group:stone' }, + { '', 'group:stick', '' }, + { 'group:stick', '', '' } + }}, + {'everness:pick_illuminating', { + { 'everness:crystal_purple', 'everness:coral_tree_bioluminescent', 'everness:crystal_purple' }, + { '', 'everness:sulfur_stone', '' }, + { '', 'group:stick', '' } + }}, + {'everness:shovel_silk', { + { 'everness:ancient_emerald_ice' }, + { 'everness:glowing_pillar' }, + { 'everness:crystal_purple' } + }}, + {'everness:vine_shears', { + { '', 'everness:pyrite_ingot', '' }, + { 'group:stick', 'group:wood', 'everness:pyrite_ingot' }, + { '', '', 'group:stick' } + }}, +} + +for _, data in ipairs(recipes_tool) do + core.register_craft({ + type = 'shaped', + output = data[1], + recipe = data[2] + }) +end + +-- +-- Fuel +-- +local recipes_fuel = { + {'everness:baobab_wood', 8}, + {'everness:bamboo_block', 15}, + {'everness:bamboo_dry_block', 15}, + {'everness:bamboo_item', 3}, + {'everness:bamboo_mosaic_wood', 15}, + {'everness:bamboo_wood', 15}, + {'everness:coral_burdock_1', 3}, + {'everness:coral_burdock_2', 3}, + {'everness:crystal_wood', 15}, + {'everness:door_bamboo', 14}, + {'everness:lava_tree_wood', 30}, + {'everness:lotus_leaf_3', 1}, + {'everness:mese_wood', 15}, + {'everness:sequoia_wood', 6}, + {'everness:sulfur_stone', 370}, + {'everness:trapdoor_bamboo', 7}, + {'everness:trapdoor_crystal_wood', 7}, +} + +for _, data in ipairs(recipes_fuel) do + core.register_craft({ + type = 'fuel', + recipe = data[1], + burntime = data[2], + }) +end + +-- +-- Cooking recipes +-- +local recipes_cooking = { + {'everness:coral_desert_cobble', 'everness:coral_desert_stone'}, + {'everness:coral_desert_mossy_cobble', 'everness:coral_desert_stone'}, + {'everness:crystal_cobble', 'everness:crystal_stone'}, + {'everness:crystal_mossy_cobble', 'everness:crystal_stone'}, + {'everness:forsaken_desert_cobble_red', 'everness:forsaken_desert_stone'}, + {'everness:forsaken_tundra_cobble', 'everness:forsaken_tundra_stone'}, + {'everness:mineral_cave_cobblestone', 'everness:mineral_cave_stone'}, + {'everness:mineral_lava_stone_dry', 'everness:mineral_lava_stone'}, + {'everness:mineral_stone_cobble', 'everness:mineral_stone'}, + -- + {'everness:bamboo_block', 'everness:bamboo_dry_block'}, + {'everness:baobab_fruit', 'everness:baobab_fruit_roasted'}, + {'everness:cursed_stone', 'everness:cursed_stone_carved'}, + {'everness:lotus_leaf', 'everness:lotus_leaf_3'}, + {'everness:lotus_leaf_2', 'everness:lotus_leaf_3'}, + {'everness:pyriteblock', 'everness:pyriteblock_forged'}, + {'group:everness_sand', 'everness:glass'}, +} + +for _, data in ipairs(recipes_cooking) do + core.register_craft({ + type = 'cooking', + output = data[2], + recipe = data[1], + }) +end + +-- +-- Saplings +-- +register_craft_1x2_composite('group:lantern', 'everness:coral_tree_sapling', 'everness:coral_tree_bioluminescent_sapling') +register_craft_1x2_composite('group:lantern', 'everness:dry_tree_sapling', 'everness:cursed_dream_tree_sapling') + +register_craft_2x2('everness:crystal_tree_sapling', 'everness:crystal_tree_large_sapling') diff --git a/mods/everness/craftitems.lua b/mods/everness/craftitems.lua new file mode 100644 index 0000000..91d67b8 --- /dev/null +++ b/mods/everness/craftitems.lua @@ -0,0 +1,77 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +-- +-- Craftitem registry +-- + +-- Quartz Crystal +Everness:register_craftitem('everness:quartz_crystal', { + description = S('Quartz Crystal'), + inventory_image = 'everness_quartz.png', +}) + +Everness:register_craftitem('everness:bamboo_item', { + description = S('Bamboo'), + inventory_image = 'everness_bamboo_item.png', +}) + +Everness:register_craftitem('everness:baobab_fruit_roasted', { + description = S('Baobab Roasted Fruit') .. '\n'.. core.colorize(Everness.colors.brown, S('Hunger') .. ': 4'), + inventory_image = 'everness_baobab_tree_fruit_roasted.png', + on_use = core.item_eat(4), +}) + +Everness:register_craftitem('everness:pyrite_ingot', { + description = S('Pyrite Ingot'), + inventory_image = 'everness_pyrite_ingot.png' +}) + +Everness:register_craftitem('everness:pyrite_lump', { + description = S('Pyrite Lump'), + inventory_image = 'everness_pyrite_lump.png' +}) + +Everness:register_craftitem('everness:coconut_fruit', { + description = S('Coconut') .. '\n'.. core.colorize(Everness.colors.brown, S('Hunger') .. ': 4'), + inventory_image = 'everness_coconut_item.png', + wield_scale = { x = 2, y = 2, z = 1 }, + on_use = core.item_eat(4), +}) + +-- +-- Crafting recipes +-- + +core.register_craft({ + output = 'everness:pyrite_ingot 9', + recipe = { + { 'everness:pyriteblock' }, + } +}) + +-- +-- Cooking recipes +-- + +core.register_craft({ + type = 'cooking', + output = 'everness:pyrite_ingot', + recipe = 'everness:pyrite_lump', +}) + diff --git a/mods/everness/doors.lua b/mods/everness/doors.lua new file mode 100644 index 0000000..4542cdd --- /dev/null +++ b/mods/everness/doors.lua @@ -0,0 +1,232 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +doors.register('everness:door_bamboo', { + tiles = { { name = 'everness_door_bamboo.png', backface_culling = true } }, + description = S('Bamboo Door'), + inventory_image = 'everness_door_bamboo_item.png', + groups = { node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1 }, + sounds = Everness.node_sound_bamboo_defaults({ + dug = { name = 'everness_bamboo_hit', gain = 1.25 } + }), + sound_open = 'everness_door_bamboo_open', + sound_close = 'everness_door_bamboo_open', + gain_open = 5, + gain_close = 5, + recipe = { + { 'everness:bamboo_wood', 'everness:bamboo_wood' }, + { 'everness:bamboo_wood', 'everness:bamboo_wood' }, + { 'everness:bamboo_wood', 'everness:bamboo_wood' }, + } +}) + +doors.register_trapdoor('everness:trapdoor_bamboo', { + description = S('Bamboo Trapdoor'), + inventory_image = 'everness_door_trapdoor_bamboo.png', + wield_image = 'everness_door_trapdoor_bamboo.png', + tile_front = 'everness_door_trapdoor_bamboo.png', + tile_side = 'everness_door_trapdoor_bamboo_side.png', + sounds = Everness.node_sound_bamboo_defaults({ + dug = { name = 'everness_bamboo_hit', gain = 1.25 } + }), + sound_open = 'everness_door_bamboo_open', + sound_close = 'everness_door_bamboo_open', + gain_open = 5, + gain_close = 5, + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1 }, +}) + +doors.register_fencegate('everness:gate_bamboo', { + description = S('Bamboo Wood Fence Gate'), + texture = 'everness_dry_bamboo_block_side.png^[transformR90', + material = 'everness:bamboo_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 } +}) + +doors.register('everness:door_bone_pyrite', { + tiles = { { name = 'everness_door_bone_pyrite.png', backface_culling = true } }, + description = S('Bone Pyrit Door'), + inventory_image = 'everness_door_bone_pyrite_item.png', + groups = { node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1 }, + sounds = Everness.node_sound_wood_defaults(), + recipe = { + { 'everness:pyrite_ingot', 'everness:bone' }, + { 'everness:pyrite_ingot', 'everness:bone' }, + { 'everness:pyrite_ingot', 'everness:bone' }, + } +}) + +doors.register('everness:door_willow', { + tiles = { { name = 'everness_door_willow.png', backface_culling = true } }, + description = S('Willow Door'), + inventory_image = 'everness_door_willow_item.png', + groups = { node = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1 }, + sounds = Everness.node_sound_wood_defaults(), + recipe = { + { 'everness:willow_wood', 'everness:willow_wood' }, + { 'everness:willow_wood', 'everness:willow_wood' }, + { 'everness:willow_wood', 'everness:willow_wood' }, + } +}) + +doors.register('everness:door_crystal_wood', { + description = S('Crystal Wood Door'), + tiles = { 'everness_door_crystal_wood.png' }, + inventory_image = 'everness_door_crystal_wood_item.png', + use_texture_alpha = 'blend', + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, + sounds = Everness.node_sound_glass_defaults(), + sound_open = 'everness_door_glass_open', + sound_close = 'everness_door_glass_close', + gain_open = 0.2, + gain_close = 0.15, + recipe = { + { 'everness:crystal_wood', 'everness:crystal_wood' }, + { 'everness:crystal_wood', 'everness:crystal_wood' }, + { 'everness:crystal_wood', 'everness:crystal_wood' }, + } +}) + +doors.register_trapdoor('everness:trapdoor_crystal_wood', { + description = S('Crystal Wood Trapdoor'), + inventory_image = 'everness_door_trapdoor_crystal_wood.png', + wield_image = 'everness_door_trapdoor_crystal_wood.png', + tile_front = 'everness_door_trapdoor_crystal_wood.png', + tile_side = 'everness_door_trapdoor_crystal_wood_side.png', + use_texture_alpha = 'blend', + sounds = Everness.node_sound_glass_defaults(), + sound_open = 'everness_door_glass_open', + sound_close = 'everness_door_glass_close', + gain_open = 0.2, + gain_close = 0.15, + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, +}) + +doors.register_fencegate('everness:gate_crystal_wood', { + description = S('Crystal Wood Fence Gate'), + texture = 'everness_crystal_wood.png^[transformR90', + material = 'everness:crystal_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 } +}) + +doors.register('everness:door_cursed_wood', { + description = S('Cursed Wood Door'), + tiles = { 'everness_door_cursed_wood.png' }, + inventory_image = 'everness_door_cursed_wood_item.png', + use_texture_alpha = 'blend', + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, + sounds = Everness.node_sound_wood_defaults(), + sound_open = 'everness_creaky_door_open', + sound_close = 'everness_creaky_door_close', + gain_open = 0.15, + gain_close = 0.15, + recipe = { + { 'everness:dry_wood', 'everness:dry_wood' }, + { 'everness:dry_wood', 'everness:dry_wood' }, + { 'everness:dry_wood', 'everness:dry_wood' }, + } +}) + +doors.register_trapdoor('everness:trapdoor_cursed_wood', { + description = S('Cursed Wood Trapdoor'), + inventory_image = 'everness_door_trapdoor_cursed_wood.png', + wield_image = 'everness_door_trapdoor_cursed_wood.png', + tile_front = 'everness_door_trapdoor_cursed_wood.png', + tile_side = 'everness_door_trapdoor_cursed_wood_side.png', + sounds = Everness.node_sound_wood_defaults(), + sound_open = 'everness_creaky_door_open', + sound_close = 'everness_creaky_door_close', + gain_open = 0.15, + gain_close = 0.15, + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, +}) + +-- Palm Wood + +doors.register('everness:door_palm_wood', { + description = S('Palm Wood Door'), + tiles = { 'everness_door_palm_wood.png' }, + inventory_image = 'everness_door_palm_wood_item.png', + use_texture_alpha = 'blend', + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, + sounds = Everness.node_sound_wood_defaults(), + recipe = { + { 'everness:palm_tree_wood', 'everness:palm_tree_wood' }, + { 'everness:palm_tree_wood', 'everness:palm_tree_wood' }, + { 'everness:palm_tree_wood', 'everness:palm_tree_wood' }, + } +}) + +doors.register_trapdoor('everness:trapdoor_palm_wood', { + description = S('Palm Wood Trapdoor'), + inventory_image = 'everness_door_trapdoor_palm_wood.png', + wield_image = 'everness_door_trapdoor_palm_wood.png', + tile_front = 'everness_door_trapdoor_palm_wood.png', + tile_side = 'everness_door_trapdoor_palm_wood_side.png', + sounds = Everness.node_sound_wood_defaults(), + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, +}) + +doors.register_fencegate('everness:gate_palm_wood', { + description = S('Palm Wood Fence Gate'), + texture = 'everness_palm_tree_wood.png^[sheet:2x2:1,1', + material = 'everness:palm_tree_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 } +}) + +-- Coral Wood + +doors.register_fencegate('everness:gate_coral_wood', { + description = S('Coral Wood Fence Gate'), + texture = 'everness_coral_wood.png', + material = 'everness:coral_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 } +}) + +-- Lava Tree Wood + +doors.register('everness:door_lava_tree', { + description = S('Lava Tree Wood Door'), + tiles = { 'everness_door_lava_tree_wood.png' }, + inventory_image = 'everness_door_lava_tree_wood_item.png', + use_texture_alpha = 'blend', + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, + sounds = Everness.node_sound_wood_defaults(), + recipe = { + { 'everness:lava_tree_wood', 'everness:lava_tree_wood' }, + { 'everness:lava_tree_wood', 'everness:lava_tree_wood' }, + { 'everness:lava_tree_wood', 'everness:lava_tree_wood' }, + } +}) + +doors.register_trapdoor('everness:trapdoor_lava_tree', { + description = S('Lava Tree Wood Trapdoor'), + inventory_image = 'everness_door_trapdoor_lava_tree_wood.png', + wield_image = 'everness_door_trapdoor_lava_tree_wood.png', + tile_front = 'everness_door_trapdoor_lava_tree_wood.png', + tile_side = 'everness_door_trapdoor_lava_tree_wood_side.png', + sounds = Everness.node_sound_wood_defaults(), + groups = { node = 1, choppy = 3, oddly_breakable_by_hand = 3, door = 1 }, +}) + +doors.register_fencegate('everness:gate_lava_tree_wood', { + description = S('Lava Tree Wood Fence Gate'), + texture = 'everness_lava_tree.png^[sheet:2x2:1,1', + material = 'everness:lava_tree', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 } +}) diff --git a/mods/everness/env_sounds.lua b/mods/everness/env_sounds.lua new file mode 100644 index 0000000..4ecff7f --- /dev/null +++ b/mods/everness/env_sounds.lua @@ -0,0 +1,1183 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local SOUND_DEFS = { + ['everness:cursed_lands'] = { + day = { + { + name = 'everness_ambience_graveyard_1', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_7', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_8', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_9', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_10', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_5', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_graveyard_6', + length = 6, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_1', + length = 1.9, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_2', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_3', + length = 6, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_4', + length = 10, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_5', + length = 14, + gain = 0.6, + }, + }, + night = { + { + name = 'everness_ambience_night_crickets_1', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_night_crickets_2', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_night_crickets_3', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_night_crickets_4', + length = 7, + gain = 0.6, + }, + { + name = 'everness_ambience_night_crickets_5', + length = 6.5, + gain = 0.6, + }, + { + name = 'everness_ambience_owl_1', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_1', + length = 1.9, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_2', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_3', + length = 6, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_4', + length = 10, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_5', + length = 14, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_6', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:cursed_lands_swamp'] = { + day = { + { + name = 'everness_ambience_swamp_1', + length = 6.8, + gain = 0.6, + }, + { + name = 'everness_ambience_swamp_2', + length = 8.8, + gain = 0.6, + }, + { + name = 'everness_ambience_swamp_3', + length = 8.7, + gain = 0.6, + }, + { + name = 'everness_ambience_swamp_4', + length = 12, + gain = 0.6, + }, + } + }, + ['everness:cursed_lands_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + { + name = 'everness_ambience_creepy_cave_1', + length = 5.5, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_1', + length = 1.9, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_2', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_3', + length = 6, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_4', + length = 10, + gain = 0.6, + }, + { + name = 'everness_ambience_ghost_5', + length = 14, + gain = 0.6, + }, + } + }, + ['everness:coral_forest_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:frosted_icesheet'] = { + day = { + { + name = 'everness_ambience_snow_storm_1', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_snow_storm_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_snow_storm_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_snow_storm_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_ice_cracking_1', + length = 2.4, + gain = 1.5, + }, + { + name = 'everness_ambience_ice_cracking_2', + length = 2.5, + gain = 1.5, + }, + { + name = 'everness_ambience_ice_cracking_3', + length = 3, + gain = 1.5, + }, + } + }, + ['everness:frosted_icesheet_ocean'] = { + day = { + { + name = 'everness_ambience_snow_storm_1', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_snow_storm_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_snow_storm_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_snow_storm_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_ice_cracking_1', + length = 2.4, + gain = 1.5, + }, + { + name = 'everness_ambience_ice_cracking_2', + length = 2.5, + gain = 1.5, + }, + { + name = 'everness_ambience_ice_cracking_3', + length = 3, + gain = 1.5, + }, + } + }, + ['everness:frosted_icesheet_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:crystal_forest_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:bamboo_forest_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:forsaken_desert_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:forsaken_tundra'] = { + day = { + { + name = 'everness_ambience_sulfur_1', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_sulfur_2', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_sulfur_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_sulfur_4', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_hot_stone_1', + length = 9, + gain = 1.5, + }, + { + name = 'everness_ambience_hot_stone_2', + length = 9, + gain = 1.5, + }, + } + }, + ['everness:forsaken_tundra_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + } + }, + ['everness:mineral_waters_under'] = { + day = { + { + name = 'everness_ambience_monster_sigh_cave', + length = 2, + gain = 0.6, + }, + { + name = 'everness_ambience_rocks_falling_cave', + length = 12, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_1', + length = 11, + gain = 0.6, + }, + { + name = 'everness_ambience_water_drips_cave_2', + length = 13, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_1', + length = 15, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_2', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_3', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_wind_cave_5', + length = 7.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_1', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_2', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_3', + length = 5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_4', + length = 8, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_5', + length = 8.5, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_6', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_7', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_8', + length = 9, + gain = 0.6, + }, + { + name = 'everness_ambience_cave_9', + length = 10, + gain = 0.6, + }, + { + name = 'everness_lava_1', + length = 10, + gain = 1.0, + }, + { + name = 'everness_lava_2', + length = 10, + gain = 2.0, + }, + } + }, +} + +local PLAYER_SOUNDS = {} + +-- Update sound for player +local function update_sound(player) + local player_name = player:get_player_name() + local player_pos = player:get_pos() + local biome_data = core.get_biome_data(player_pos) + + if not biome_data then + return + end + + local biome_name = core.get_biome_name(biome_data.biome) + + if not biome_name then + return + end + + if not PLAYER_SOUNDS[player_name] then + local sound_def_biome = SOUND_DEFS[biome_name] + + if not sound_def_biome then + return + end + + local sound_def = sound_def_biome.day[1] + + -- day + if #sound_def_biome.day > 1 then + sound_def = sound_def_biome.day[math.random(1, #sound_def_biome.day)] + end + + -- night between 19:19:12 - 04:48:00 + if sound_def_biome.night then + local tod = core.get_timeofday() + + if tod > 0.805 or tod < 0.2 then + sound_def = sound_def_biome.night[1] + + if #sound_def_biome.night > 1 then + sound_def = sound_def_biome.night[math.random(1, #sound_def_biome.night)] + end + end + end + + PLAYER_SOUNDS[player_name] = core.sound_play(sound_def.name, { + to_player = player_name, + gain = 0, + }, false) + + -- fade in + core.sound_fade(PLAYER_SOUNDS[player_name], (sound_def.gain / sound_def.length) / 2, sound_def.gain) + + core.after(sound_def.length / 2, function(v_player_sounds, v_player_name) + -- fade out + if not v_player_sounds[v_player_name] then + return + end + + core.sound_fade(v_player_sounds[v_player_name], ((sound_def.gain / sound_def.length) / 2) * -1, 0) + end, PLAYER_SOUNDS, player_name) + + -- remove handle + core.after(sound_def.length, function(v_player_sounds, v_player_name) + v_player_sounds[v_player_name] = nil + end, PLAYER_SOUNDS, player_name) + end +end + +-- Update sound when player joins +core.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + PLAYER_SOUNDS[player_name] = nil + update_sound(player) +end) + +-- Stop sound when player leaves +core.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + if PLAYER_SOUNDS[player_name] then + core.sound_stop(PLAYER_SOUNDS[player_name]) + PLAYER_SOUNDS[player_name] = nil + end +end) + +-- Cyclic sound update +local function cyclic_update() + for _, player in pairs(core.get_connected_players()) do + update_sound(player) + end + + core.after(math.random(30, 180), cyclic_update) +end + +core.after(0, cyclic_update) diff --git a/mods/everness/fences.lua b/mods/everness/fences.lua new file mode 100644 index 0000000..0dbdb03 --- /dev/null +++ b/mods/everness/fences.lua @@ -0,0 +1,209 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +-- Dry Wood + +default.register_fence('everness:fence_dry_wood', { + description = S('Dry Wood Fence'), + texture = 'everness_fence_dry_wood.png', + inventory_image = 'default_fence_overlay.png^everness_dry_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_overlay.png^everness_dry_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + material = 'everness:dry_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_fence_rail('everness:fence_rail_dry_wood', { + description = S('Dry Wood Fence Rail'), + texture = 'everness_fence_rail_dry_wood.png', + inventory_image = 'default_fence_rail_overlay.png^everness_dry_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_rail_overlay.png^everness_dry_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + material = 'everness:dry_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_mesepost('everness:mese_post_light_dry_wood', { + description = S('Dry Wood Mese Post Light'), + texture = 'everness_fence_dry_wood.png', + material = 'everness:dry_wood', +}) + +-- Bamboo Wood + +default.register_fence('everness:fence_bamboo_wood', { + description = S('Bamboo Wood Fence'), + texture = 'everness_fence_bamboo_wood.png', + inventory_image = 'default_fence_overlay.png^everness_dry_bamboo_block_side.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_overlay.png^everness_dry_bamboo_block_side.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + material = 'everness:bamboo_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_fence_rail('everness:fence_rail_bamboo_wood', { + description = S('Bamboo Wood Fence Rail'), + texture = 'everness_fence_rail_bamboo_wood.png^[transformR90', + inventory_image = 'default_fence_rail_overlay.png^everness_dry_bamboo_block_side.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_rail_overlay.png^everness_dry_bamboo_block_side.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + material = 'everness:bamboo_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_mesepost('everness:mese_post_light_bamboo_wood', { + description = S('Bamboo Wood Mese Post Light'), + texture = 'everness_fence_bamboo_wood.png^[transformFY', + material = 'everness:bamboo_wood', +}) + +-- Crystal Wood + +default.register_fence('everness:fence_crystal_wood', { + description = S('Crystal Wood Fence'), + texture = 'everness_fence_crystal_wood.png', + inventory_image = 'default_fence_overlay.png^everness_crystal_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_overlay.png^everness_crystal_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + material = 'everness:crystal_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_fence_rail('everness:fence_rail_crystal_wood', { + description = S('Crystal Wood Fence Rail'), + texture = 'everness_fence_rail_crystal_wood.png^[transformR90', + inventory_image = 'default_fence_rail_overlay.png^everness_crystal_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_rail_overlay.png^everness_crystal_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + material = 'everness:crystal_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_mesepost('everness:mese_post_light_crystal_wood', { + description = S('Crystal Wood Mese Post Light'), + texture = 'everness_fence_crystal_wood.png^[transformFY', + material = 'everness:crystal_wood', +}) + +-- Palm Wood + +default.register_fence('everness:fence_palm_wood', { + description = S('Palm Wood Fence'), + texture = 'everness_fence_palm_wood.png', + inventory_image = 'default_fence_overlay.png^everness_palm_tree_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_overlay.png^everness_palm_tree_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + material = 'everness:palm_tree_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_fence_rail('everness:fence_rail_palm_wood', { + description = S('Palm Wood Fence Rail'), + texture = 'everness_fence_rail_palm_wood.png^[transformR90', + inventory_image = 'default_fence_rail_overlay.png^everness_palm_tree_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_rail_overlay.png^everness_palm_tree_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + material = 'everness:palm_tree_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_mesepost('everness:mese_post_light_palm_wood', { + description = S('Palm Wood Mese Post Light'), + texture = 'everness_fence_palm_wood.png^[transformFY', + material = 'everness:palm_tree_wood', +}) + +-- Coral Wood + +default.register_fence('everness:fence_coral_wood', { + description = S('Coral Wood Fence'), + texture = 'everness_fence_coral_wood.png', + inventory_image = 'default_fence_overlay.png^everness_fence_coral_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_overlay.png^everness_fence_coral_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + material = 'everness:coral_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_fence_rail('everness:fence_rail_coral_wood', { + description = S('Coral Wood Fence Rail'), + texture = 'everness_fence_rail_coral_wood.png^[transformR90', + inventory_image = 'default_fence_rail_overlay.png^everness_fence_coral_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_rail_overlay.png^everness_fence_coral_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + material = 'everness:coral_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_mesepost('everness:mese_post_light_coral_wood', { + description = S('Coral Wood Mese Post Light'), + texture = 'everness_fence_coral_wood.png^[transformFY', + material = 'everness:coral_wood', +}) + +-- Lava Tree Wood + +default.register_fence('everness:fence_lava_tree_wood', { + description = S('Lava Tree Wood Fence'), + texture = 'everness_fence_lava_tree_wood.png', + inventory_image = 'default_fence_overlay.png^everness_lava_tree_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_overlay.png^everness_lava_tree_wood.png^' .. + 'default_fence_overlay.png^[makealpha:255,126,126', + material = 'everness:lava_tree_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_fence_rail('everness:fence_rail_lava_tree_wood', { + description = S('Lava Tree Wood Fence Rail'), + texture = 'everness_fence_rail_lava_tree_wood.png^[transformR90', + inventory_image = 'default_fence_rail_overlay.png^everness_lava_tree_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + wield_image = 'default_fence_rail_overlay.png^everness_lava_tree_wood.png^' .. + 'default_fence_rail_overlay.png^[makealpha:255,126,126', + material = 'everness:lava_tree_wood', + groups = { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + sounds = Everness.node_sound_wood_defaults() +}) + +default.register_mesepost('everness:mese_post_light_lava_tree_wood', { + description = S('Lava Tree Wood Mese Post Light'), + texture = 'everness_fence_lava_tree_wood.png^[transformFY', + material = 'everness:lava_tree_wood', +}) diff --git a/mods/everness/functions.lua b/mods/everness/functions.lua new file mode 100644 index 0000000..f470e1b --- /dev/null +++ b/mods/everness/functions.lua @@ -0,0 +1,1741 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Player proximity helper for ambient particle spawners & client effects +-- + +local function is_player_nearby(pos, max_dist) + local players = core.get_connected_players() + for i = 1, #players do + local player = players[i] + local ppos = player:get_pos() + if ppos then + local dx = pos.x - ppos.x + local dy = pos.y - ppos.y + local dz = pos.z - ppos.z + local dist_sq = dx * dx + dy * dy + dz * dz + + -- 1. Immediate vicinity in any direction (18m) + if dist_sq <= 324 then -- 18^2 + return true + end + + -- 2. Extended forward cone in player's look direction (up to max_dist * 1.5 ahead) + local extended_dist = max_dist * 1.5 + if dist_sq <= (extended_dist * extended_dist) then + local ldir = player:get_look_dir() + if ldir then + -- Dot product > 0 means the node is in front of the player's view + local dot = dx * ldir.x + dy * ldir.y + dz * ldir.z + if dot > 0 then + return true + end + end + end + end + end + return false +end + +-- +-- Convert dirt to something that fits the environment +-- + +local grass_covered_mapping = { + ['everness:coral_dirt'] = { 'everness:dirt_with_coral_grass' }, + ['everness:cursed_dirt'] = { 'everness:dirt_with_cursed_grass' }, + ['everness:crystal_dirt'] = { 'everness:dirt_with_crystal_grass' }, + ['everness:dirt_1'] = { + 'everness:dirt_with_grass_1', + 'everness:dirt_with_grass_extras_1', + 'everness:dirt_with_grass_extras_2', + }, + ['everness:dry_dirt'] = { 'everness:dry_dirt_with_dry_grass' } +} + +local grass_covered_mapping_under = { + ['everness:coral_desert_stone'] = { 'everness:coral_desert_stone_with_moss' }, + ['everness:soul_sandstone'] = { 'everness:soul_sandstone_veined' }, + ['everness:crystal_cave_dirt'] = { 'everness:crystal_cave_dirt_with_moss' }, + ['everness:mold_cobble'] = { 'everness:mold_stone_with_moss' }, + ['everness:mineral_lava_stone_dry'] = { 'everness:mineral_lava_stone_with_moss' }, +} + +-- Spread grass on dirt + +Everness:register_abm({ + label = 'everness:grass_spread', + description = 'Spreads grass on neighboring blocks.', + nodenames = { + 'everness:coral_dirt', + 'everness:cursed_dirt', + 'everness:crystal_dirt', + 'everness:dirt_1', + 'everness:dry_dirt', + }, + neighbors = { + 'air', + 'group:coral_grass', + 'group:cursed_grass', + 'group:crystal_grass', + 'group:bamboo_grass', + 'group:everness_dry_grass' + }, + interval = 12, + chance = 50, + catch_up = false, + action = function(pos, node) + -- Check for darkness: night, shadow or under a light-blocking node + -- Returns if ignore above + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + if (core.get_node_light(above) or 0) < 13 then + return + end + + -- Look for spreading dirt-type neighbours + local p2 = core.find_node_near(pos, 1, 'group:everness_spreading_dirt_type') + + if p2 then + local n3_def = grass_covered_mapping[node.name] + + if not n3_def then + return + end + + local n3_name = n3_def[1] + + if #n3_def > 1 then + n3_name = n3_def[math.random(1, #n3_def)] + end + + core.set_node(pos, { name = n3_name }) + return + end + + -- Else, any seeding nodes on top? + local name = core.get_node(above).name + + if core.get_item_group(name, 'coral_grass') ~= 0 and node.name == 'everness:coral_dirt' then + core.set_node(pos, { name = 'everness:dirt_with_coral_grass' }) + elseif core.get_item_group(name, 'cursed_grass') ~= 0 and node.name == 'everness:cursed_dirt' then + core.set_node(pos, { name = 'everness:dirt_with_cursed_grass' }) + elseif core.get_item_group(name, 'crystal_grass') ~= 0 and node.name == 'everness:crystal_dirt' then + core.set_node(pos, { name = 'everness:dirt_with_crystal_grass' }) + elseif core.get_item_group(name, 'bamboo_grass') ~= 0 and node.name == 'everness:dirt_1' then + local bamboo_grass_covered_types = { + 'everness:dirt_with_grass_1', + 'everness:dirt_with_grass_extras_1', + 'everness:dirt_with_grass_extras_2' + } + + core.set_node(pos, { name = bamboo_grass_covered_types[math.random(1, #bamboo_grass_covered_types)] }) + elseif core.get_item_group(name, 'everness_dry_grass') ~= 0 and node.name == 'everness:dry_dirt' then + core.set_node(pos, { name = 'everness:dry_dirt_with_dry_grass' }) + end + end +}) + +-- Spread mold/moss on stone/dirt - under + +Everness:register_abm({ + label = 'everness:grass_spread_under', + description = 'Spreads grass on neighboring blocks in caves (under).', + nodenames = { + 'everness:coral_desert_stone', + 'everness:soul_sandstone', + 'everness:crystal_cave_dirt', + 'everness:mold_cobble', + 'everness:mineral_lava_stone_dry', + }, + neighbors = { + 'air', + 'group:coral_grass_under', + 'group:cursed_grass_under', + 'group:crystal_grass_under', + 'group:forsaken_tundra_grass_under', + 'group:mineral_waters_grass_under', + }, + interval = 12, + chance = 50, + catch_up = false, + action = function(pos, node) + -- Check for darkness: night, shadow or under a light-blocking node + -- Returns if ignore above + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + if (core.get_node_light(above) or 0) < 13 then + return + end + + -- Look for spreading dirt-type neighbours + local p2 = core.find_node_near(pos, 1, 'group:everness_spreading_dirt_type_under') + + if p2 then + local n3_def = grass_covered_mapping_under[node.name] + + if not n3_def then + return + end + + local n3_name = n3_def[1] + + if #n3_def > 1 then + n3_name = n3_def[math.random(1, #n3_def)] + end + + core.set_node(pos, {name = n3_name}) + return + end + + -- Else, any seeding nodes on top? + local name = core.get_node(above).name + + if core.get_item_group(name, 'coral_grass_under') ~= 0 and node.name == 'everness:coral_desert_stone' then + core.set_node(pos, { name = 'everness:coral_desert_stone_with_moss' }) + elseif core.get_item_group(name, 'cursed_grass_under') ~= 0 and node.name == 'everness:soul_sandstone' then + core.set_node(pos, { name = 'everness:soul_sandstone_veined' }) + elseif core.get_item_group(name, 'crystal_grass_under') ~= 0 and node.name == 'everness:crystal_cave_dirt' then + core.set_node(pos, { name = 'everness:crystal_cave_dirt_with_moss' }) + elseif core.get_item_group(name, 'forsaken_tundra_grass_under') ~= 0 and node.name == 'everness:mold_cobble' then + core.set_node(pos, { name = 'everness:mold_stone_with_moss' }) + elseif core.get_item_group(name, 'mineral_waters_grass_under') ~= 0 and node.name == 'everness:mineral_lava_stone_dry' then + core.set_node(pos, { name = 'everness:mineral_lava_stone_with_moss' }) + end + end +}) + +-- +-- Grass and dry grass removed in darkness +-- + +Everness:register_abm({ + label = 'everness:grass_covered', + description = 'Grass and dry grass removed in darkness.', + nodenames = { + 'group:everness_spreading_dirt_type', + 'group:everness_spreading_dirt_type_under', + }, + interval = 8, + chance = 50, + catch_up = false, + action = function(pos, node) + local above = { x = pos.x, y = pos.y + 1, z = pos.z } + local name = core.get_node(above).name + local nodedef = core.registered_nodes[name] + + if name ~= 'ignore' + and nodedef + and not ( + (nodedef.sunlight_propagates or nodedef.paramtype == 'light') + and nodedef.liquidtype == 'none' + ) + then + if node.name == 'everness:dirt_with_coral_grass' then + core.set_node(pos, { name = 'everness:coral_dirt' }) + elseif node.name == 'everness:dirt_with_cursed_grass' then + core.set_node(pos, { name = 'everness:cursed_dirt' }) + elseif node.name == 'everness:dirt_with_crystal_grass' then + core.set_node(pos, { name = 'everness:crystal_dirt' }) + elseif node.name == 'everness:dirt_with_grass_1' + or node.name == 'everness:dirt_with_grass_extras_1' + or node.name == 'everness:dirt_with_grass_extras_2' + then + core.set_node(pos, { name = 'everness:dirt_1' }) + elseif node.name == 'everness:coral_desert_stone_with_moss' then + core.set_node(pos, { name = 'everness:coral_desert_stone' }) + elseif node.name == 'everness:dry_dirt_with_dry_grass' then + core.set_node(pos, { name = 'everness:dry_dirt' }) + elseif node.name == 'everness:soul_sandstone_veined' then + core.set_node(pos, { name = 'everness:soul_sandstone' }) + elseif node.name == 'everness:crystal_cave_dirt_with_moss' then + core.set_node(pos, { name = 'everness:crystal_cave_dirt' }) + elseif node.name == 'everness:mold_stone_with_moss' then + core.set_node(pos, { name = 'everness:mold_cobble' }) + elseif node.name == 'everness:mineral_lava_stone_with_moss' then + core.set_node(pos, { name = 'everness:mineral_lava_stone_dry' }) + end + end + end +}) + +-- +-- Leafdecay +-- + +Everness:register_leafdecay({ + trunks = { + 'everness:coral_tree', + 'everness:coral_tree_bioluminescent', + 'everness:crystal_bush_stem', + 'everness:cursed_bush_stem', + 'everness:willow_tree', + 'everness:sequoia_tree', + 'everness:mese_tree', + 'everness:palm_tree', + 'everness:lava_tree', + 'everness:lava_tree_with_lava' + }, + leaves = { + 'everness:coral_leaves', + 'everness:crystal_bush_leaves', + 'everness:willow_leaves', + 'everness:sequoia_leaves', + 'everness:mese_leaves', + 'everness:mese_tree_fruit', + 'everness:palm_leaves', + 'everness:coconut', + 'everness:lava_tree_leaves' + }, + radius = 3 +}) + +-- Baobab Tree +Everness:register_leafdecay({ + trunks = { + 'everness:baobab_tree', + 'everness:crystal_tree', + 'everness:dry_tree', + }, + leaves = { + 'everness:baobab_leaves', + 'everness:baobab_fruit_renewable', + 'everness:crystal_leaves', + 'everness:dry_branches', + }, + radius = 4, +}) + +-- +-- Moss growth on cobble near water +-- + +local moss_correspondences = { + ['everness:coral_desert_cobble'] = 'everness:coral_desert_mossy_cobble', + ['everness:crystal_cobble'] = 'everness:crystal_mossy_cobble', + ['stairs:slab_crystal_cobble'] = 'stairs:slab_crystal_mossy_cobble', + ['stairs:stair_crystal_cobble'] = 'stairs:stair_crystal_mossy_cobble', + ['stairs:stair_inner_crystal_cobble'] = 'stairs:stair_inner_crystal_mossy_cobble', + ['stairs:stair_outer_crystal_cobble'] = 'stairs:stair_outer_crystal_mossy_cobble', + ['everness:crystal_cobble_wall'] = 'everness:crystal_mossy_cobble_wall' +} + +local moss_nodenames_correspondences = { + 'everness:coral_desert_cobble', + 'everness:crystal_cobble', + 'stairs:slab_crystal_cobble', + 'stairs:stair_crystal_cobble', + 'stairs:stair_inner_crystal_cobble', + 'stairs:stair_outer_crystal_cobble', + 'everness:crystal_cobble_wall' +} + +if core.get_modpath('default') then + moss_correspondences['stairs:slab_coral_desert_cobble'] = 'stairs:slab_coral_desert_mossy_cobble' + moss_correspondences['stairs:stair_coral_desert_cobble'] = 'stairs:stair_coral_desert_mossy_cobble' + moss_correspondences['stairs:stair_inner_coral_desert_cobble'] = 'stairs:stair_inner_coral_desert_mossy_cobble' + moss_correspondences['stairs:stair_outer_coral_desert_cobble'] = 'stairs:stair_outer_coral_desert_mossy_cobble' + moss_correspondences['everness:coral_desert_cobble_wall'] = 'everness:coral_desert_mossy_cobble_wall' + + table.insert(moss_nodenames_correspondences, 'stairs:slab_coral_desert_cobble') + table.insert(moss_nodenames_correspondences, 'stairs:stair_coral_desert_cobble') + table.insert(moss_nodenames_correspondences, 'stairs:stair_inner_coral_desert_cobble') + table.insert(moss_nodenames_correspondences, 'stairs:stair_outer_coral_desert_cobble') + table.insert(moss_nodenames_correspondences, 'everness:coral_desert_cobble_wall') +elseif core.get_modpath('mcl_core') then + moss_correspondences['mcl_stairs:slab_coral_desert_cobble'] = 'mcl_stairs:slab_coral_desert_mossy_cobble' + moss_correspondences['mcl_stairs:stair_coral_desert_cobble'] = 'mcl_stairs:stair_coral_desert_mossy_cobble' + moss_correspondences['everness:coral_desert_cobble_wall'] = 'everness:coral_desert_mossy_cobble_wall' + + table.insert(moss_nodenames_correspondences, 'mcl_stairs:slab_coral_desert_cobble') + table.insert(moss_nodenames_correspondences, 'mcl_stairs:stair_coral_desert_cobble') + table.insert(moss_nodenames_correspondences, 'everness:coral_desert_cobble_wall') +end + +Everness:register_abm({ + label = 'everness:moss_growth', + description = 'Grows moss on blocks near water.', + nodenames = moss_nodenames_correspondences, + neighbors = { 'group:water' }, + interval = 16, + chance = 200, + catch_up = false, + action = function(pos, node) + node.name = moss_correspondences[node.name] + + if node.name then + core.set_node(pos, node) + end + end +}) + +-- +-- Magma growth on cobble near lava +-- + +local magma_correspondences = { + ['everness:volcanic_rock'] = 'everness:volcanic_rock_with_magma', +} + +local magma_nodenames_correspondences = { + 'everness:volcanic_rock' +} + +if core.get_modpath('default') then + magma_correspondences['default:cobble'] = 'everness:magmacobble' + magma_correspondences['stairs:slab_cobble'] = 'stairs:slab_magmacobble' + magma_correspondences['stairs:stair_cobble'] = 'stairs:stair_magmacobble' + magma_correspondences['stairs:stair_inner_cobble'] = 'stairs:stair_inner_magmacobble' + magma_correspondences['stairs:stair_outer_cobble'] = 'stairs:stair_outer_magmacobble' + magma_correspondences['walls:cobble'] = 'everness:magmacobble_wall' + magma_correspondences['stairs:slab_volcanic_rock'] = 'stairs:slab_volcanic_rock_with_magma' + magma_correspondences['stairs:stair_volcanic_rock'] = 'stairs:stair_volcanic_rock_with_magma' + magma_correspondences['stairs:stair_inner_volcanic_rock'] = 'stairs:stair_inner_volcanic_rock_with_magma' + magma_correspondences['stairs:stair_outer_volcanic_rock'] = 'stairs:stair_outer_volcanic_rock_with_magma' + magma_correspondences['everness:volcanic_rock_wall'] = 'everness:volcanic_rock_with_magma_wall' + + table.insert(magma_nodenames_correspondences, 'default:cobble') + table.insert(magma_nodenames_correspondences, 'stairs:slab_cobble') + table.insert(magma_nodenames_correspondences, 'stairs:stair_cobble') + table.insert(magma_nodenames_correspondences, 'stairs:stair_inner_cobble') + table.insert(magma_nodenames_correspondences, 'stairs:stair_outer_cobble') + table.insert(magma_nodenames_correspondences, 'walls:cobble') + table.insert(magma_nodenames_correspondences, 'stairs:slab_volcanic_rock') + table.insert(magma_nodenames_correspondences, 'stairs:stair_volcanic_rock') + table.insert(magma_nodenames_correspondences, 'stairs:stair_inner_volcanic_rock') + table.insert(magma_nodenames_correspondences, 'stairs:stair_outer_volcanic_rock') + table.insert(magma_nodenames_correspondences, 'everness:volcanic_rock_wall') +elseif core.get_modpath('mcl_core') then + magma_correspondences['mcl_core:cobble'] = 'everness:magmacobble' + magma_correspondences['mcl_stairs:slab_cobble'] = 'mcl_stairs:slab_magmacobble' + magma_correspondences['mcl_stairs:stair_cobble'] = 'mcl_stairs:stair_magmacobble' + magma_correspondences['mcl_walls:cobble'] = 'everness:magmacobble_wall' + magma_correspondences['mcl_stairs:slab_volcanic_rock'] = 'mcl_stairs:slab_volcanic_rock_with_magma' + magma_correspondences['mcl_stairs:stair_volcanic_rock'] = 'mcl_stairs:stair_volcanic_rock_with_magma' + magma_correspondences['everness:volcanic_rock_wall'] = 'everness:volcanic_rock_with_magma_wall' + + table.insert(magma_nodenames_correspondences, 'mcl_core:cobble') + table.insert(magma_nodenames_correspondences, 'mcl_stairs:slab_cobble') + table.insert(magma_nodenames_correspondences, 'mcl_stairs:stair_cobble') + table.insert(magma_nodenames_correspondences, 'mcl_walls:cobble') + table.insert(magma_nodenames_correspondences, 'mcl_stairs:slab_volcanic_rock') + table.insert(magma_nodenames_correspondences, 'mcl_stairs:stair_volcanic_rock') + table.insert(magma_nodenames_correspondences, 'everness:volcanic_rock_wall') +end + +Everness:register_abm({ + label = 'everness:magma_growth', + description = 'Grows magma on blocks near lava.', + nodenames = magma_nodenames_correspondences, + neighbors = { 'group:lava' }, + interval = 16, + chance = 200, + catch_up = false, + action = function(pos, node) + node.name = magma_correspondences[node.name] + + if node.name then + core.set_node(pos, node) + end + end +}) + +-- +-- Falling leaves +-- + +Everness:register_abm({ + label = 'everness:falling_leaves', + description = 'Makes leaves falling particles.', + nodenames = { 'group:falling_leaves' }, + neighbors = { 'air' }, + interval = 24, + chance = 24, + catch_up = false, + action = function(pos, node) + if not core.settings:get_bool('enable_particles', true) or not is_player_nearby(pos, 32) then + return + end + + local air_below = core.find_nodes_in_area(pos, { x = pos.x, y = pos.y - 3, z = pos.z }, { 'air' }) + + if #air_below < 3 then + return + end + + -- particles + local tod = core.get_timeofday() + local is_day = (tod > 0.2 and tod < 0.805) + local particlespawner_def = { + amount = 5, + time = 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.25, y = -0.25, z = -0.25 }, + maxvel = { x = 0.25, y = -0.5, z = 0.25 }, + minacc = { x = -0.25, y = -0.25, z = -0.25 }, + maxacc = { x = 0.25, y = -0.5, z = 0.25 }, + minexptime = 3, + maxexptime = 6, + minsize = 0.5, + maxsize = 1.5, + node = node + } + + if core.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + particlespawner_def = { + amount = 5, + time = 1, + size = { + min = 0.5, + max = 1.5, + }, + exptime = { + min = 3, + max = 6 + }, + pos = { + min = vector.new({ x = pos.x - 1, y = pos.y - 0.5, z = pos.z - 1 }), + max = vector.new({ x = pos.x + 1, y = pos.y - 1, z = pos.z + 1 }), + }, + vel = { + min = vector.new({ x = -0.25, y = -0.25, z = -0.25 }), + max = vector.new({ x = 0.25, y = -0.5, z = 0.25 }) + }, + acc = { + min = vector.new({ x = -0.25, y = -0.25, z = -0.25 }), + max = vector.new({ x = 0.25, y = -0.5, z = 0.25 }) + }, + node = { + name = node.name + } + } + + local anim_def + + if node.name == 'everness:coral_leaves' then + anim_def = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 1.6 + } + + particlespawner_def = Everness.mergeTables(particlespawner_def, { + size = { + min = 2.5, + max = 7.5, + }, + exptime = { + min = 11, + max = 19 + }, + vel = { + min = vector.new(-0.3, -0.8, -0.3), + max = vector.new( 0.3, -0.4, 0.3) + }, + acc = { + min = vector.new(-0.05, -0.05, -0.05), + max = vector.new( 0.05, -0.01, 0.05) + }, + drag = { + min = vector.new(0.1, 0.05, 0.1), + max = vector.new(0.2, 0.10, 0.2) + }, + jitter = { + min = vector.new(-0.1, -0.05, -0.1), + max = vector.new( 0.1, 0.05, 0.1) + }, + collisiondetection = true, + collision_removal = false, + glow = is_day and 0 or math.random(4, 7), + texpool = { + -- 1. Lighter Rosy Mauve (+16 Lightness, +5 Saturation) + { + name = 'everness_coral_leaves_particle_anim.png^[hsl:0:5:16', + animation = anim_def + }, + -- 2. Direct Mid-tone Match (Base texture, 0 shift) + { + name = 'everness_coral_leaves_particle_anim.png', + animation = anim_def + }, + -- 3. Deeper Shadow Wine (-15 Lightness) + { + name = 'everness_coral_leaves_particle_anim.png^[hsl:0:0:-25', + animation = anim_def + } + } + }) + + particlespawner_def.node = nil + elseif node.name == 'everness:crystal_leaves' then + anim_def = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 1.8 + } + + particlespawner_def = Everness.mergeTables(particlespawner_def, { + size = { + min = 4.5, + max = 6.5, + }, + exptime = { + min = 20, + max = 44 + }, + -- Gentle, floating drift (slower than heavy leaves) + vel = { + min = vector.new(-0.25, -0.50, -0.25), + max = vector.new( 0.25, -0.20, 0.25), + }, + -- Very light gravity + acc = { + min = vector.new(-0.03, -0.03, -0.03), + max = vector.new( 0.03, -0.01, 0.03), + }, + -- Aerodynamic air resistance (floaty petal effect) + drag = { + min = vector.new(0.15, 0.08, 0.15), + max = vector.new(0.25, 0.12, 0.25), + }, + -- Fluttering wind turbulence + jitter = { + min = vector.new(-0.15, -0.05, -0.15), + max = vector.new( 0.15, 0.05, 0.15), + }, + collisiondetection = true, + collision_removal = false, + glow = is_day and 0 or math.random(6, 9), + texpool = { + -- 1. Base Wisteria / Lilac Blossom (Original #cebee0) + { + name = 'everness_crystal_leaves_particle_anim.png', + animation = anim_def + }, + -- 2. Sakura / Cherry Blossom Pink (+80° Hue Shift) + { + name = 'everness_crystal_leaves_particle_anim.png^[hsl:80:15:0', + animation = anim_def + }, + -- 3. Golden Primrose / Honey Blossom (+135° Hue Shift) + { + name = 'everness_crystal_leaves_particle_anim.png^[hsl:135:20:0', + animation = anim_def + } + } + }) + + particlespawner_def.node = nil + elseif node.name == 'everness:dry_branches' then + anim_def = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 1.2 + } + + particlespawner_def = Everness.mergeTables(particlespawner_def, { + amount = 1, + vel = { + min = vector.new(-0.4, -1.6, -0.4), + max = vector.new( 0.4, -1.0, 0.4) + }, + acc = { + min = vector.new(-0.1, -0.6, -0.1), + max = vector.new( 0.1, -0.3, 0.1) + }, + drag = { + min = vector.new(0.02, 0.01, 0.02), + max = vector.new(0.06, 0.03, 0.06) + }, + jitter = { + min = vector.new(-0.08, -0.02, -0.08), + max = vector.new( 0.08, 0.02, 0.08) + }, + bounce = { + min = 0.1, + max = 0.25 + }, + exptime = { + min = 3.0, + max = 5.5 + }, + size = { + min = 4, + max = 7 + }, + collisiondetection = true, + collision_removal = false, + texpool = { + -- 1. Base Oak / Pine Bark Brown (Original #5e4629) + { + name = 'everness_dry_branches_particle_anim.png', + animation = anim_def + }, + -- 2. Sun-bleached / Dried Twig / Birch (Lightened & desaturated) + { + name = 'everness_dry_branches_particle_anim.png^[hsl:0:-20:20', + animation = anim_def + }, + -- 3. Mossy / Damp Forest Branch (+60° Hue shift to olive/moss) + { + name = 'everness_dry_branches_particle_anim.png^[hsl:60:15:-8', + animation = anim_def + }, + -- 4. (Optional) Dark Walnut / Peat (-20 Lightness) + { + name = 'everness_dry_branches_particle_anim.png^[hsl:0:-15:-20', + animation = anim_def + } + } + }) + + particlespawner_def.node = nil + elseif node.name == 'everness:coral_tree_bioluminescent' then + anim_def = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 1.4 + } + + particlespawner_def = Everness.mergeTables(particlespawner_def, { + amount = 7, + size = { + min = 2.5, + max = 4.5, + }, + exptime = { + min = 18, + max = 24 + }, + vel = { + min = vector.new(-0.15, -0.45, -0.15), + max = vector.new( 0.15, -0.15, 0.15) + }, + acc = { + min = vector.new(-0.02, -0.04, -0.02), + max = vector.new( 0.02, -0.01, 0.02) + }, + drag = { + min = vector.new(0.10, 0.08, 0.10), + max = vector.new(0.18, 0.12, 0.18) + }, + jitter = { + min = vector.new(-0.05, -0.05, -0.05), + max = vector.new( 0.05, 0.05, 0.05) + }, + glow = 13, + collisiondetection = true, + collision_removal = false, + texpool = { + -- 1. Base Electric Cyan / Mana Orb (Original #01e8f5, H ≈ 184°) + { + name = 'everness_coral_tree_bioluminescent_particle_anim.png', + alpha = 0.5, + animation = anim_def + }, + -- 2. Arcane Amethyst / Violet Orb (+90° Hue Shift -> H ≈ 274°) + { + name = 'everness_coral_tree_bioluminescent_particle_anim.png^[hsl:90:10:0', + alpha = 0.5, + animation = anim_def + }, + -- 3. Solar Gold / Sunfire Orb (-140° Hue Shift -> H ≈ 44°) + { + name = 'everness_coral_tree_bioluminescent_particle_anim.png^[hsl:-140:15:5', + alpha = 0.5, + animation = anim_def + } + } + }) + + particlespawner_def.node = nil + elseif node.name == 'everness:cursed_dream_stone' then + anim_def = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 1.6, + } + + particlespawner_def = Everness.mergeTables(particlespawner_def, { + amount = 7, + size = { + min = 7, + max = 11, + }, + exptime = { + min = 18, + max = 24 + }, + vel = { + min = vector.new(-0.15, -0.45, -0.15), + max = vector.new( 0.15, -0.15, 0.15) + }, + acc = { + min = vector.new(-0.02, -0.04, -0.02), + max = vector.new( 0.02, -0.01, 0.02) + }, + drag = { + min = vector.new(0.10, 0.08, 0.10), + max = vector.new(0.18, 0.12, 0.18) + }, + jitter = { + min = vector.new(-0.06, -0.03, -0.06), + max = vector.new( 0.06, 0.03, 0.06) + }, + glow = 13, + collisiondetection = true, + collision_removal = false, + texpool = { + -- 1. Base Crimson / Pure Blood Red (Original) + { + name = 'everness_cursed_dream_stone_particle_anim.png', + alpha = 0.5, + animation = anim_def + }, + -- 2. Reddish-Purple / Magenta Plum (-35° Hue shift) + { + name = 'everness_cursed_dream_stone_particle_anim.png^[hsl:-35:15:-8', + alpha = 0.5, + animation = anim_def + }, + -- 3. Deep Burgundy / Wine Red (-8° Hue, -16 Lightness) + { + name = 'everness_cursed_dream_stone_particle_anim.png^[hsl:-8:10:-16', + alpha = 0.5, + animation = anim_def + }, + -- 4. Blazing Scarlet / Fiery Ember (+18° Hue, +5 Lightness) + { + name = 'everness_cursed_dream_stone_particle_anim.png^[hsl:18:10:5', + alpha = 0.5, + animation = anim_def + } + } + }) + + particlespawner_def.node = nil + end + end + + -- Randomize falling leaves (with ABM they will fall all at the same time) + core.after(math.random(6), function(pdef) + core.add_particlespawner(pdef) + end, particlespawner_def) + end +}) + +-- +-- Falling leaves - vines +-- + +Everness:register_abm({ + label = 'everness:falling_vines', + description = 'Makes vines falling particles.', + nodenames = { 'group:falling_vines' }, + neighbors = { 'air' }, + interval = 16, + chance = 16, + catch_up = false, + action = function(pos, node) + if not core.settings:get_bool('enable_particles', true) or not is_player_nearby(pos, 32) then + return + end + + local air_around = core.find_nodes_in_area( + { x = pos.x - 1, y = pos.y, z = pos.z - 1 }, + { x = pos.x + 1, y = pos.y, z = pos.z + 1 }, + { 'air' } + ) + + if #air_around < 3 then + return + end + + -- particles + local particlespawner_def = { + amount = 5, + time = 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.25, y = -0.25, z = -0.25 }, + maxvel = { x = 0.25, y = -0.5, z = 0.25 }, + minacc = { x = -0.25, y = -0.25, z = -0.25 }, + maxacc = { x = 0.25, y = -0.5, z = 0.25 }, + minexptime = 15, + maxexptime = 30, + minsize = 0.5, + maxsize = 1.5, + node = node, + glow = 7 + } + + if core.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + particlespawner_def = { + amount = 5, + time = 1, + size = { + min = 0.5, + max = 1.5, + }, + exptime = { + min = 15, + max = 30 + }, + pos = { + min = vector.new(pos.x - 0.5, pos.y - 0.5, pos.z - 0.5), + max = vector.new(pos.x + 0.5, pos.y - 0.5, pos.z + 0.5), + }, + vel = { + min = vector.new(-0.25, -0.15, -0.25), + max = vector.new(0.25, -0.25, 0.25) + }, + acc = { + min = vector.new(-0.25, -0.05, -0.25), + max = vector.new(0.25, -0.1, 0.25) + }, + node = { + name = node.name + }, + glow = 7 + } + end + + core.add_particlespawner(particlespawner_def) + end +}) + +Everness:register_abm({ + label = 'everness:grow_orange_cactus', + description = 'Grows orange cactus.', + nodenames = { + 'everness:cactus_orange', + 'everness:cactus_blue' + }, + neighbors = { 'group:sand', 'group:everness_sand' }, + interval = 12, + chance = 83, + action = function(...) + Everness:grow_cactus(...) + end +}) + +-- +-- Bio Bubbles +-- + +Everness:register_abm({ + label = 'everness:bio_bubbles', + description = 'Bubble particles under water.', + nodenames = { 'group:bio_bubbles' }, + neighbors = { 'group:water' }, + interval = 16, + chance = 8, + catch_up = false, + action = function(pos, node) + if not core.settings:get_bool('enable_particles', true) or not is_player_nearby(pos, 32) then + return + end + + local water_above = core.find_nodes_in_area(pos, { x = pos.x, y = pos.y + 10, z = pos.z }, { 'group:water' }) + + if #water_above < 10 then + return + end + + -- particles + local particlespawner_def = { + amount = 50, + time = 10, + minpos = vector.new({ x = pos.x - 0.1, y = pos.y + 0.6, z = pos.z - 0.1 }), + maxpos = vector.new({ x = pos.x + 0.1, y = pos.y + 0.6, z = pos.z + 0.1 }), + minvel = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxvel = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minacc = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxacc = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minexptime = 5, + maxexptime = 7, + minsize = 2, + maxsize = 3.5, + texture = 'everness_bubble.png', + glow = 7 + } + + if core.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + particlespawner_def = { + amount = 50, + time = 10, + size = { + min = 2, + max = 3.5, + }, + exptime = { + min = 5, + max = 7 + }, + pos = { + min = vector.new({ x = pos.x - 0.1, y = pos.y + 0.6, z = pos.z - 0.1 }), + max = vector.new({ x = pos.x + 0.1, y = pos.y + 0.6, z = pos.z + 0.1 }), + }, + vel = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + acc = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + texture = { + name = 'everness_bubble.png', + alpha_tween = { + 1, 0, + style = 'fwd', + reps = 1 + }, + scale_tween = { + 0.5, 1, + style = 'fwd', + reps = 1 + } + }, + glow = 7 + } + end + + core.add_particlespawner(particlespawner_def) + end +}) + +-- +-- Rising Souls +-- + +Everness:register_abm({ + label = 'everness:rising_souls', + description = 'Rising souls particles under water.', + nodenames = { 'group:rising_souls' }, + neighbors = { 'group:water' }, + interval = 16, + chance = 8, + catch_up = false, + action = function(pos, node) + if not core.settings:get_bool('enable_particles', true) or not is_player_nearby(pos, 32) then + return + end + + local water_above = core.find_nodes_in_area(pos, { x = pos.x, y = pos.y + 10, z = pos.z }, { 'group:water' }) + + if #water_above < 10 then + return + end + + -- particles + local particlespawner_def = { + amount = 17, + time = 10, + minpos = vector.new({ x = pos.x - 0.3, y = pos.y + 0.6, z = pos.z - 0.3 }), + maxpos = vector.new({ x = pos.x + 0.3, y = pos.y + 0.6, z = pos.z + 0.3 }), + minvel = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxvel = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minacc = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxacc = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minexptime = 4, + maxexptime = 6, + minsize = 4, + maxsize = 6, + texture = 'everness_rising_soul_particle.png', + glow = 7 + } + + if core.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + particlespawner_def = { + amount = 17, + time = 10, + size = { + min = 4, + max = 6, + }, + exptime = { + min = 4, + max = 6 + }, + pos = { + min = vector.new({ x = pos.x - 0.3, y = pos.y + 0.6, z = pos.z - 0.3 }), + max = vector.new({ x = pos.x + 0.3, y = pos.y + 0.6, z = pos.z + 0.3 }), + }, + vel = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + acc = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + texture = { + name = 'everness_rising_soul_particle.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 2, + }, + alpha_tween = { + 1, 0, + style = 'fwd', + reps = 1 + }, + scale_tween = { + 0.5, 1, + style = 'fwd', + reps = 1 + } + }, + glow = 7 + } + end + + core.add_particlespawner(particlespawner_def) + end +}) + +-- +-- Rising Crystals +-- + +Everness:register_abm({ + label = 'everness:rising_crystals', + description = 'Crystal particles under water.', + nodenames = { 'group:rising_crystals' }, + neighbors = { 'group:water' }, + interval = 16, + chance = 8, + catch_up = false, + action = function(pos, node) + if not core.settings:get_bool('enable_particles', true) or not is_player_nearby(pos, 32) then + return + end + + local water_above = core.find_nodes_in_area(pos, { x = pos.x, y = pos.y + 10, z = pos.z }, { 'group:water' }) + + if #water_above < 10 then + return + end + + -- particles + local particlespawner_def = { + amount = 17, + time = 10, + minpos = vector.new({ x = pos.x - 0.3, y = pos.y + 0.6, z = pos.z - 0.3 }), + maxpos = vector.new({ x = pos.x + 0.3, y = pos.y + 0.6, z = pos.z + 0.3 }), + minvel = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxvel = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minacc = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxacc = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minexptime = 4, + maxexptime = 6, + minsize = 4, + maxsize = 6, + texture = 'everness_rising_soul_particle.png', + glow = 7 + } + + if core.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, after v5.6.0 + particlespawner_def = { + amount = 25, + time = 10, + size = { + min = 6, + max = 8, + }, + exptime = { + min = 4, + max = 6 + }, + pos = { + min = vector.new({ x = pos.x - 0.3, y = pos.y + 0.6, z = pos.z - 0.3 }), + max = vector.new({ x = pos.x + 0.3, y = pos.y + 0.6, z = pos.z + 0.3 }), + }, + vel = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + acc = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + texture = { + name = 'everness_crystal_forest_deep_ocean_sand_bubbles.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 1, + }, + alpha_tween = { + 1, 0.5, + style = 'fwd', + reps = 1 + } + }, + glow = 7 + } + end + + core.add_particlespawner(particlespawner_def) + end +}) + +-- Mineral Waters Water Geyser +Everness:register_abm({ + label = 'everness:water_geyser', + description = 'Water geyser water splash.', + nodenames = { 'everness:water_geyser' }, + interval = 16, + chance = 16, + catch_up = false, + action = function(pos, node) + if not is_player_nearby(pos, 48) then + return + end + + core.swap_node(pos, { name = 'everness:water_geyser_active' }) + + local meta = core.get_meta(pos) + local partcile_time = math.random(5, 15) + + -- player + for _, object in ipairs(core.get_objects_in_area(vector.new(pos.x - 0.5, pos.y - 0.5, pos.z - 0.5), vector.new(pos.x + 0.5, pos.y + 1, pos.z + 0.5))) do + if object:is_player() + and object:get_hp() > 0 + then + object:add_velocity(vector.new(0, math.random(27, 32), 0)) + end + end + + -- particles + local particlespawner_def = { + amount = 80, + time = partcile_time, + minpos = vector.new(pos.x, pos.y + 1.5, pos.z), + maxpos = vector.new(pos.x, pos.y + 2, pos.z), + minvel = vector.new(0, 13, 0), + maxvel = vector.new(0, 15, 0), + minacc = vector.new(0, -1, 1), + maxacc = vector.new(0, -3, 2), + minexptime = 3, + maxexptime = 5, + minsize = 5, + maxsize = 7, + texture = 'everness_water_geyser_particle.png', + vertical = true, + collisiondetection = true, + collision_removal = true + } + + if core.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, above v5.6.0 + particlespawner_def = { + amount = 80, + time = partcile_time, + size = { + min = 5, + max = 7, + }, + exptime = { + min = 3, + max = 5 + }, + pos = { + min = vector.new(pos.x, pos.y + 1.5, pos.z), + max = vector.new(pos.x, pos.y + 2, pos.z) + }, + vel = { + min = vector.new(0, 13, 0), + max = vector.new(0, 15, 0) + }, + acc = { + min = vector.new(0, -1, 1), + max = vector.new(0, -3, 2) + }, + texture = { + name = 'everness_water_geyser_particle.png', + scale_tween = { + 5, 10, + style = 'fwd', + reps = 1 + }, + alpha_tween = { + 1, 0, + style = 'fwd', + reps = 1 + }, + blend = 'alpha', + }, + vertical = true, + collisiondetection = true, + collision_removal = true + } + end + + local particle_id = core.add_particlespawner(particlespawner_def) + meta:set_int('particle_id', particle_id) + + core.sound_play({ + name = 'everness_water_geyser', + gain = 1.5, + pitch = math.random(10, 30) / 10 + }, { + pos = pos + }) + + core.get_node_timer(pos):start(partcile_time) + end +}) + +-- Lava spitting +Everness:register_abm({ + label = 'everness:lava_spitting', + description = 'Lava bursts in to air.', + nodenames = { 'everness:lava_source' }, + neighbors = { 'air' }, + interval = 10, + chance = 200, + catch_up = false, + action = function(pos, node) + if not is_player_nearby(pos, 32) then + return + end + + local burst_colors = { + '#FF5400', + '#DD2005' + } + local partcile_time = math.random(3, 5) + + -- particles + local particlespawner_def = { + amount = 10, + time = partcile_time, + minpos = vector.new(pos.x - 0.1, pos.y + 0.5, pos.z - 0.1), + maxpos = vector.new(pos.x + 0.1, pos.y + 1, pos.z + 0.1), + minvel = vector.new(0, 1, 0), + maxvel = vector.new(0, 3, 0), + minacc = vector.new(0, -3, 0), + maxacc = vector.new(0, -6, 0), + minexptime = 3, + maxexptime = 5, + minsize = 3, + maxsize = 10, + texture = ('everness_water_geyser_particle.png^[multiply:%s'):format(burst_colors[math.random(1, #burst_colors)]), + vertical = true, + collisiondetection = true, + collision_removal = true + } + local particlespawner_def2 = { + amount = 40, + time = partcile_time, + minpos = vector.new(pos.x, pos.y + 0.5, pos.z), + maxpos = vector.new(pos.x, pos.y + 1, pos.z), + minvel = vector.new(0, 1, 0), + maxvel = vector.new(0, 3, 0), + minacc = vector.new(-1, -3, -1), + maxacc = vector.new(1, -6, 1), + minexptime = 3, + maxexptime = 5, + minsize = 3, + maxsize = 10, + node = node, + vertical = true, + collisiondetection = true, + collision_removal = true + } + + if core.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, above v5.6.0 + particlespawner_def = { + amount = 10, + time = partcile_time, + size = { + min = 1, + max = 2, + }, + exptime = { + min = 3, + max = 5 + }, + pos = { + min = vector.new(pos.x - 0.1, pos.y + 0.5, pos.z - 0.1), + max = vector.new(pos.x + 0.1, pos.y + 1, pos.z + 0.1) + }, + vel = { + min = vector.new(0, 1, 0), + max = vector.new(0, 3, 0) + }, + acc = { + min = vector.new(0, -3, 0), + max = vector.new(0, -6, 0) + }, + texture = { + name = ('everness_water_geyser_particle.png^[multiply:%s'):format(burst_colors[math.random(1, #burst_colors)]), + scale_tween = { + 10, 3, + style = 'fwd', + reps = 1 + } + }, + vertical = true, + collisiondetection = true, + collision_removal = true + } + + particlespawner_def2 = { + amount = 40, + time = partcile_time, + size = { + min = 1, + max = 2, + }, + exptime = { + min = 3, + max = 5 + }, + pos = { + min = vector.new(pos.x, pos.y + 0.5, pos.z), + max = vector.new(pos.x, pos.y + 1, pos.z) + }, + vel = { + min = vector.new(0, 1, 0), + max = vector.new(0, 3, 0) + }, + acc = { + min = vector.new(-1, -3, -1), + max = vector.new(1, -6, 1) + }, + node = node, + vertical = true, + collisiondetection = true, + collision_removal = true + } + end + + if math.random(0, 100) <=50 then + core.add_particlespawner(particlespawner_def2) + else + core.add_particlespawner(particlespawner_def) + end + end +}) + +-- Generate bamboo tops after mineral waters biome generates decorations +Everness:register_lbm({ + -- Descriptive label for profiling purposes (optional). + -- Definitions with identical labels will be listed as one. + label = 'Generate bamboo tops after mineral waters biome generates decorations', + + -- Identifier of the LBM, should follow the modname: convention + name = 'everness:mineral_waters_bamboo_large', + + -- List of node names to trigger the LBM on. + -- Names of non-registered nodes and groups (as group:groupname) + -- will work as well. + nodenames = { 'everness:bamboo_3' }, + + -- Whether to run the LBM's action every time a block gets activated, + -- and not only the first time the block gets activated after the LBM + -- was introduced. + run_at_every_load = true, + + -- Function triggered for each qualifying node. + -- `dtime_s` is the in-game time (in seconds) elapsed since the block + -- was last active + action = function(pos, node, dtime_s) + if core.get_node(vector.new(pos.x, pos.y + 1, pos.z)).name ~= 'air' then + return + end + + local node_below = core.get_node(vector.new(pos.x, pos.y - 1, pos.z)) + + -- Get bamboo height + local while_counter = 1 + local bamboo_height = 0 + local bamboo_below = node_below + + while bamboo_below.name == 'everness:bamboo_3' do + bamboo_below = core.get_node(vector.new(pos.x, pos.y - while_counter, pos.z)) + bamboo_height = bamboo_height + 1 + while_counter = while_counter + 1 + end + + -- Add top bamboo nodes with leaves based on their generated height + if bamboo_height > 4 then + for i = 1, 3 do + local pos_i = vector.new(pos.x, pos.y + i, pos.z) + + if core.get_node(pos_i).name == 'air' then + if i == 1 then + core.set_node(pos_i, { + name = 'everness:bamboo_4', + param2 = node_below.param2 + }) + else + core.set_node(pos_i, { + name = 'everness:bamboo_5', + param2 = node_below.param2 + }) + end + end + end + else + for i = 1, 2 do + local pos_i = vector.new(pos.x, pos.y + i, pos.z) + + if core.get_node(pos_i).name == 'air' then + if i == 1 then + core.set_node(pos_i, { + name = 'everness:bamboo_4', + param2 = node_below.param2 + }) + else + core.set_node(pos_i, { + name = 'everness:bamboo_5', + param2 = node_below.param2 + }) + end + end + end + end + end +}) + +-- Activate timers on lotus flowers +Everness:register_lbm({ + -- Descriptive label for profiling purposes (optional). + -- Definitions with identical labels will be listed as one. + label = 'Activate timers on lotus flowers', + + -- Identifier of the LBM, should follow the modname: convention + name = 'everness:everness_lotus_flower_timers', + + -- List of node names to trigger the LBM on. + -- Names of non-registered nodes and groups (as group:groupname) + -- will work as well. + nodenames = { + 'everness:lotus_flower_white', + 'everness:lotus_flower_purple', + 'everness:lotus_flower_pink' + }, + + -- Whether to run the LBM's action every time a block gets activated, + -- and not only the first time the block gets activated after the LBM + -- was introduced. + run_at_every_load = true, + + -- Function triggered for each qualifying node. + -- `dtime_s` is the in-game time (in seconds) elapsed since the block + -- was last active + action = function(pos, node, dtime_s) + local timer = core.get_node_timer(pos) + + if not timer:is_started() then + core.get_node_timer(pos):start(1) + end + end +}) + +-- Spread lotus flowers and leafs around them +Everness:register_abm({ + label = 'everness:lotus_flowers_and_leaves_spread', + description = 'Spreads lotus flowers and leaves.', + nodenames = { + 'everness:lotus_flower_white', + 'everness:lotus_flower_purple', + 'everness:lotus_flower_pink', + 'everness:lotus_leaf', + 'everness:lotus_leaf_2', + 'everness:lotus_leaf_3' + }, + neighbors = { + 'everness:lotus_flower_white', + 'everness:lotus_flower_purple', + 'everness:lotus_flower_pink', + 'everness:lotus_leaf', + 'everness:lotus_leaf_2', + 'everness:lotus_leaf_3' + }, + max_y = Everness.settings.biomes.everness_mineral_waters.y_max, + min_y = Everness.settings.biomes.everness_mineral_waters.y_min, + interval = 13, + chance = 300, + action = function(pos, node) + if not is_player_nearby(pos, 48) then + return + end + + local under = core.get_node(vector.new(pos.x, pos.y - 1, pos.z)) + local def = core.registered_nodes[under.name] or {} + + if def.liquidtype ~= 'source' and core.get_item_group(under.name, 'water') == 0 then + return + end + + local light = core.get_node_light(pos) + + if not light or light < 13 then + return + end + + local pos0 = { x = pos.x - 3, y = pos.y - 1, z = pos.z - 3 } + local pos1 = { x = pos.x + 3, y = pos.y + 1, z = pos.z + 3 } + local flower_node_names = { + 'everness:lotus_flower_white', + 'everness:lotus_flower_purple', + 'everness:lotus_flower_pink' + } + local leaf_node_names = { + 'everness:lotus_leaf', + 'everness:lotus_leaf_2', + 'everness:lotus_leaf_3' + } + local node_name = flower_node_names[math.random(1, #flower_node_names)] + local found_flower_positions = core.find_nodes_in_area(pos0, pos1, flower_node_names) + + -- Threshold of 1 results in an appropriate density + if #found_flower_positions > 1 then + -- Spread leaves around random nearby flower + local rand_flower_pos = found_flower_positions[math.random(1, #found_flower_positions)] + pos0 = { x = rand_flower_pos.x - 3, y = rand_flower_pos.y - 1, z = rand_flower_pos.z - 3 } + pos1 = { x = rand_flower_pos.x + 3, y = rand_flower_pos.y + 1, z = rand_flower_pos.z + 3 } + local found_leaf_positions = core.find_nodes_in_area(pos0, pos1, leaf_node_names) + + if #found_leaf_positions > 15 then + return + end + + node_name = leaf_node_names[math.random(1, #leaf_node_names)] + end + + local water_positions = core.find_nodes_in_area_under_air(pos0, pos1, 'group:water') + if #water_positions == 0 then + return + end + + -- Pick a random water position directly (avoids expensive table.sort) + local candidates = {} + for _, p in ipairs(water_positions) do + local n = core.get_node(p) + local d = core.registered_nodes[n.name] + if d and d.liquidtype == 'source' then + candidates[#candidates + 1] = p + end + end + + if #candidates == 0 then + return + end + + local water_pos = candidates[math.random(1, #candidates)] + local water_above = vector.new(water_pos.x, water_pos.y + 1, water_pos.z) + light = core.get_node_light(water_above) + + if light and light >= 13 then + core.set_node(water_above, { name = node_name }) + end + end +}) + +-- +-- Lavacooling +-- + +-- Override lava cooling to include some variations of obsidian +core.register_on_mods_loaded(function() + for _, abm in pairs(core.registered_abms) do + if abm.label == 'Lava cooling' and abm.action ~= nil then + local prev_cool_lava_action = abm.action + + table.insert_all(abm.nodenames, { 'everness:lava_source', 'everness:lava_flowing' }) + + abm.action = function(pos, node, dtime_s) + Everness.cool_lava(pos, node, dtime_s, prev_cool_lava_action) + end + end + end +end) + +-- Calculates `everness:hammer_sharp` wear when crafting +core.register_craft_predict(function(itemstack, player, old_craft_grid, craft_inv) + if itemstack and itemstack:get_name() == 'everness:hammer_sharp' then + local stack_meta = itemstack:get_meta() + local hammers = 0 + local wear_total = 0 + + for k, stack in pairs(old_craft_grid) do + if stack:get_name() == 'everness:hammer' then + local meta = stack:get_meta() + wear_total = wear_total + meta:get_int('everness_wear') + hammers = hammers + 1 + end + end + + local average_wear = wear_total / hammers + + stack_meta:set_int('everness_wear', math.ceil(average_wear)) + + -- Draw wear bar texture overlay + if average_wear > 0 then + Everness.draw_wear_bar(itemstack, average_wear) + end + + return itemstack + end +end) + +-- Calculates `everness:hammer_sharp` wear when crafting +core.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if itemstack and itemstack:get_name() == 'everness:hammer_sharp' then + local stack_meta = itemstack:get_meta() + local hammers = 0 + local wear_total = 0 + + for k, stack in pairs(old_craft_grid) do + if stack:get_name() == 'everness:hammer' then + local meta = stack:get_meta() + wear_total = wear_total + meta:get_int('everness_wear') + hammers = hammers + 1 + end + end + + local average_wear = wear_total / hammers + + stack_meta:set_int('everness_wear', math.ceil(average_wear)) + + -- Draw wear bar texture overlay + if average_wear > 0 then + Everness.draw_wear_bar(itemstack, average_wear) + end + + return itemstack + end +end) diff --git a/mods/everness/init.lua b/mods/everness/init.lua new file mode 100644 index 0000000..4448ea6 --- /dev/null +++ b/mods/everness/init.lua @@ -0,0 +1,271 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local path = core.get_modpath('everness') +local mod_start_time = core.get_us_time() + +dofile(path .. '/api.lua') + +-- Legacy backwards compatibility +core.register_alias('everness:dirt_with_grass_2', 'everness:dirt_with_grass_1') +core.register_alias('everness:path_dirt_with_grass_2', 'everness:path_dirt_with_grass_1') + +-- MineClonia / VoxeLibre support +local is_mcl = core.get_modpath('mcl_core') and core.global_exists('mcl_core') +if is_mcl then + dofile(path .. '/mod_support_mcl_aliases.lua') +end +dofile(path .. '/nodes.lua') +dofile(path .. '/nodes_farming.lua') +if Everness.settings.biomes.everness_mineral_waters_under.enabled then + dofile(path .. '/nodes_mineral_waters_under.lua') +end +dofile(path .. '/bamboo.lua') +dofile(path .. '/functions.lua') +dofile(path .. '/trees.lua') +dofile(path .. '/vines.lua') +dofile(path .. '/vines_wall.lua') +dofile(path .. '/chests.lua') +dofile(path .. '/torches.lua') + +dofile(path .. '/mapgen.lua') + +if Everness.settings.biomes.everness_bamboo_forest_under.enabled then + dofile(path .. '/mapgen_bamboo_forest_under.lua') +end + +if Everness.settings.biomes.everness_bamboo_forest.enabled then + dofile(path .. '/mapgen_bamboo_forest.lua') +end + +if Everness.settings.biomes.everness_baobab_savanna.enabled then + dofile(path .. '/mapgen_baobab_savanna.lua') +end + +if Everness.settings.biomes.everness_coral_forest_dunes.enabled then + dofile(path .. '/mapgen_coral_forest_dunes.lua') +end + +if Everness.settings.biomes.everness_coral_forest_ocean.enabled then + dofile(path .. '/mapgen_coral_forest_ocean.lua') +end + +if Everness.settings.biomes.everness_coral_forest_deep_ocean.enabled then + dofile(path .. '/mapgen_coral_forest_deep_ocean.lua') +end + +if Everness.settings.biomes.everness_coral_forest_under.enabled then + dofile(path .. '/mapgen_coral_forest_under.lua') +end + +if Everness.settings.biomes.everness_coral_forest.enabled then + dofile(path .. '/mapgen_coral_forest.lua') +end + +if Everness.settings.biomes.everness_crystal_forest_dunes.enabled then + dofile(path .. '/mapgen_crystal_forest_dunes.lua') +end + +if Everness.settings.biomes.everness_crystal_forest_ocean.enabled then + dofile(path .. '/mapgen_crystal_forest_ocean.lua') +end + +if Everness.settings.biomes.everness_crystal_forest_deep_ocean.enabled then + dofile(path .. '/mapgen_crystal_forest_deep_ocean.lua') +end + +if Everness.settings.biomes.everness_crystal_forest_shore.enabled then + dofile(path .. '/mapgen_crystal_forest_shore.lua') +end + +if Everness.settings.biomes.everness_crystal_forest_under.enabled then + dofile(path .. '/mapgen_crystal_forest_under.lua') +end + +if Everness.settings.biomes.everness_crystal_forest.enabled then + dofile(path .. '/mapgen_crystal_forest.lua') +end + +if Everness.settings.biomes.everness_cursed_lands_dunes.enabled then + dofile(path .. '/mapgen_cursed_lands_dunes.lua') +end + +if Everness.settings.biomes.everness_cursed_lands_ocean.enabled then + dofile(path .. '/mapgen_cursed_lands_ocean.lua') +end + +if Everness.settings.biomes.everness_cursed_lands_deep_ocean.enabled then + dofile(path .. '/mapgen_cursed_lands_deep_ocean.lua') +end + +if Everness.settings.biomes.everness_cursed_lands_swamp.enabled then + dofile(path .. '/mapgen_cursed_lands_swamp.lua') +end + +if Everness.settings.biomes.everness_cursed_lands_under.enabled then + dofile(path .. '/mapgen_cursed_lands_under.lua') +end + +if Everness.settings.biomes.everness_cursed_lands.enabled then + dofile(path .. '/mapgen_cursed_lands.lua') +end + +if Everness.settings.biomes.everness_forsaken_desert_ocean.enabled then + dofile(path .. '/mapgen_forsaken_desert_ocean.lua') +end + +if Everness.settings.biomes.everness_forsaken_desert_under.enabled then + dofile(path .. '/mapgen_forsaken_desert_under.lua') +end + +if Everness.settings.biomes.everness_forsaken_desert.enabled then + dofile(path .. '/mapgen_forsaken_desert.lua') +end + +if Everness.settings.biomes.everness_forsaken_tundra_beach.enabled then + dofile(path .. '/mapgen_forsaken_tundra_beach.lua') +end + +if Everness.settings.biomes.everness_forsaken_tundra_ocean.enabled then + dofile(path .. '/mapgen_forsaken_tundra_ocean.lua') +end + +if Everness.settings.biomes.everness_forsaken_tundra_under.enabled then + dofile(path .. '/mapgen_forsaken_tundra_under.lua') +end + +if Everness.settings.biomes.everness_forsaken_tundra.enabled then + dofile(path .. '/mapgen_forsaken_tundra.lua') +end + +if Everness.settings.biomes.everness_frosted_icesheet_ocean.enabled then + dofile(path .. '/mapgen_frosted_icesheet_ocean.lua') +end + +if Everness.settings.biomes.everness_frosted_icesheet_under.enabled then + dofile(path .. '/mapgen_frosted_icesheet_under.lua') +end + +if Everness.settings.biomes.everness_frosted_icesheet.enabled then + dofile(path .. '/mapgen_frosted_icesheet.lua') +end + +if Everness.settings.biomes.everness_mineral_waters.enabled then + dofile(path .. '/mapgen_mineral_waters.lua') +end + +if Everness.settings.biomes.everness_mineral_waters_under.enabled then + dofile(path .. '/mapgen_mineral_waters_under.lua') +end + +if core.register_mapgen_script then + Everness.async_mapgen_active = true + core.register_mapgen_script(path .. '/mapgen_async.lua') +else + Everness.async_mapgen_active = false +end + +dofile(path .. '/mapgen_after.lua') + +if is_mcl then + dofile(path .. '/mod_support_mcl.lua') +else + if core.get_modpath('xpanes') and core.global_exists('xpanes') then + dofile(path .. '/panes.lua') + end + + local enable_moreblocks = Everness.settings.features.everness_enable_moreblocks + and (core.get_modpath('moreblocks') or core.get_modpath('stairsplus')) + and core.global_exists('stairsplus') + + if enable_moreblocks then + dofile(path .. '/mod_support_moreblocks.lua') + elseif core.get_modpath('stairs') and core.global_exists('stairs') then + dofile(path .. '/stairs.lua') + end + + if core.get_modpath('walls') and core.global_exists('walls') then + dofile(path .. '/walls.lua') + end + + if core.get_modpath('default') or core.global_exists('default') then + if default.register_fence + and default.register_fence_rail + and default.register_mesepost + then + dofile(path .. '/fences.lua') + end + end + + if core.get_modpath('doors') and core.global_exists('doors') then + dofile(path .. '/doors.lua') + end +end + +if not core.get_modpath('bucket') and not core.get_modpath('mcl_buckets') then + dofile(path .. '/buckets.lua') +end + +dofile(path .. '/tools.lua') +dofile(path .. '/craftitems.lua') +dofile(path .. '/crafting.lua') + +if Everness.settings.features.everness_feature_skybox then + dofile(path .. '/skybox.lua') +end + +dofile(path .. '/env_sounds.lua') + +if Everness.settings.features.everness_feature_sneak_pickup and not core.get_modpath('mcl_core') then + dofile(path .. '/sneak_pickup.lua') +end + +dofile(path .. '/privileges.lua') +dofile(path .. '/chat_commands.lua') + +Everness:encyclopedia_init() + +core.register_on_mods_loaded(function() + Everness.set_loot_chest_items() +end) + +-- +-- Mod Support +-- + +if core.get_modpath('x_farming') and core.global_exists('x_farming') then + dofile(path .. '/mod_support_x_farming.lua') +end + +if core.get_modpath('x_tumbleweed') and core.global_exists('XTumbleweed') then + dofile(path .. '/mod_support_x_tumbleweed.lua') +end + +if core.get_modpath('x_obsidianmese') + and core.global_exists('x_obsidianmese') + -- backwards compatibility check + and x_obsidianmese.register_path_node +then + dofile(path .. '/mod_support_x_obsidianmese.lua') +end + + +-- Minetest Game +dofile(path .. '/mod_support_mtg.lua') + +local mod_end_time = (core.get_us_time() - mod_start_time) / 1000000 + +print('[Mod] everness loaded.. [' .. mod_end_time .. 's]') diff --git a/mods/everness/locale/everness.fr.tr b/mods/everness/locale/everness.fr.tr new file mode 100644 index 0000000..c7ef30a --- /dev/null +++ b/mods/everness/locale/everness.fr.tr @@ -0,0 +1,621 @@ +# textdomain: everness +@1 will intersect protection on growth.= +Compost chance= +Everness Encyclopedia= +You need "everness_encyclopedia" privilige to access this button.= +Empty Bucket= +Get biome name where you are standing.= +This command can only be executed in-game!= +Locked Chest= +Locked Chest (owned by @1)= +You do not own this chest.= +a locked chest= +Chest= +Quartz Crystal=Cristal de Quartz +Baobab Roasted Fruit=Fruit de Baobab Rôti +Pyrite Ingot=Lingot de Pyrite +Pyrite Lump=Morceau de Pyrite +Bamboo=Bambou +Hunger= +Coconut= +Coral Wood Fence Gate= +Lava Tree Wood Door= +Lava Tree Wood Trapdoor= +Lava Tree Wood Fence Gate= +Bamboo Wood Fence Gate=Portillon en bois de bambou +Crystal Wood Fence Gate= +Palm Wood Fence Gate= +Bamboo Door=Porte en Bambou +Bamboo Trapdoor=Trappe en Bambou +Bone Pyrit Door=Porte en os de pyrite +Willow Door=Porte en Saule +Crystal Wood Door= +Crystal Wood Trapdoor= +Cursed Wood Door= +Cursed Wood Trapdoor= +Palm Wood Door= +Palm Wood Trapdoor= +Dry Wood Fence Rail=Rail de clôture en bois sec +Dry Wood Mese Post Light=Lampadaire de Mese en bois sec +Bamboo Wood Fence Rail=Rail de clôture en bois de bambou +Bamboo Wood Mese Post Light=Lampadaire de Mese en bois de bambou +Crystal Wood Fence Rail= +Crystal Wood Mese Post Light= +Palm Wood Fence Rail= +Palm Wood Mese Post Light= +Coral Wood Fence= +Coral Wood Fence Rail= +Coral Wood Mese Post Light= +Lava Tree Wood Fence= +Lava Tree Wood Fence Rail= +Lava Tree Wood Mese Post Light= +Dry Wood Fence=Clôture en bois sec +Bamboo Wood Fence=Clôture en bois de bambou +Crystal Wood Fence= +Palm Wood Fence= +Dry Wood Fence Gate= +Coral Desert Stone Stair= +Coral Desert Stone Slab= +Double Coral Desert Stone Slab= +Coral Desert Cobblestone Stair= +Coral Desert Cobblestone Slab= +Double Coral Desert Cobblestone Slab= +Coral Mossy Cobblestone Stair= +Coral Mossy Cobblestone Slab= +Double Coral Mossy Cobblestone Slab= +Cursed Brick Stair= +Cursed Brick Slab= +Double Cursed Brick Slab= +Cursed Brick with Growth Stair= +Cursed Brick with Growth Slab= +Double Cursed Brick with Growth Slab= +Double Coral Bones Block Slab= +Double Coral Bones Brick Slab= +Double Quartz Block Slab= +Double Quartz Chiseled Slab= +Double Quartz Pillar Slab= +Double Dry Wood Slab= +Double Coral Wood Slab= +Double Bamboo Wood Slab= +Double Bamboo Mosaic Wood Slab= +Double Forsaken Desert Brick Slab= +Double Forsaken Desert Brick Red Slab= +Double Forsaken Desert Chiseled Stone Slab= +Double Baobab Wood Slab= +Double Sequoia Wood Slab= +Double Forsaken Tundra Cobblestone Slab= +Double Forsaken Tundra Stone Slab= +Double Forsaken Tundra Brick Slab= +Double Willow Wood Slab= +Double Magma Cobblestone Slab= +Double Volcanic Rock Slab= +Double Volcanic Rock with Magma Slab= +Double Coral Depp Ocean Sandstone Block Slab= +Double Coral Depp Ocean Sandstone Brick Slab= +Double Coral White Sandstone Slab= +Double Coral White Sandstone Pillar Slab= +Double Coral White Sandstone Brick Slab= +Double Coral Desert Stone Block Slab= +Double Coral Desert Stone Brick Slab= +Double Coral Sandstone Slab= +Double Coral Sandstone Brick Slab= +Double Coral Sandstone Chiseled Slab= +Double Coral Sandstone Carved Slab= +Double Cursed Lands Deep Ocean Sandstone Block Slab= +Double Cursed Lands Deep Ocean Sandstone Brick Slab= +Double Crystal Forest Deep Ocean Sandstone Block Slab= +Double Crystal Forest Deep Ocean Sandstone Brick Slab= +Double Crystal Cobblestone Slab= +Double Crystal Mossy Cobblestone Slab= +Double Crystal Stone Brick Slab= +Double Crystal Wood Slab= +Double Mese Wood Slab= +Double= +A bucket can be used to collect and release liquids. This one is filled with mineral water.= +Place it to empty the bucket and create a mineral water source.= +Places a mineral water source= +Bucket= +Water= +Coral Cobblestone Wall=Mur de pavés coraliens +Coral Mossy Cobblestone Wall=Mur de pavés coraliens moussus +Cursed Brick Wall=Mur de briques maudites +Cursed Brick with Growth Wall= +Forsaken Tundra Cobblestone Wall=Mur de pavés de toundra abandonnée +Forsaken Tundra Stone Wall=Mur de pierre de toundra abandonnée +Forsaken Tundra Brick Wall=Mur de briques de toundra abandonnée +Magma Cobblestone Wall=Mur de pavé magmatique +Volcanic Rock Wall=Mur de roches volcaniques +Volcanic Rock with Magma Wall=Mur de roches volcaniques avec du magma +Lava Bucket= +Mineral= +Coal Ore= +Pyrite Ore=Minerai de pyrite +Ceramic Sherds. Use archeological pickaxe to have a chance of getting various different sherds.= +Ceramic Sherds= +Pyrite Block=Bloc de pyrite +Forged Pyrite Block=Bloc de pyrite forgé +Pyrite Brick=Brique de pyrite +Pyrite Slab Brick=Dalle de brique de pyrite +Pyrite Spiral=Spirale de pyrite +Pyrite Pillar Bottom=Pied de pilier en pyrite +Pyrite Pillar Middle=Colonne de pilier en pyrite +Pyrite Pillar Top=Tête de pilier en pyrite +Pyrite Pillar Small=Petit pilier en pyrite +Polished Pyrite Block=Bloc de pyrite poli +Quartz Ore=Minerai de quartz +Coral Desert Stone=Pierre de désert coralien +Crystal Stone= +Coral Sandstone= +Coral Sandstone Brick= +Coral Sandstone Chiseled Block= +Coral Sandstone Carved Block= +Coral White Sandstone= +Coral White Sandstone Brick= +Coral White Sandstone Pillar= +Coral Desert Stone Block= +Coral Desert Stone Brick= +Coral Bones=Os coraliens +Coral Bones Block= +Coral Bones Brick= +Crystal Cobblestone= +Crystal Mossy Cobblestone= +Crystal Stone Brick= +Coral Desert Cobblestone=Pavé de désert coralien +Coral Mossy Cobblestone=Pavé de mousse coralienne +Coral Desert Stone with Moss=Pierre de désert coralien avec de la mousse +Coral Deep Ocean Sandstone Block= +Coral Deep Ocean Sandstone Brick= +Cursed Lands Deep Ocean Sandstone Block= +Cursed Lands Deep Ocean Sandstone Brick= +Crystal Forest Deep Ocean Sandstone Block= +Crystal Forest Deep Ocean Sandstone Brick= +Forsaken Desert Stone=Pierre de désert abandonné +Forsaken Desert Cobblestone Red=Pavé rouge de désert abandonné +Forsaken Desert Cobblestone=Pavé de désert abandonné +Volcanic Rock=Roche volcanique +Volcanic Rock with Magma=Roche volcanique avec du magma +Cursed Stone=Pierre maudite +Cursed Stone Carved= +Cursed Brick=Brique maudite +Cursed Brick with Growth= +Cursed Brick Mixed= +Cursed Brick Carved= +Volcanic Sulfur Stone=Pierre volcanique sulfurée +Sulfur Stone=Pierre de soufre +Forsaken Tundra Cobblestone=Pavé de toundra abandonnée +Forsaken Tundra Stone=Pierre de toundra abandonnée +Mold Cobble=Galet de moule +Forsaken Tundra Brick=Brique de toundra abandonnée +Forsaken Tundra Rocks=Roche de toundra abandonnée +Blue Crying Obsidian=Obsidienne pleureuse bleue +Blue Weeping Obsidian=Obsidienne larmoyante bleue +Weeping Obsidian=Obsidienne larmoyante +Mold Stone=Pierre de moule +Soul Sandstone=Grès des âmes +Soul Sandstone Veined=Grès des âmes veiné +Purple Crystal Block=Bloc de cristal pourpre +Orange Crystal Block=Bloc de cristal orange +Cyan Crystal Block= +Quartz Block=Bloc de quartz +Chiseled Quartz=Quartz ciselé +Quartz Pillar=Pilier de quartz +Forsaken Desert Brick=Brique de désert abandonné +Forsaken Desert Brick Red=Brique rouge de désert abandonné +Forsaken Desert Engraved Stone=Pierre gravée de désert abandonné +Crystal Sandstone= +Crystal Sandstone Brick= +Crystal Sandstone Chiseled= +Cursed Sandstone Block= +Cursed Sandstone Brick= +Coral Dirt=Terre coralienne +Coral Deep Ocean Mud= +Cursed Dirt=Terre maudite +Crystal Dirt=Terre de cristal +Forsaken Tundra Dirt=Terre de toundra abandonnée +Forsaken Tundra Dirt with Grass=Terre de toundra abandonnée avec de l'herbe +Dirt with Coral Grass=Terre avec de l'herbe coralienne +Dirt with Cursed Grass=Terre avec de l'herbe maudite +Dirt with Crystal Grass=Terre avec de l'herbe de cristal +Dry Ocean Dirt=Terre de l'océan sec +Gravel= +Permanent Fire= +Dirt=Terre +Dry Dirt= +Dirt with Dry Grass= +Dirt with Grass=Terre avec de l'herbe +Crystal Cave Dirt=Terre de caverne de cristal +Crystal Cave Dirt with Moss=Terre de caverne de cristal avec de l'herbe +Moss Block=Bloc de mousse +Crystal Moss Block=Bloc de mousse de cristal +Coral Sand=Sable coralien +Coral White Sand=Sable coralien blanc +Cursed Sand=Sable maudit +Crystal Sand=Sable de cristal +Crystal Forest Deep Ocean Sand with Crack= +Forsaken Tundra Beach Sand=Sable de plage de toundra abandonnée +Forsaken Tundra Beach Sand with Shells=Sable de plage de toundra abandonnée avec des coquillages +Forsaken Desert Sand=Sable de désert abandonné +Coral Forest Deep Ocean Sand= +Cursed Lands Deep Ocean Sand= +Cursed Lands Deep Ocean Sand with Crack= +Crystal Forest Deep Ocean Sand= +Mineral Sand= +Frosted Snow Block=Bloc de neige givré +Frosted Ice=Glace givrée +Frosted Ice Translucent=Glace givrée transparente +Frosted Cave Ice=Glace de caverne givrée +Bone=Os +Ancient Emerald Ice=Glace d'émeraude ancienne +Dense Emerald Ice=Glace d'émeraude dense +Emerald Ice=Glace d'émeraude +Cursed Mud=Boue maudite +Cobweb=Toile d'araignée +Cave Flower=Fleur des cavernes +Cave Flower with Particles=Fleur des cavernes avec particules +Lotus= +Flower= +Animated= +Leaf= +Dry= +Forsaken Fire=Feu abandonné +Coral Tree Trunk=Tronc d'arbre coralien +Coral Wood Planks= +Coral Tree Bioluminescent=Arbre coralien luminescent +Cursed Dream Stone=Pierre de rêve maudite +Dry Tree Trunk=Tronc d'arbre sec +Baobab Tree Trunk=Tronc de Baobab +Sequoia Tree Trunk=Tronc de Séquoia +Willow Tree Trunk=Tronc de Saule +Willow Wood Planks=Planches en bois de saule +Dry Wood Planks=Planches en bois sec +Hollow Tree Trunk=Tronc d'arbre creux +Crystal Tree Trunk=Tronc d'arbre de cristal +Crystal Wood Planks= +Mese Tree Trunk=Tronc d'arbre à Mese +Trunk= +Mese Tree Leaves= +Baobab Tree Leaves=Feuilles de Baobab +Sequoia Tree Leaves=Feuilles de Séquoia +Baobab Fruit=Fruit du Baobab +Baobab Fruit Marker=Marqueur du fruit du Baobab +Baobab Sapling=Plant de Baobab +Willow Tree Leaves=Feuilles de saule +Coral Tree Leaves=Feuille d'arbre coralien +Dry Tree Branches=Branches d'arbre sec +Crystal Tree Leaves=Feuille d'arbre de cristal +Coral Tree Sapling=Plant d'arbre coralien +Coral Tree Bioluminescent Sapling=Plant d'arbre coralien luminescent +Dry Tree Sapling=Plant d'arbre sec +Cursed Dream Tree Sapling=Plant d'arbre des rêves maudit +Willow Tree Sapling= +Sequoia Tree Sapling=Plant de Séquoia +Crystal Tree Sapling=Plant d'arbre de cristal +Crystal Tree Large Sapling=Grand plant d'arbre de cristal +Crystal Bush Stem=Tige de buisson de cristal +Crystal Bush Leaves=Feuilles de buisson de cristal +Crystal Bush Sapling=Plant de buisson de cristal +Cursed Bush Stem=Tige de buisson maudit +Cursed Bush Leaves=Feuilles de buisson maudit +Cursed Bush Sapling=Plant de buisson maudit +Flowers= +Magenta Flowers= +Clover= +Luminous Mushroom= +Glossy Mushroom= +Staghorn Coral (Stage 1)= +Staghorn Coral (Stage 2)= +Staghorn Coral (Stage 3)= +Clover with flowers= +Aurora Violet= +Aurora Sky Blue= +Aurora Cyan= +Aurora Mint= +Aurora Lavender= +Aurora Lime= +Aurora Coral= +Aurora Magenta= +Glass Crystal Cluster= +Glass Megalith Foundation= +Glass Megalith Lower Shaft= +Glass Megalith Mid Nexus= +Glass Megalith Upper Spire= +Glass Megalith Summit Needle= +Coral Burdock=Bardane coralienne +Coral Bush=Buisson coralien +Coral Shrub=Arbuste coralien +Orange Coral Grass=Herbe coralienne orange +Globulagus=Eucalyptus Globulus +Tall Coral Grass=Grande Herbe coralienne +Purple Crystal=Cristal pourpre +Orange Crystal=Cristal orange +Cyan Crystal=Cristal cyan +Coral Plant Bioluminescent=Plante coralienne bioluminescente +Blooming Cooksonia=Cooksonia en fleur +Creeping Moss Spores=Spores de mousse grimpante +Frosted Icicle=Glaçon givré +Frosted Icicle Floor=Sol de glaçon givré +Coral Grass=Herbe coralienne +Baobab Savanna Grass= +Red Castor=Ricin rouge +Crystal Mushrooms=Champigons de cristal +Twisted Crystal Grass=Herbe de cristal tordue +Twisted Crystal Spire= +Crystal Grass=Herbe de cristal +Marsh Grass=Herbe des marais +Forsaken Plant=Plante abandonnée +Blue Cactus=Cactus bleu +Cave Barrel Cactus=Cactus baril des cavernes +Venus Trap Plant=Dionée attrape-mouche +Illumi Root=Illumi Racine +Crystal Waterlily=Nénuphar de cristal +Orange Cactus=Cactus orange +Agave Leaf=Feuille d'agave +Mese Fruit= +Mese Tree Sapling= +Egg plant=Aubergine +Ivis Moss=Mousse d'Ivis +Ngrass=N-Herbe +Bamboo Sprout=Pousse de bambou +Blood Spoore Plant=Plante spore sanglante +Blood Spoore Plant Small=Petite plante spore sanglante +Termite Block=Bloc de termitière +Bamboo Block=Bloc de bambou +Bamboo Planks=Planches de bambou +Bamboo Mosaic=Mosaïque de bambou +Baobab Wood Planks=Planches en bois de Baobab +Sequoia Wood Planks=Planches en bois de Séquoia +Mese Wood Planks= +Coral Corals=Coraux coraliens +Coral Frosted=Givré coralien +Coral Starfish=Étoile de mer coralienne +Spine Kelp=Varch épineux +Coral Bulbs= +Coral Tree= +Coral Palm= +Coral Anemone= +Coral Darkilluma= +Coral Demon= +Crystal Forest Deep Ocean Coral Plant Cyan= +Crystal Forest Deep Ocean Coral Plant Orange= +Crystal Forest Deep Ocean Coral Plant Pink= +Crystal Coral Dark=Cristal coralien sombre +Crystal Coral Light=Cristal coralien clair +Coral Forest Deep Ocean Coral Pink= +Coral Forest Deep Ocean Coral Cyan= +Coral Forest Deep Ocean Coral Green= +Coral Forest Deep Ocean Coral Red= +Coral Alcyonacea= +Coral Ostracod= +Coral Octocurse= +Crystal Forest Deep Ocean Coral Green= +Crystal Forest Deep Ocean Coral Orange= +Crystal Forest Deep Ocean Coral Cyan= +Coral Skeleton= +Mineral Water Weed= +Skull with Candle=Squelette avec bougie +Forsythia Bush=Buisson de Forsythia +Rose Bush= +Glowing Pillar=Pilier rayonnant +Blue Vine Lantern=Lanterne de vigne bleue +Amaranita Lantern=Lanterne Amarante +Lumecorn=Blé luminescent +Everness Glass= +Tinted Glass Red=Verre teinté rouge +Pyrite Lantern=Lanterne en pyrite +Pyrite Glass=Verre de pyrite +Lumabus Vine Lantern=Lanterne de vigne luminescente +Eye Vine Lantern=Lanterne de vigne oculaire +Cursed Pumpkin Lantern=Lanterne citrouille maudite +Floating Crystal=Cristal flottant +Coral Forest Deep Ocean Lantern= +Mineral Water Source= +Flowing Mineral Water= +Lava Source= +Flowing Lava= +Geyser= +Active= +Ceramic= +Pot= +If destroyed by archelogical pick axe, it will drop ceramic sherds instead of ceramic pot item.= +owned by= +Sherd= +Sand= +Castle= +Wall= +Purple= +Green= +Red= +Blue= +Yellow= +Magenta= +Cyan= +White= +Cursed Skeleton Hands= +Cursed Rib Cage= +Cursed Skull on Stick= +Coral Dirt Soil= +Dirt Soil= +Crystal Dirt Soil= +Crystal Cave Dirt Soil= +Cursed Dirt Soil= +Dry Dirt Soil= +Coral Dirt Wet Soil= +Crystal Dirt Wet Soil= +Crystal Cave Dirt Wet Soil= +Cursed Dirt Wet Soil= +Mineral Cave Stone= +Mineral Cave Cobblestone= +Mineral Lava Stone with lava= +Mineral Lava Stone without lava= +Mineral Lava Stone with moss= +Volcanic Spike= +Mineral Lava Stone Spike= +Lava Tree Trunk= +Lava Tree Trunk with Lava Veins= +Lava Tree Wood Planks= +Lava= +Mineral Cave Moss Grass= +Sapling= +Leaves= +Pyrite Glass Pane=Panneau de verre de pyrite +Cursed Steel Bars= +Cursed Steel Bar Door= +Steel Bar Trapdoor= +Dry Tree Trunk Stair= +Dry Tree Trunk Slab= +Forsaken Desert Engraved Stone Stair= +Forsaken Desert Engraved Stone Slab= +Forsaken Desert Cobblestone Stair= +Forsaken Desert Cobblestone Slab= +Forsaken Desert Cobblestone Red Stair= +Forsaken Desert Cobblestone Red Slab= +Everness Glass Stair= +Everness Glass Slab= +Mineral Cave Stone Stair= +Mineral Cave Stone Slab= +Mineral Cave Cobblestone Stair= +Mineral Cave Cobblestone Slab= +Mineral Lava Stone with lava Stair= +Mineral Lava Stone with lava Slab= +Mineral Lava Stone without lava Stair= +Mineral Lava Stone without lava Slab= +Coral Bones Block Stair= +Coral Bones Block Slab= +Coral Bones Brick Stair= +Coral Bones Brick Slab= +Quartz Block Stair=Escalier en bloc de quartz +Quartz Block Slab=Dalle en bloc de quartz +Quartz Chiseled Stair=Escalier en quartz ciselé +Quartz Chiseled Slab=Dalle en quartz ciselé +Quartz Pillar Stair=Escalier en pilier de quartz +Quartz Pillar Slab=Dalle en pilier de quarte +Dry Wood Stair=Escalier en bois sec +Dry Wood Slab=Dalle en bois sec +Coral Wood Stair= +Coral Wood Slab= +Bamboo Wood Stair=Escalier en bois de bambou +Bamboo Wood Slab=Dalle en bois de bambou +Bamboo Mosaic Wood Stair=Escalier en mosaïque de bambou +Bamboo Mosaic Wood Slab=Dalle en mosaïque de bambou +Forsaken Desert Brick Stair=Escalier en brique de désert abandonné +Forsaken Desert Brick Slab=Dalle en brique de désert abandonné +Forsaken Desert Brick Red Stair=Escalier en brique rouge de désert abandonné +Forsaken Desert Brick Red Slab=Dalle en brique rouge de désert abandonné +Forsaken Desert Chiseled Stone Stair=Escalier en pierre ciselée de désert abandonné +Forsaken Desert Chiseled Stone Slab=Dalle en pierre ciselée de désert abandonné +Baobab Wood Stair=Escalier en bois de baobab +Baobab Wood Slab=Dalle en bois de baobab +Sequoia Wood Stair=Escalier en bois de Séquoia +Sequoia Wood Slab=Dalle en bois de Séquoia +Forsaken Tundra Cobblestone Stair=Escalier en pavé de toundra abandonnée +Forsaken Tundra Cobblestone Slab=Dalle en pavé de toundra abandonnée +Forsaken Tundra Stone Stair=Escalier en pierre de toundra abandonnée +Forsaken Tundra Stone Slab=Dalle en pierre de toundra abandonnée +Forsaken Tundra Brick Stair=Escalier en brique de toundra abandonnée +Forsaken Tundra Brick Slab=Dalle en brique de toundra abandonnée +Willow Wood Stair=Escalier en bois de saule +Willow Wood Slab=Dalle en bois de saule +Magma Cobblestone Stair=Escalier en pavé magmatique +Magma Cobblestone Slab=Dalle en pavé magmatique +Volcanic Rock Stair=Escalier en roche volcanique +Volcanic Rock Slab=Dalle en roche volcanique +Volcanic Rock with Magma Stair=Escalier en roche volcanique avec du magma +Volcanic Rock with Magma Slab=Dalle en roche volcanique avec du magma +Coral Depp Ocean Sandstone Block Stair= +Coral Depp Ocean Sandstone Block Slab= +Coral Depp Ocean Sandstone Brick Stair= +Coral Depp Ocean Sandstone Brick Slab= +Coral White Sandstone Stair= +Coral White Sandstone Slab= +Coral White Sandstone Pillar Stair= +Coral White Sandstone Pillar Slab= +Coral White Sandstone Brick Stair= +Coral White Sandstone Brick Slab= +Coral Desert Stone Block Stair= +Coral Desert Stone Block Slab= +Coral Desert Stone Brick Stair= +Coral Desert Stone Brick Slab= +Coral Sandstone Stair= +Coral Sandstone Slab= +Coral Sandstone Brick Stair= +Coral Sandstone Brick Slab= +Coral Sandstone Chiseled Stair= +Coral Sandstone Chiseled Slab= +Coral Sandstone Carved Stair= +Coral Sandstone Carved Slab= +Cursed Lands Deep Ocean Sandstone Block Stair= +Cursed Lands Deep Ocean Sandstone Block Slab= +Cursed Lands Deep Ocean Sandstone Brick Stair= +Cursed Lands Deep Ocean Sandstone Brick Slab= +Crystal Forest Deep Ocean Sandstone Block Stair= +Crystal Forest Deep Ocean Sandstone Block Slab= +Crystal Forest Deep Ocean Sandstone Brick Stair= +Crystal Forest Deep Ocean Sandstone Brick Slab= +Crystal Cobblestone Stair= +Crystal Cobblestone Slab= +Crystal Mossy Cobblestone Stair= +Crystal Mossy Cobblestone Slab= +Crystal Stone Brick Stair= +Crystal Stone Brick Slab= +Crystal Wood Stair= +Crystal Wood Slab= +Mese Wood Stair= +Mese Wood Slab= +Stair= +Slab= +Stone= +Cobblestone= +Block= +Brick= +Sandstone= +with Growth= +with Flower Growth= +Palm= +Wood= +Planks= +Tree= +Vine Shears=Cisailles à vigne +Silk Shovel= +Shell of Underwater Breating= +Hammer= +Sharp= +Torch= +Cave Vine=Vigne des cavernes +Whispering Gourd Vine=Gourde de vigne chuchotante +Bulb Vine=Vigne bulbeuse +Willow Vine=Vigne de saule +Eye Vine=Vigne oculaire +Lumabus Vine=Vigne luminescente +Ivis Vine=Vigne d'ivis +Flowered Vine=Vigne florissante +Reeds Vine=Vigne de roseaux +Tenanea Flowers Vine= +Twisted Vine=Vigne tordue +Golden Vine=Vigne d'or +Dense Vine=Vigne dense +Wall Cave Vine Green= +Wall Cave Vine Blue= +Wall Cave Vine Cyan= +Wall Cave Vine Violet= +Coral Bones Block Wall= +Coral Bones Brick Wall= +Crystal Cobblestone Wall= +Crystal Mossy Cobblestone Wall= +Cursed Sandstone Brick Wall= +Cursed Sandstone Block Wall= +Cursed Stone Carved Wall= +Forsaken Desert Cobblestone Wall= +Forsaken Desert Cobblestone Red Wall= +Forsaken Desert Brick Wall= +Forsaken Desert Brick Red Wall= +Forsaken Desert Engraved Stone Wall= +Mineral Cave Stone Wall= +Mineral Cave Cobblestone Wall= +Mineral Lava Stone with lava Wall= +Mineral Lava Stone without lava Wall= +Forsaken Desert Chiseled Stone=Pierre ciselée de désert abandonné + + +##### not used anymore ##### + +Cave Vine with Mese Leaves=Vigne des cavernes avec des feuille de Mese diff --git a/mods/everness/locale/everness.hu.tr b/mods/everness/locale/everness.hu.tr new file mode 100644 index 0000000..baf0432 --- /dev/null +++ b/mods/everness/locale/everness.hu.tr @@ -0,0 +1,621 @@ +# textdomain: everness +@1 will intersect protection on growth.= +Compost chance= +Everness Encyclopedia= +You need "everness_encyclopedia" privilige to access this button.= +Empty Bucket= +Get biome name where you are standing.= +This command can only be executed in-game!= +Locked Chest= +Locked Chest (owned by @1)= +You do not own this chest.= +a locked chest= +Chest= +Quartz Crystal=Kvarckristály +Baobab Roasted Fruit=Sült baobabgyümölcs +Pyrite Ingot=Piritrúd +Pyrite Lump=Piritrög +Bamboo=Bambusz +Hunger= +Coconut= +Coral Wood Fence Gate= +Lava Tree Wood Door= +Lava Tree Wood Trapdoor= +Lava Tree Wood Fence Gate= +Bamboo Wood Fence Gate=Bambusz kerítésajtó +Crystal Wood Fence Gate= +Palm Wood Fence Gate= +Bamboo Door=Bambuszajtó +Bamboo Trapdoor=Bambusz csapóajtó +Bone Pyrit Door=Csont-pirit ajtó +Willow Door=Fűzfaajtó +Crystal Wood Door= +Crystal Wood Trapdoor= +Cursed Wood Door= +Cursed Wood Trapdoor= +Palm Wood Door= +Palm Wood Trapdoor= +Dry Wood Fence Rail=Elszáradt fakerítés-rács +Dry Wood Mese Post Light=Elszáradt fa-mese-lámpa +Bamboo Wood Fence Rail=Bambusz fakerítés-rács +Bamboo Wood Mese Post Light=Bambusz fa-mese-lámpa +Crystal Wood Fence Rail= +Crystal Wood Mese Post Light= +Palm Wood Fence Rail= +Palm Wood Mese Post Light= +Coral Wood Fence= +Coral Wood Fence Rail= +Coral Wood Mese Post Light= +Lava Tree Wood Fence= +Lava Tree Wood Fence Rail= +Lava Tree Wood Mese Post Light= +Dry Wood Fence=Elszáradt fakerítés +Bamboo Wood Fence=Bambusz fakerítés +Crystal Wood Fence= +Palm Wood Fence= +Dry Wood Fence Gate= +Coral Desert Stone Stair= +Coral Desert Stone Slab= +Double Coral Desert Stone Slab= +Coral Desert Cobblestone Stair= +Coral Desert Cobblestone Slab= +Double Coral Desert Cobblestone Slab= +Coral Mossy Cobblestone Stair= +Coral Mossy Cobblestone Slab= +Double Coral Mossy Cobblestone Slab= +Cursed Brick Stair= +Cursed Brick Slab= +Double Cursed Brick Slab= +Cursed Brick with Growth Stair= +Cursed Brick with Growth Slab= +Double Cursed Brick with Growth Slab= +Double Coral Bones Block Slab= +Double Coral Bones Brick Slab= +Double Quartz Block Slab= +Double Quartz Chiseled Slab= +Double Quartz Pillar Slab= +Double Dry Wood Slab= +Double Coral Wood Slab= +Double Bamboo Wood Slab= +Double Bamboo Mosaic Wood Slab= +Double Forsaken Desert Brick Slab= +Double Forsaken Desert Brick Red Slab= +Double Forsaken Desert Chiseled Stone Slab= +Double Baobab Wood Slab= +Double Sequoia Wood Slab= +Double Forsaken Tundra Cobblestone Slab= +Double Forsaken Tundra Stone Slab= +Double Forsaken Tundra Brick Slab= +Double Willow Wood Slab= +Double Magma Cobblestone Slab= +Double Volcanic Rock Slab= +Double Volcanic Rock with Magma Slab= +Double Coral Depp Ocean Sandstone Block Slab= +Double Coral Depp Ocean Sandstone Brick Slab= +Double Coral White Sandstone Slab= +Double Coral White Sandstone Pillar Slab= +Double Coral White Sandstone Brick Slab= +Double Coral Desert Stone Block Slab= +Double Coral Desert Stone Brick Slab= +Double Coral Sandstone Slab= +Double Coral Sandstone Brick Slab= +Double Coral Sandstone Chiseled Slab= +Double Coral Sandstone Carved Slab= +Double Cursed Lands Deep Ocean Sandstone Block Slab= +Double Cursed Lands Deep Ocean Sandstone Brick Slab= +Double Crystal Forest Deep Ocean Sandstone Block Slab= +Double Crystal Forest Deep Ocean Sandstone Brick Slab= +Double Crystal Cobblestone Slab= +Double Crystal Mossy Cobblestone Slab= +Double Crystal Stone Brick Slab= +Double Crystal Wood Slab= +Double Mese Wood Slab= +Double= +A bucket can be used to collect and release liquids. This one is filled with mineral water.= +Place it to empty the bucket and create a mineral water source.= +Places a mineral water source= +Bucket= +Water= +Coral Cobblestone Wall=Korall macskakő-fal +Coral Mossy Cobblestone Wall=Korall macskakő-fal, mohos +Cursed Brick Wall=Elátkozott tégla-fal +Cursed Brick with Growth Wall= +Forsaken Tundra Cobblestone Wall=Elhagyatott tundrai macskakő-fal +Forsaken Tundra Stone Wall=Elhagyatott tundrai kőfal +Forsaken Tundra Brick Wall=Elhagyatott tundrai téglafal +Magma Cobblestone Wall=Magmás macskakő-fal +Volcanic Rock Wall=Vulkanikus kőzetfal +Volcanic Rock with Magma Wall=Magmás vulkanikus kőzetfal +Lava Bucket= +Mineral= +Coal Ore= +Pyrite Ore=Piritérc +Ceramic Sherds. Use archeological pickaxe to have a chance of getting various different sherds.= +Ceramic Sherds= +Pyrite Block=Piritblokk +Forged Pyrite Block=Kovácsolt piritblokk +Pyrite Brick=Pirittégla +Pyrite Slab Brick=Pirit lap-tégla +Pyrite Spiral=Pirit spirál +Pyrite Pillar Bottom=Pirit oszloptalapzat +Pyrite Pillar Middle=Piritoszlop +Pyrite Pillar Top=Pirit oszlopfő +Pyrite Pillar Small=Kis piritoszlop +Polished Pyrite Block=Csiszolt piritblokk +Quartz Ore=Kvarcérc +Coral Desert Stone=Korallsivatagi kő +Crystal Stone= +Coral Sandstone= +Coral Sandstone Brick= +Coral Sandstone Chiseled Block= +Coral Sandstone Carved Block= +Coral White Sandstone= +Coral White Sandstone Brick= +Coral White Sandstone Pillar= +Coral Desert Stone Block= +Coral Desert Stone Brick= +Coral Bones=Korallsivatagi csont +Coral Bones Block= +Coral Bones Brick= +Crystal Cobblestone= +Crystal Mossy Cobblestone= +Crystal Stone Brick= +Coral Desert Cobblestone=Korallsivatagi macskakő +Coral Mossy Cobblestone=Korallsivatagi macskakő, mohos +Coral Desert Stone with Moss=Korallsivatagi kő, mohos +Coral Deep Ocean Sandstone Block= +Coral Deep Ocean Sandstone Brick= +Cursed Lands Deep Ocean Sandstone Block= +Cursed Lands Deep Ocean Sandstone Brick= +Crystal Forest Deep Ocean Sandstone Block= +Crystal Forest Deep Ocean Sandstone Brick= +Forsaken Desert Stone=Elhagyatott sivatagi kő +Forsaken Desert Cobblestone Red=Elhagyatott sivatagi macskakő, vörös +Forsaken Desert Cobblestone=Elhagyatott sivatagi macskakő +Volcanic Rock=Vulkanikus kőzet +Volcanic Rock with Magma=Vulkanikus kőzet magmával +Cursed Stone=Elátkozott kő +Cursed Stone Carved= +Cursed Brick=Elátkozott tégla +Cursed Brick with Growth= +Cursed Brick Mixed= +Cursed Brick Carved= +Volcanic Sulfur Stone=Vulkanikus kénkő +Sulfur Stone=Kénkő +Forsaken Tundra Cobblestone=Elhagyatott tundrai macskakő +Forsaken Tundra Stone=Elhagyatott tundrai kő +Mold Cobble=Penészes macskakő +Forsaken Tundra Brick=Elhagyatott tundrai tégla +Forsaken Tundra Rocks=Elhagyatott tundrai kőzet +Blue Crying Obsidian=Sikoltó obszidián, kék +Blue Weeping Obsidian=Könnyező obszidián, kék +Weeping Obsidian=Könnyező obszidián +Mold Stone=Penészes kő +Soul Sandstone=Lélek-homokkő +Soul Sandstone Veined=Lélek-homokkő, erezett +Purple Crystal Block=Lila kristályblokk +Orange Crystal Block=Narancs kristályblokk +Cyan Crystal Block= +Quartz Block=Kvarckristály-blokk +Chiseled Quartz=Csiszolt kvarc +Quartz Pillar=Kvarcoszlop +Forsaken Desert Brick=Elhagyatott sivatagi tégla +Forsaken Desert Brick Red=Elhagyatott sivatagi tégla, vörös +Forsaken Desert Engraved Stone=Elhagyatott sivatagi kő, vésett +Crystal Sandstone= +Crystal Sandstone Brick= +Crystal Sandstone Chiseled= +Cursed Sandstone Block= +Cursed Sandstone Brick= +Coral Dirt=Korallföld +Coral Deep Ocean Mud= +Cursed Dirt=Elátkozott föld +Crystal Dirt=Kristályföld +Forsaken Tundra Dirt=Elhagyatott tundraföld +Forsaken Tundra Dirt with Grass=Elhagyatott tundraföld, füves +Dirt with Coral Grass=Föld, korallfüves +Dirt with Cursed Grass=Föld, elátkozott füves +Dirt with Crystal Grass=Föld, kristályfüves +Dry Ocean Dirt=Száraz óceánfenék-talaj +Gravel= +Permanent Fire= +Dirt=Föld +Dry Dirt= +Dirt with Dry Grass= +Dirt with Grass=Föld, fűvel +Crystal Cave Dirt=Kristálybarlangi föld +Crystal Cave Dirt with Moss=Kristálybarlangi föld, mohos +Moss Block=Mohablokk +Crystal Moss Block=Kristálymoha-blokk +Coral Sand=Korallhomok +Coral White Sand=Korallhomok, fehér +Cursed Sand=Elátkozott homok +Crystal Sand=Kristályhomok +Crystal Forest Deep Ocean Sand with Crack= +Forsaken Tundra Beach Sand=Elhagyatott tundraparti homok +Forsaken Tundra Beach Sand with Shells=Elhagyatott tundraparti homok, kagylós +Forsaken Desert Sand=Elhagyatott sivatagi homok +Coral Forest Deep Ocean Sand= +Cursed Lands Deep Ocean Sand= +Cursed Lands Deep Ocean Sand with Crack= +Crystal Forest Deep Ocean Sand= +Mineral Sand= +Frosted Snow Block=Fagyalt hóblokk +Frosted Ice=Fagyalt jég +Frosted Ice Translucent=Fagyalt jég, átlátszó +Frosted Cave Ice=Fagyalt jég, barlangi +Bone=Csont +Ancient Emerald Ice=Ősi smaragdjég +Dense Emerald Ice=Sűrű smaragdjég +Emerald Ice=Smaragdjég +Cursed Mud=Elátkozott sár +Cobweb=Pókháló +Cave Flower=Barlangi virág +Cave Flower with Particles=Barlangi virág, szemcsés +Lotus= +Flower= +Animated= +Leaf= +Dry= +Forsaken Fire=Elhagyatott tűz +Coral Tree Trunk=Korallfa-törzs +Coral Wood Planks= +Coral Tree Bioluminescent=Korallfa, biolumineszcens +Cursed Dream Stone=Elátkozott álomkő +Dry Tree Trunk=Elszáradt fatörzs +Baobab Tree Trunk=Baobabfa-törzs +Sequoia Tree Trunk=Mammutfenyő-törzs +Willow Tree Trunk=Fűzfa-törzs +Willow Wood Planks=Fűzfa-palánk +Dry Wood Planks=Elszáradt palánk +Hollow Tree Trunk=Üregesfa-törzs +Crystal Tree Trunk=Kristályfa-törzs +Crystal Wood Planks= +Mese Tree Trunk=Mesefa-törzs +Trunk= +Mese Tree Leaves= +Baobab Tree Leaves=Baobabfa-lomb +Sequoia Tree Leaves=Mammutfenyő-lomb +Baobab Fruit=baobabgyümölcs +Baobab Fruit Marker=baobabgyümölcs-jelölő +Baobab Sapling=Baobab-palánta +Willow Tree Leaves=Fűzfa-lomb +Coral Tree Leaves=Korallfa-lomb +Dry Tree Branches=Elszáradt faág +Crystal Tree Leaves=Kristályfa-lomb +Coral Tree Sapling=Korallfa-palánta +Coral Tree Bioluminescent Sapling=Korallfa-palánta, biolumineszcens +Dry Tree Sapling=Elszáradt fa-palánta +Cursed Dream Tree Sapling=Elátkozott álomfa-palánta +Willow Tree Sapling= +Sequoia Tree Sapling=Mammutfenyő-palánta +Crystal Tree Sapling=Kristályfa-palánta +Crystal Tree Large Sapling=Kristályfa-palánta, nagy +Crystal Bush Stem=Kristálybokor-törzs +Crystal Bush Leaves=Kristálybokor-lomb +Crystal Bush Sapling=Kristálybokor-palánta +Cursed Bush Stem=Elátkozott bokor-törzs +Cursed Bush Leaves=Elátkozott bokor-lomb +Cursed Bush Sapling=Elátkozott bokor-palánta +Flowers= +Magenta Flowers= +Clover= +Luminous Mushroom= +Glossy Mushroom= +Staghorn Coral (Stage 1)= +Staghorn Coral (Stage 2)= +Staghorn Coral (Stage 3)= +Clover with flowers= +Aurora Violet= +Aurora Sky Blue= +Aurora Cyan= +Aurora Mint= +Aurora Lavender= +Aurora Lime= +Aurora Coral= +Aurora Magenta= +Glass Crystal Cluster= +Glass Megalith Foundation= +Glass Megalith Lower Shaft= +Glass Megalith Mid Nexus= +Glass Megalith Upper Spire= +Glass Megalith Summit Needle= +Coral Burdock=Korallbojtorján +Coral Bush=Korallbokor +Coral Shrub=Korallbozót +Orange Coral Grass=Narancs korallfű +Globulagus=Golyós eukaliptusz +Tall Coral Grass=Magas korallfű +Purple Crystal=Lila kristály +Orange Crystal=Narancs kristály +Cyan Crystal=Cián kristály +Coral Plant Bioluminescent=Korallnövény, biolumineszcens +Blooming Cooksonia=Virágzó májmoha +Creeping Moss Spores=Kúszómoha-spóra +Frosted Icicle=Fagyalt jégcsap +Frosted Icicle Floor=Fagyalt jégcsap-padló +Coral Grass=Korallfű +Baobab Savanna Grass= +Red Castor=Vörös ricinus +Crystal Mushrooms=Kristálygomba +Twisted Crystal Grass=Csavarodott kristályfű +Twisted Crystal Spire= +Crystal Grass=Kristályfű +Marsh Grass=Mocsári fű +Forsaken Plant=Elhagyatott növény +Blue Cactus=Kék kaktusz +Cave Barrel Cactus=Barlangi hordókaktusz +Venus Trap Plant=Vénusz légycsapó +Illumi Root=Illumi-gyökér +Crystal Waterlily=Kristály-vízililiom +Orange Cactus=Narancssárga kaktusz +Agave Leaf=Agave-lomb +Mese Fruit= +Mese Tree Sapling= +Egg plant=Padlizsán +Ivis Moss=Ivis-moha +Ngrass=N-fű +Bamboo Sprout=Bambuszrügy +Blood Spoore Plant=Vérspóra-növény +Blood Spoore Plant Small=Vérspóra-növény, kicsi +Termite Block=Termeszblokk +Bamboo Block=Bambuszblokk +Bamboo Planks=Bambuszpalánk +Bamboo Mosaic=Bambuszmozaik +Baobab Wood Planks=Baobabfa-palánk +Sequoia Wood Planks=Mammutfenyő-palánk +Mese Wood Planks= +Coral Corals=Korall +Coral Frosted=Korall, fagyalt +Coral Starfish=Korall-csillaghal +Spine Kelp=Gerinchínár +Coral Bulbs= +Coral Tree= +Coral Palm= +Coral Anemone= +Coral Darkilluma= +Coral Demon= +Crystal Forest Deep Ocean Coral Plant Cyan= +Crystal Forest Deep Ocean Coral Plant Orange= +Crystal Forest Deep Ocean Coral Plant Pink= +Crystal Coral Dark=Kristálykorall, sötét +Crystal Coral Light=Kristálykorall, világos +Coral Forest Deep Ocean Coral Pink= +Coral Forest Deep Ocean Coral Cyan= +Coral Forest Deep Ocean Coral Green= +Coral Forest Deep Ocean Coral Red= +Coral Alcyonacea= +Coral Ostracod= +Coral Octocurse= +Crystal Forest Deep Ocean Coral Green= +Crystal Forest Deep Ocean Coral Orange= +Crystal Forest Deep Ocean Coral Cyan= +Coral Skeleton= +Mineral Water Weed= +Skull with Candle=Koponya gyertyával +Forsythia Bush=Forsythia-bokor +Rose Bush= +Glowing Pillar=Izzó oszlop +Blue Vine Lantern=Kék inda-lámpás +Amaranita Lantern=Amaranita-lámpás +Lumecorn=Lume-mag +Everness Glass= +Tinted Glass Red=Színezett üveg, vörös +Pyrite Lantern=Piritlámpás +Pyrite Glass=Piritüveg +Lumabus Vine Lantern=Lumabus-inda lámpás +Eye Vine Lantern=Szem-inda lámpás +Cursed Pumpkin Lantern=Elátkozott töklámpás +Floating Crystal=Lebegő kristály +Coral Forest Deep Ocean Lantern= +Mineral Water Source= +Flowing Mineral Water= +Lava Source= +Flowing Lava= +Geyser= +Active= +Ceramic= +Pot= +If destroyed by archelogical pick axe, it will drop ceramic sherds instead of ceramic pot item.= +owned by= +Sherd= +Sand= +Castle= +Wall= +Purple= +Green= +Red= +Blue= +Yellow= +Magenta= +Cyan= +White= +Cursed Skeleton Hands= +Cursed Rib Cage= +Cursed Skull on Stick= +Coral Dirt Soil= +Dirt Soil= +Crystal Dirt Soil= +Crystal Cave Dirt Soil= +Cursed Dirt Soil= +Dry Dirt Soil= +Coral Dirt Wet Soil= +Crystal Dirt Wet Soil= +Crystal Cave Dirt Wet Soil= +Cursed Dirt Wet Soil= +Mineral Cave Stone= +Mineral Cave Cobblestone= +Mineral Lava Stone with lava= +Mineral Lava Stone without lava= +Mineral Lava Stone with moss= +Volcanic Spike= +Mineral Lava Stone Spike= +Lava Tree Trunk= +Lava Tree Trunk with Lava Veins= +Lava Tree Wood Planks= +Lava= +Mineral Cave Moss Grass= +Sapling= +Leaves= +Pyrite Glass Pane=Piritüveg-lap +Cursed Steel Bars= +Cursed Steel Bar Door= +Steel Bar Trapdoor= +Dry Tree Trunk Stair= +Dry Tree Trunk Slab= +Forsaken Desert Engraved Stone Stair= +Forsaken Desert Engraved Stone Slab= +Forsaken Desert Cobblestone Stair= +Forsaken Desert Cobblestone Slab= +Forsaken Desert Cobblestone Red Stair= +Forsaken Desert Cobblestone Red Slab= +Everness Glass Stair= +Everness Glass Slab= +Mineral Cave Stone Stair= +Mineral Cave Stone Slab= +Mineral Cave Cobblestone Stair= +Mineral Cave Cobblestone Slab= +Mineral Lava Stone with lava Stair= +Mineral Lava Stone with lava Slab= +Mineral Lava Stone without lava Stair= +Mineral Lava Stone without lava Slab= +Coral Bones Block Stair= +Coral Bones Block Slab= +Coral Bones Brick Stair= +Coral Bones Brick Slab= +Quartz Block Stair=Csiszolt blokk-lépcső +Quartz Block Slab=Csiszolt blokk-kő +Quartz Chiseled Stair=Csiszolt kvarc-lépcső +Quartz Chiseled Slab=Csiszolt kvarc-lap +Quartz Pillar Stair=Kvarcoszlop-lépcső +Quartz Pillar Slab=Kvarcoszlop-lap +Dry Wood Stair=Elszáradt fa-lépcső +Dry Wood Slab=Elszáradt fa-lap +Coral Wood Stair= +Coral Wood Slab= +Bamboo Wood Stair=Bambusz fa-lépcső +Bamboo Wood Slab=Bambusz fa-lap +Bamboo Mosaic Wood Stair=Bambuszmozaik fa-lépcső +Bamboo Mosaic Wood Slab=Bambuszmozaik fa-lap +Forsaken Desert Brick Stair=Elhagyatott sivatagi tégla-lépcső +Forsaken Desert Brick Slab=Elhagyatott sivatagi tégla-lap +Forsaken Desert Brick Red Stair=Elhagyatott sivatagi tégla-lépcső, vörös +Forsaken Desert Brick Red Slab=Elhagyatott sivatagi tégla-lap, vörös +Forsaken Desert Chiseled Stone Stair=Elhagyatott sivatagi csiszolt kő-lépcső +Forsaken Desert Chiseled Stone Slab=Elhagyatott sivatagi csiszolt kő-lap +Baobab Wood Stair=Baobabfa-lépcső +Baobab Wood Slab=Baobabfa-lap +Sequoia Wood Stair=Mammutfenyő-lépcső +Sequoia Wood Slab=Mammutfenyő-lap +Forsaken Tundra Cobblestone Stair=Elhagyatott tundrai macskakő-lépcs +Forsaken Tundra Cobblestone Slab=Elhagyatott tundrai macskakő-lap +Forsaken Tundra Stone Stair=Elhagyatott tundrai kő-lépcső +Forsaken Tundra Stone Slab=Elhagyatott tundrai kő-lap +Forsaken Tundra Brick Stair=Elhagyatott tundrai tégla-lépcső +Forsaken Tundra Brick Slab=Elhagyatott tundrai tégla-lap +Willow Wood Stair=Fűzfa-lépcső +Willow Wood Slab=Fűzfa-lap +Magma Cobblestone Stair=Magmás macskakő-lépcső +Magma Cobblestone Slab=Magmás macskakő-lap +Volcanic Rock Stair=Vulkanikus kőzet-lépcső +Volcanic Rock Slab=Vulkanikus kőzet-lap +Volcanic Rock with Magma Stair=Magmás vulkanikus kőzet-lépcső +Volcanic Rock with Magma Slab=Magmás vulkanikus kőzet-lap +Coral Depp Ocean Sandstone Block Stair= +Coral Depp Ocean Sandstone Block Slab= +Coral Depp Ocean Sandstone Brick Stair= +Coral Depp Ocean Sandstone Brick Slab= +Coral White Sandstone Stair= +Coral White Sandstone Slab= +Coral White Sandstone Pillar Stair= +Coral White Sandstone Pillar Slab= +Coral White Sandstone Brick Stair= +Coral White Sandstone Brick Slab= +Coral Desert Stone Block Stair= +Coral Desert Stone Block Slab= +Coral Desert Stone Brick Stair= +Coral Desert Stone Brick Slab= +Coral Sandstone Stair= +Coral Sandstone Slab= +Coral Sandstone Brick Stair= +Coral Sandstone Brick Slab= +Coral Sandstone Chiseled Stair= +Coral Sandstone Chiseled Slab= +Coral Sandstone Carved Stair= +Coral Sandstone Carved Slab= +Cursed Lands Deep Ocean Sandstone Block Stair= +Cursed Lands Deep Ocean Sandstone Block Slab= +Cursed Lands Deep Ocean Sandstone Brick Stair= +Cursed Lands Deep Ocean Sandstone Brick Slab= +Crystal Forest Deep Ocean Sandstone Block Stair= +Crystal Forest Deep Ocean Sandstone Block Slab= +Crystal Forest Deep Ocean Sandstone Brick Stair= +Crystal Forest Deep Ocean Sandstone Brick Slab= +Crystal Cobblestone Stair= +Crystal Cobblestone Slab= +Crystal Mossy Cobblestone Stair= +Crystal Mossy Cobblestone Slab= +Crystal Stone Brick Stair= +Crystal Stone Brick Slab= +Crystal Wood Stair= +Crystal Wood Slab= +Mese Wood Stair= +Mese Wood Slab= +Stair= +Slab= +Stone= +Cobblestone= +Block= +Brick= +Sandstone= +with Growth= +with Flower Growth= +Palm= +Wood= +Planks= +Tree= +Vine Shears=Inda-metszőolló +Silk Shovel= +Shell of Underwater Breating= +Hammer= +Sharp= +Torch= +Cave Vine=Barlangi inda +Whispering Gourd Vine=Suttogó tök-inda +Bulb Vine=Rügyező inda +Willow Vine=Fűzfainda +Eye Vine=Szem-inda +Lumabus Vine=Lumabus-inda +Ivis Vine=Ivis-inda +Flowered Vine=Virágzó inda +Reeds Vine=Nádinda +Tenanea Flowers Vine= +Twisted Vine=Csavarodott inda +Golden Vine=Arany inda +Dense Vine=Sűrű inda +Wall Cave Vine Green= +Wall Cave Vine Blue= +Wall Cave Vine Cyan= +Wall Cave Vine Violet= +Coral Bones Block Wall= +Coral Bones Brick Wall= +Crystal Cobblestone Wall= +Crystal Mossy Cobblestone Wall= +Cursed Sandstone Brick Wall= +Cursed Sandstone Block Wall= +Cursed Stone Carved Wall= +Forsaken Desert Cobblestone Wall= +Forsaken Desert Cobblestone Red Wall= +Forsaken Desert Brick Wall= +Forsaken Desert Brick Red Wall= +Forsaken Desert Engraved Stone Wall= +Mineral Cave Stone Wall= +Mineral Cave Cobblestone Wall= +Mineral Lava Stone with lava Wall= +Mineral Lava Stone without lava Wall= +Forsaken Desert Chiseled Stone=Elhagyatott sivatagi kő, csiszolt + + +##### not used anymore ##### + +Cave Vine with Mese Leaves=Barlangi inda mese-levelekkel diff --git a/mods/everness/locale/template.txt b/mods/everness/locale/template.txt new file mode 100644 index 0000000..4250e55 --- /dev/null +++ b/mods/everness/locale/template.txt @@ -0,0 +1,616 @@ +# textdomain: everness +@1 will intersect protection on growth.= +Compost chance= +Everness Encyclopedia= +You need "everness_encyclopedia" privilige to access this button.= +Empty Bucket= +Get biome name where you are standing.= +This command can only be executed in-game!= +Locked Chest= +Locked Chest (owned by @1)= +You do not own this chest.= +a locked chest= +Chest= +Quartz Crystal= +Baobab Roasted Fruit= +Pyrite Ingot= +Pyrite Lump= +Bamboo= +Hunger= +Coconut= +Coral Wood Fence Gate= +Lava Tree Wood Door= +Lava Tree Wood Trapdoor= +Lava Tree Wood Fence Gate= +Bamboo Wood Fence Gate= +Crystal Wood Fence Gate= +Palm Wood Fence Gate= +Bamboo Door= +Bamboo Trapdoor= +Bone Pyrit Door= +Willow Door= +Crystal Wood Door= +Crystal Wood Trapdoor= +Cursed Wood Door= +Cursed Wood Trapdoor= +Palm Wood Door= +Palm Wood Trapdoor= +Dry Wood Fence Rail= +Dry Wood Mese Post Light= +Bamboo Wood Fence Rail= +Bamboo Wood Mese Post Light= +Crystal Wood Fence Rail= +Crystal Wood Mese Post Light= +Palm Wood Fence Rail= +Palm Wood Mese Post Light= +Coral Wood Fence= +Coral Wood Fence Rail= +Coral Wood Mese Post Light= +Lava Tree Wood Fence= +Lava Tree Wood Fence Rail= +Lava Tree Wood Mese Post Light= +Dry Wood Fence= +Bamboo Wood Fence= +Crystal Wood Fence= +Palm Wood Fence= +Dry Wood Fence Gate= +Coral Desert Stone Stair= +Coral Desert Stone Slab= +Double Coral Desert Stone Slab= +Coral Desert Cobblestone Stair= +Coral Desert Cobblestone Slab= +Double Coral Desert Cobblestone Slab= +Coral Mossy Cobblestone Stair= +Coral Mossy Cobblestone Slab= +Double Coral Mossy Cobblestone Slab= +Cursed Brick Stair= +Cursed Brick Slab= +Double Cursed Brick Slab= +Cursed Brick with Growth Stair= +Cursed Brick with Growth Slab= +Double Cursed Brick with Growth Slab= +Double Coral Bones Block Slab= +Double Coral Bones Brick Slab= +Double Quartz Block Slab= +Double Quartz Chiseled Slab= +Double Quartz Pillar Slab= +Double Dry Wood Slab= +Double Coral Wood Slab= +Double Bamboo Wood Slab= +Double Bamboo Mosaic Wood Slab= +Double Forsaken Desert Brick Slab= +Double Forsaken Desert Brick Red Slab= +Double Forsaken Desert Chiseled Stone Slab= +Double Baobab Wood Slab= +Double Sequoia Wood Slab= +Double Forsaken Tundra Cobblestone Slab= +Double Forsaken Tundra Stone Slab= +Double Forsaken Tundra Brick Slab= +Double Willow Wood Slab= +Double Magma Cobblestone Slab= +Double Volcanic Rock Slab= +Double Volcanic Rock with Magma Slab= +Double Coral Depp Ocean Sandstone Block Slab= +Double Coral Depp Ocean Sandstone Brick Slab= +Double Coral White Sandstone Slab= +Double Coral White Sandstone Pillar Slab= +Double Coral White Sandstone Brick Slab= +Double Coral Desert Stone Block Slab= +Double Coral Desert Stone Brick Slab= +Double Coral Sandstone Slab= +Double Coral Sandstone Brick Slab= +Double Coral Sandstone Chiseled Slab= +Double Coral Sandstone Carved Slab= +Double Cursed Lands Deep Ocean Sandstone Block Slab= +Double Cursed Lands Deep Ocean Sandstone Brick Slab= +Double Crystal Forest Deep Ocean Sandstone Block Slab= +Double Crystal Forest Deep Ocean Sandstone Brick Slab= +Double Crystal Cobblestone Slab= +Double Crystal Mossy Cobblestone Slab= +Double Crystal Stone Brick Slab= +Double Crystal Wood Slab= +Double Mese Wood Slab= +Double= +A bucket can be used to collect and release liquids. This one is filled with mineral water.= +Place it to empty the bucket and create a mineral water source.= +Places a mineral water source= +Bucket= +Water= +Coral Cobblestone Wall= +Coral Mossy Cobblestone Wall= +Cursed Brick Wall= +Cursed Brick with Growth Wall= +Forsaken Tundra Cobblestone Wall= +Forsaken Tundra Stone Wall= +Forsaken Tundra Brick Wall= +Magma Cobblestone Wall= +Volcanic Rock Wall= +Volcanic Rock with Magma Wall= +Lava Bucket= +Mineral= +Coal Ore= +Pyrite Ore= +Ceramic Sherds. Use archeological pickaxe to have a chance of getting various different sherds.= +Ceramic Sherds= +Pyrite Block= +Forged Pyrite Block= +Pyrite Brick= +Pyrite Slab Brick= +Pyrite Spiral= +Pyrite Pillar Bottom= +Pyrite Pillar Middle= +Pyrite Pillar Top= +Pyrite Pillar Small= +Polished Pyrite Block= +Quartz Ore= +Coral Desert Stone= +Crystal Stone= +Coral Sandstone= +Coral Sandstone Brick= +Coral Sandstone Chiseled Block= +Coral Sandstone Carved Block= +Coral White Sandstone= +Coral White Sandstone Brick= +Coral White Sandstone Pillar= +Coral Desert Stone Block= +Coral Desert Stone Brick= +Coral Bones= +Coral Bones Block= +Coral Bones Brick= +Crystal Cobblestone= +Crystal Mossy Cobblestone= +Crystal Stone Brick= +Coral Desert Cobblestone= +Coral Mossy Cobblestone= +Coral Desert Stone with Moss= +Coral Deep Ocean Sandstone Block= +Coral Deep Ocean Sandstone Brick= +Cursed Lands Deep Ocean Sandstone Block= +Cursed Lands Deep Ocean Sandstone Brick= +Crystal Forest Deep Ocean Sandstone Block= +Crystal Forest Deep Ocean Sandstone Brick= +Forsaken Desert Stone= +Forsaken Desert Cobblestone Red= +Forsaken Desert Cobblestone= +Volcanic Rock= +Volcanic Rock with Magma= +Cursed Stone= +Cursed Stone Carved= +Cursed Brick= +Cursed Brick with Growth= +Cursed Brick Mixed= +Cursed Brick Carved= +Volcanic Sulfur Stone= +Sulfur Stone= +Forsaken Tundra Cobblestone= +Forsaken Tundra Stone= +Mold Cobble= +Forsaken Tundra Brick= +Forsaken Tundra Rocks= +Blue Crying Obsidian= +Blue Weeping Obsidian= +Weeping Obsidian= +Mold Stone= +Soul Sandstone= +Soul Sandstone Veined= +Purple Crystal Block= +Orange Crystal Block= +Cyan Crystal Block= +Quartz Block= +Chiseled Quartz= +Quartz Pillar= +Forsaken Desert Brick= +Forsaken Desert Brick Red= +Forsaken Desert Engraved Stone= +Crystal Sandstone= +Crystal Sandstone Brick= +Crystal Sandstone Chiseled= +Cursed Sandstone Block= +Cursed Sandstone Brick= +Coral Dirt= +Coral Deep Ocean Mud= +Cursed Dirt= +Crystal Dirt= +Forsaken Tundra Dirt= +Forsaken Tundra Dirt with Grass= +Dirt with Coral Grass= +Dirt with Cursed Grass= +Dirt with Crystal Grass= +Dry Ocean Dirt= +Gravel= +Permanent Fire= +Dirt= +Dry Dirt= +Dirt with Dry Grass= +Dirt with Grass= +Crystal Cave Dirt= +Crystal Cave Dirt with Moss= +Moss Block= +Crystal Moss Block= +Coral Sand= +Coral White Sand= +Cursed Sand= +Crystal Sand= +Crystal Forest Deep Ocean Sand with Crack= +Forsaken Tundra Beach Sand= +Forsaken Tundra Beach Sand with Shells= +Forsaken Desert Sand= +Coral Forest Deep Ocean Sand= +Cursed Lands Deep Ocean Sand= +Cursed Lands Deep Ocean Sand with Crack= +Crystal Forest Deep Ocean Sand= +Mineral Sand= +Frosted Snow Block= +Frosted Ice= +Frosted Ice Translucent= +Frosted Cave Ice= +Bone= +Ancient Emerald Ice= +Dense Emerald Ice= +Emerald Ice= +Cursed Mud= +Cobweb= +Cave Flower= +Cave Flower with Particles= +Lotus= +Flower= +Animated= +Leaf= +Dry= +Forsaken Fire= +Coral Tree Trunk= +Coral Wood Planks= +Coral Tree Bioluminescent= +Cursed Dream Stone= +Dry Tree Trunk= +Baobab Tree Trunk= +Sequoia Tree Trunk= +Willow Tree Trunk= +Willow Wood Planks= +Dry Wood Planks= +Hollow Tree Trunk= +Crystal Tree Trunk= +Crystal Wood Planks= +Mese Tree Trunk= +Trunk= +Mese Tree Leaves= +Baobab Tree Leaves= +Sequoia Tree Leaves= +Baobab Fruit= +Baobab Fruit Marker= +Baobab Sapling= +Willow Tree Leaves= +Coral Tree Leaves= +Dry Tree Branches= +Crystal Tree Leaves= +Coral Tree Sapling= +Coral Tree Bioluminescent Sapling= +Dry Tree Sapling= +Cursed Dream Tree Sapling= +Willow Tree Sapling= +Sequoia Tree Sapling= +Crystal Tree Sapling= +Crystal Tree Large Sapling= +Crystal Bush Stem= +Crystal Bush Leaves= +Crystal Bush Sapling= +Cursed Bush Stem= +Cursed Bush Leaves= +Cursed Bush Sapling= +Flowers= +Magenta Flowers= +Clover= +Luminous Mushroom= +Glossy Mushroom= +Staghorn Coral (Stage 1)= +Staghorn Coral (Stage 2)= +Staghorn Coral (Stage 3)= +Clover with flowers= +Aurora Violet= +Aurora Sky Blue= +Aurora Cyan= +Aurora Mint= +Aurora Lavender= +Aurora Lime= +Aurora Coral= +Aurora Magenta= +Glass Crystal Cluster= +Glass Megalith Foundation= +Glass Megalith Lower Shaft= +Glass Megalith Mid Nexus= +Glass Megalith Upper Spire= +Glass Megalith Summit Needle= +Coral Burdock= +Coral Bush= +Coral Shrub= +Orange Coral Grass= +Globulagus= +Tall Coral Grass= +Purple Crystal= +Orange Crystal= +Cyan Crystal= +Coral Plant Bioluminescent= +Blooming Cooksonia= +Creeping Moss Spores= +Frosted Icicle= +Frosted Icicle Floor= +Coral Grass= +Baobab Savanna Grass= +Red Castor= +Crystal Mushrooms= +Twisted Crystal Grass= +Twisted Crystal Spire= +Crystal Grass= +Marsh Grass= +Forsaken Plant= +Blue Cactus= +Cave Barrel Cactus= +Venus Trap Plant= +Illumi Root= +Crystal Waterlily= +Orange Cactus= +Agave Leaf= +Mese Fruit= +Mese Tree Sapling= +Egg plant= +Ivis Moss= +Ngrass= +Bamboo Sprout= +Blood Spoore Plant= +Blood Spoore Plant Small= +Termite Block= +Bamboo Block= +Bamboo Planks= +Bamboo Mosaic= +Baobab Wood Planks= +Sequoia Wood Planks= +Mese Wood Planks= +Coral Corals= +Coral Frosted= +Coral Starfish= +Spine Kelp= +Coral Bulbs= +Coral Tree= +Coral Palm= +Coral Anemone= +Coral Darkilluma= +Coral Demon= +Crystal Forest Deep Ocean Coral Plant Cyan= +Crystal Forest Deep Ocean Coral Plant Orange= +Crystal Forest Deep Ocean Coral Plant Pink= +Crystal Coral Dark= +Crystal Coral Light= +Coral Forest Deep Ocean Coral Pink= +Coral Forest Deep Ocean Coral Cyan= +Coral Forest Deep Ocean Coral Green= +Coral Forest Deep Ocean Coral Red= +Coral Alcyonacea= +Coral Ostracod= +Coral Octocurse= +Crystal Forest Deep Ocean Coral Green= +Crystal Forest Deep Ocean Coral Orange= +Crystal Forest Deep Ocean Coral Cyan= +Coral Skeleton= +Mineral Water Weed= +Skull with Candle= +Forsythia Bush= +Rose Bush= +Glowing Pillar= +Blue Vine Lantern= +Amaranita Lantern= +Lumecorn= +Everness Glass= +Tinted Glass Red= +Pyrite Lantern= +Pyrite Glass= +Lumabus Vine Lantern= +Eye Vine Lantern= +Cursed Pumpkin Lantern= +Floating Crystal= +Coral Forest Deep Ocean Lantern= +Mineral Water Source= +Flowing Mineral Water= +Lava Source= +Flowing Lava= +Geyser= +Active= +Ceramic= +Pot= +If destroyed by archelogical pick axe, it will drop ceramic sherds instead of ceramic pot item.= +owned by= +Sherd= +Sand= +Castle= +Wall= +Purple= +Green= +Red= +Blue= +Yellow= +Magenta= +Cyan= +White= +Cursed Skeleton Hands= +Cursed Rib Cage= +Cursed Skull on Stick= +Coral Dirt Soil= +Dirt Soil= +Crystal Dirt Soil= +Crystal Cave Dirt Soil= +Cursed Dirt Soil= +Dry Dirt Soil= +Coral Dirt Wet Soil= +Crystal Dirt Wet Soil= +Crystal Cave Dirt Wet Soil= +Cursed Dirt Wet Soil= +Mineral Cave Stone= +Mineral Cave Cobblestone= +Mineral Lava Stone with lava= +Mineral Lava Stone without lava= +Mineral Lava Stone with moss= +Volcanic Spike= +Mineral Lava Stone Spike= +Lava Tree Trunk= +Lava Tree Trunk with Lava Veins= +Lava Tree Wood Planks= +Lava= +Mineral Cave Moss Grass= +Sapling= +Leaves= +Pyrite Glass Pane= +Cursed Steel Bars= +Cursed Steel Bar Door= +Steel Bar Trapdoor= +Dry Tree Trunk Stair= +Dry Tree Trunk Slab= +Forsaken Desert Engraved Stone Stair= +Forsaken Desert Engraved Stone Slab= +Forsaken Desert Cobblestone Stair= +Forsaken Desert Cobblestone Slab= +Forsaken Desert Cobblestone Red Stair= +Forsaken Desert Cobblestone Red Slab= +Everness Glass Stair= +Everness Glass Slab= +Mineral Cave Stone Stair= +Mineral Cave Stone Slab= +Mineral Cave Cobblestone Stair= +Mineral Cave Cobblestone Slab= +Mineral Lava Stone with lava Stair= +Mineral Lava Stone with lava Slab= +Mineral Lava Stone without lava Stair= +Mineral Lava Stone without lava Slab= +Coral Bones Block Stair= +Coral Bones Block Slab= +Coral Bones Brick Stair= +Coral Bones Brick Slab= +Quartz Block Stair= +Quartz Block Slab= +Quartz Chiseled Stair= +Quartz Chiseled Slab= +Quartz Pillar Stair= +Quartz Pillar Slab= +Dry Wood Stair= +Dry Wood Slab= +Coral Wood Stair= +Coral Wood Slab= +Bamboo Wood Stair= +Bamboo Wood Slab= +Bamboo Mosaic Wood Stair= +Bamboo Mosaic Wood Slab= +Forsaken Desert Brick Stair= +Forsaken Desert Brick Slab= +Forsaken Desert Brick Red Stair= +Forsaken Desert Brick Red Slab= +Forsaken Desert Chiseled Stone Stair= +Forsaken Desert Chiseled Stone Slab= +Baobab Wood Stair= +Baobab Wood Slab= +Sequoia Wood Stair= +Sequoia Wood Slab= +Forsaken Tundra Cobblestone Stair= +Forsaken Tundra Cobblestone Slab= +Forsaken Tundra Stone Stair= +Forsaken Tundra Stone Slab= +Forsaken Tundra Brick Stair= +Forsaken Tundra Brick Slab= +Willow Wood Stair= +Willow Wood Slab= +Magma Cobblestone Stair= +Magma Cobblestone Slab= +Volcanic Rock Stair= +Volcanic Rock Slab= +Volcanic Rock with Magma Stair= +Volcanic Rock with Magma Slab= +Coral Depp Ocean Sandstone Block Stair= +Coral Depp Ocean Sandstone Block Slab= +Coral Depp Ocean Sandstone Brick Stair= +Coral Depp Ocean Sandstone Brick Slab= +Coral White Sandstone Stair= +Coral White Sandstone Slab= +Coral White Sandstone Pillar Stair= +Coral White Sandstone Pillar Slab= +Coral White Sandstone Brick Stair= +Coral White Sandstone Brick Slab= +Coral Desert Stone Block Stair= +Coral Desert Stone Block Slab= +Coral Desert Stone Brick Stair= +Coral Desert Stone Brick Slab= +Coral Sandstone Stair= +Coral Sandstone Slab= +Coral Sandstone Brick Stair= +Coral Sandstone Brick Slab= +Coral Sandstone Chiseled Stair= +Coral Sandstone Chiseled Slab= +Coral Sandstone Carved Stair= +Coral Sandstone Carved Slab= +Cursed Lands Deep Ocean Sandstone Block Stair= +Cursed Lands Deep Ocean Sandstone Block Slab= +Cursed Lands Deep Ocean Sandstone Brick Stair= +Cursed Lands Deep Ocean Sandstone Brick Slab= +Crystal Forest Deep Ocean Sandstone Block Stair= +Crystal Forest Deep Ocean Sandstone Block Slab= +Crystal Forest Deep Ocean Sandstone Brick Stair= +Crystal Forest Deep Ocean Sandstone Brick Slab= +Crystal Cobblestone Stair= +Crystal Cobblestone Slab= +Crystal Mossy Cobblestone Stair= +Crystal Mossy Cobblestone Slab= +Crystal Stone Brick Stair= +Crystal Stone Brick Slab= +Crystal Wood Stair= +Crystal Wood Slab= +Mese Wood Stair= +Mese Wood Slab= +Stair= +Slab= +Stone= +Cobblestone= +Block= +Brick= +Sandstone= +with Growth= +with Flower Growth= +Palm= +Wood= +Planks= +Tree= +Vine Shears= +Silk Shovel= +Shell of Underwater Breating= +Hammer= +Sharp= +Torch= +Cave Vine= +Whispering Gourd Vine= +Bulb Vine= +Willow Vine= +Eye Vine= +Lumabus Vine= +Ivis Vine= +Flowered Vine= +Reeds Vine= +Tenanea Flowers Vine= +Twisted Vine= +Golden Vine= +Dense Vine= +Wall Cave Vine Green= +Wall Cave Vine Blue= +Wall Cave Vine Cyan= +Wall Cave Vine Violet= +Coral Bones Block Wall= +Coral Bones Brick Wall= +Crystal Cobblestone Wall= +Crystal Mossy Cobblestone Wall= +Cursed Sandstone Brick Wall= +Cursed Sandstone Block Wall= +Cursed Stone Carved Wall= +Forsaken Desert Cobblestone Wall= +Forsaken Desert Cobblestone Red Wall= +Forsaken Desert Brick Wall= +Forsaken Desert Brick Red Wall= +Forsaken Desert Engraved Stone Wall= +Mineral Cave Stone Wall= +Mineral Cave Cobblestone Wall= +Mineral Lava Stone with lava Wall= +Mineral Lava Stone without lava Wall= +Forsaken Desert Chiseled Stone= diff --git a/mods/everness/mapgen.lua b/mods/everness/mapgen.lua new file mode 100644 index 0000000..862c3dc --- /dev/null +++ b/mods/everness/mapgen.lua @@ -0,0 +1,170 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register ores +-- + +-- Scatter ores + +-- Pyrite + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:stone_with_pyrite', + wherein = 'default:stone', + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = 31000, + y_min = 1025, +}) + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:stone_with_pyrite', + wherein = 'default:stone', + clust_scarcity = 15 * 15 * 15, + clust_num_ores = 3, + clust_size = 2, + y_max = -256, + y_min = -511, +}) + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:stone_with_pyrite', + wherein = 'default:stone', + clust_scarcity = 13 * 13 * 13, + clust_num_ores = 5, + clust_size = 3, + y_max = -512, + y_min = -31000, +}) + +-- Quartz + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:quartz_ore', + wherein = { 'default:stone' }, + clust_scarcity = 10 * 10 * 10, + clust_num_ores = 6, + clust_size = 5, + y_max = -5, + y_min = -31000, +}) + +-- +-- Decorations +-- + +local all_biomes_mese_tree_place_on = { + 'everness:coral_desert_stone_with_moss', + 'everness:coral_sand', + 'everness:crystal_moss_block', + 'everness:crystal_sand', + 'everness:cursed_dirt', + 'everness:cursed_sand', + 'everness:cursed_stone', + 'everness:dirt_with_coral_grass', + 'everness:dirt_with_crystal_grass', + 'everness:dirt_with_cursed_grass', + 'everness:dirt_with_grass_1', + 'everness:dry_dirt', + 'everness:dry_dirt_with_dry_grass', + 'everness:forsaken_desert_brick', + 'everness:forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_engraved_stone', + 'everness:forsaken_desert_sand', + 'everness:forsaken_tundra_beach_sand', + 'everness:forsaken_tundra_dirt', + 'everness:forsaken_tundra_dirt_with_grass', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + 'everness:frosted_snowblock', + 'everness:sulfur_stone', + 'everness:volcanic_sulfur' +} + +if core.get_modpath('default') then + table.insert_all(all_biomes_mese_tree_place_on, { + 'default:desert_sand', + 'default:dirt', + 'default:dirt_with_coniferous_litter', + 'default:dirt_with_grass', + 'default:dirt_with_rainforest_litter', + 'default:dirt_with_snow', + 'default:dry_dirt', + 'default:dry_dirt_with_dry_grass', + 'default:gravel', + 'default:permafrost_with_moss', + 'default:permafrost_with_stones', + 'default:sand', + 'default:silver_sand', + 'default:stone' + }) +elseif core.get_modpath('mcl_core') then + table.insert_all(all_biomes_mese_tree_place_on, { + 'mcl_core:sand', + 'mcl_core:dirt', + 'mcl_core:podzol', + 'mcl_core:dirt_with_grass', + 'mcl_core:coarse_dirt', + 'mcl_core:gravel', + 'mcl_core:stone', + }) +end + +Everness:register_decoration({ + name = 'everness:all_biomes_mese_tree', + deco_type = 'schematic', + place_on = all_biomes_mese_tree_place_on, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + y_max = 250, + y_min = 80, + schematic = core.get_modpath('everness') .. '/schematics/everness_mese_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:all_biomes_mese_tree_2', + deco_type = 'schematic', + place_on = all_biomes_mese_tree_place_on, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + y_max = 250, + y_min = 80, + schematic = core.get_modpath('everness') .. '/schematics/everness_mese_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random' +}) diff --git a/mods/everness/mapgen_after.lua b/mods/everness/mapgen_after.lua new file mode 100644 index 0000000..7cf3881 --- /dev/null +++ b/mods/everness/mapgen_after.lua @@ -0,0 +1,126 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +if Everness.async_mapgen_active then + -- + -- Hybrid Async Mapgen Mode (Minetest 5.9.0+ / Luanti) + -- + -- The heavy VoxelManip manipulation, biome logic, and schematics are executed + -- on the dedicated background mapgen worker thread in `mapgen_async.lua`. + -- The main server thread on_generated below only executes post-generation tasks + -- that require the active ServerMap environment (node metadata, chest loot, fix_light). + -- + core.register_on_generated(function(minp, maxp, blockseed) + local rand = PcgRandom(blockseed) + local biomemap = core.get_mapgen_object('biomemap') or {} + local gennotify = core.get_mapgen_object('gennotify') or {} + local shared_args = {} + + local chunk_biomes = {} + for i = 1, #biomemap do + chunk_biomes[biomemap[i]] = true + end + + local active_defs = {} + for _, def in ipairs(Everness.on_generated_queue) do + if def.can_run(biomemap, chunk_biomes) then + table.insert(active_defs, def) + end + end + + if #active_defs == 0 then + return + end + + -- Populate loot chests placed by structures in this chunk + local chest_positions = core.find_nodes_in_area(minp, maxp, { 'everness:chest' }) + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + + -- Run any main-thread after_write_to_map handlers (e.g. core.fix_light, node placement) + for _, def in ipairs(active_defs) do + if def.after_write_to_map then + shared_args[def.name] = shared_args[def.name] or {} + def.after_write_to_map(shared_args[def.name], gennotify, rand, minp, maxp) + end + end + end) + return +end + +-- +-- Synchronous Mapgen Mode (Fallback for Minetest <= 5.8) +-- +-- Localize data buffer table outside the loop, to be re-used for all +-- mapchunks, therefore minimising memory use. +local data = {} +local p2data = {} + +core.register_on_generated(function(minp, maxp, blockseed) + local rand = PcgRandom(blockseed) + local biomemap = core.get_mapgen_object('biomemap') or {} + local gennotify = core.get_mapgen_object('gennotify') or {} + local vm, emin, emax = core.get_mapgen_object('voxelmanip') + local area = VoxelArea:new({ MinEdge = emin, MaxEdge = emax }) + vm:get_data(data) + vm:get_param2_data(p2data) + local shared_args = {} + + local chunk_biomes = {} + for i = 1, #biomemap do + chunk_biomes[biomemap[i]] = true + end + + local active_defs = {} + for _, def in ipairs(Everness.on_generated_queue) do + if def.can_run(biomemap, chunk_biomes) then + table.insert(active_defs, def) + end + end + + -- on_data + for _, def in ipairs(active_defs) do + if def.on_data then + shared_args[def.name] = shared_args[def.name] or {} + def.on_data(minp, maxp, area, data, p2data, gennotify, rand, shared_args[def.name], biomemap) + end + end + + vm:set_data(data) + vm:set_param2_data(p2data) + + -- after_set_data + for _, def in ipairs(active_defs) do + if def.after_set_data then + shared_args[def.name] = shared_args[def.name] or {} + def.after_set_data(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args[def.name]) + end + end + + vm:set_lighting({ day = 0, night = 0 }) + vm:calc_lighting() + vm:update_liquids() + vm:write_to_map() + + -- after_write_to_map + for _, def in ipairs(active_defs) do + if def.after_write_to_map then + shared_args[def.name] = shared_args[def.name] or {} + def.after_write_to_map(shared_args[def.name], gennotify, rand, minp, maxp) + end + end +end) diff --git a/mods/everness/mapgen_async.lua b/mods/everness/mapgen_async.lua new file mode 100644 index 0000000..2eb8d78 --- /dev/null +++ b/mods/everness/mapgen_async.lua @@ -0,0 +1,377 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. +--]] + +local path = core.get_modpath('everness') + +-- Shim missing main-thread engine registration/notification methods in the async mapgen environment +core.set_gen_notify = core.set_gen_notify or function() end +core.register_biome = core.register_biome or function() end +core.register_decoration = core.register_decoration or function() end +core.register_ore = core.register_ore or function() end +core.register_node = core.register_node or function() end +core.register_tool = core.register_tool or function() end +core.register_craftitem = core.register_craftitem or function() end +core.register_abm = core.register_abm or function() end +core.register_lbm = core.register_lbm or function() end +core.register_alias = core.register_alias or function() end +core.get_translator = core.get_translator or function() return function(s) return s end end +core.emerge_area = core.emerge_area or function() end +core.place_schematic = core.place_schematic or function() end +core.get_node = core.get_node or function() return { name = 'ignore' } end +core.set_node = core.set_node or function() end +core.remove_node = core.remove_node or function() end +core.get_biome_data = core.get_biome_data or function() return nil end +core.get_mapgen_setting = core.get_mapgen_setting or function() return nil end +core.dir_to_wallmounted = core.dir_to_wallmounted or function(dir) + if dir.y > 0.5 then return 1 + elseif dir.y < -0.5 then return 0 + elseif dir.x > 0.5 then return 5 + elseif dir.x < -0.5 then return 4 + elseif dir.z > 0.5 then return 3 + elseif dir.z < -0.5 then return 2 + end + return 0 +end + +core.registered_decorations = core.registered_decorations or {} +core.registered_nodes = core.registered_nodes or {} +core.registered_items = core.registered_items or {} +core.registered_biomes = core.registered_biomes or {} +core.registered_ores = core.registered_ores or {} + +-- Load API definitions in the isolated mapgen Lua environment +dofile(path .. '/api.lua') + +-- Load all enabled biome mapgen definitions to populate Everness.on_generated_queue +if Everness.settings.biomes.everness_bamboo_forest_under.enabled then + dofile(path .. '/mapgen_bamboo_forest_under.lua') +end +if Everness.settings.biomes.everness_bamboo_forest.enabled then + dofile(path .. '/mapgen_bamboo_forest.lua') +end +if Everness.settings.biomes.everness_baobab_savanna.enabled then + dofile(path .. '/mapgen_baobab_savanna.lua') +end +if Everness.settings.biomes.everness_coral_forest_dunes.enabled then + dofile(path .. '/mapgen_coral_forest_dunes.lua') +end +if Everness.settings.biomes.everness_coral_forest_ocean.enabled then + dofile(path .. '/mapgen_coral_forest_ocean.lua') +end +if Everness.settings.biomes.everness_coral_forest_deep_ocean.enabled then + dofile(path .. '/mapgen_coral_forest_deep_ocean.lua') +end +if Everness.settings.biomes.everness_coral_forest_under.enabled then + dofile(path .. '/mapgen_coral_forest_under.lua') +end +if Everness.settings.biomes.everness_coral_forest.enabled then + dofile(path .. '/mapgen_coral_forest.lua') +end +if Everness.settings.biomes.everness_crystal_forest_dunes.enabled then + dofile(path .. '/mapgen_crystal_forest_dunes.lua') +end +if Everness.settings.biomes.everness_crystal_forest_ocean.enabled then + dofile(path .. '/mapgen_crystal_forest_ocean.lua') +end +if Everness.settings.biomes.everness_crystal_forest_deep_ocean.enabled then + dofile(path .. '/mapgen_crystal_forest_deep_ocean.lua') +end +if Everness.settings.biomes.everness_crystal_forest_shore.enabled then + dofile(path .. '/mapgen_crystal_forest_shore.lua') +end +if Everness.settings.biomes.everness_crystal_forest_under.enabled then + dofile(path .. '/mapgen_crystal_forest_under.lua') +end +if Everness.settings.biomes.everness_crystal_forest.enabled then + dofile(path .. '/mapgen_crystal_forest.lua') +end +if Everness.settings.biomes.everness_cursed_lands_dunes.enabled then + dofile(path .. '/mapgen_cursed_lands_dunes.lua') +end +if Everness.settings.biomes.everness_cursed_lands_ocean.enabled then + dofile(path .. '/mapgen_cursed_lands_ocean.lua') +end +if Everness.settings.biomes.everness_cursed_lands_deep_ocean.enabled then + dofile(path .. '/mapgen_cursed_lands_deep_ocean.lua') +end +if Everness.settings.biomes.everness_cursed_lands_swamp.enabled then + dofile(path .. '/mapgen_cursed_lands_swamp.lua') +end +if Everness.settings.biomes.everness_cursed_lands_under.enabled then + dofile(path .. '/mapgen_cursed_lands_under.lua') +end +if Everness.settings.biomes.everness_cursed_lands.enabled then + dofile(path .. '/mapgen_cursed_lands.lua') +end +if Everness.settings.biomes.everness_forsaken_desert_ocean.enabled then + dofile(path .. '/mapgen_forsaken_desert_ocean.lua') +end +if Everness.settings.biomes.everness_forsaken_desert_under.enabled then + dofile(path .. '/mapgen_forsaken_desert_under.lua') +end +if Everness.settings.biomes.everness_forsaken_desert.enabled then + dofile(path .. '/mapgen_forsaken_desert.lua') +end +if Everness.settings.biomes.everness_forsaken_tundra_beach.enabled then + dofile(path .. '/mapgen_forsaken_tundra_beach.lua') +end +if Everness.settings.biomes.everness_forsaken_tundra_ocean.enabled then + dofile(path .. '/mapgen_forsaken_tundra_ocean.lua') +end +if Everness.settings.biomes.everness_forsaken_tundra_under.enabled then + dofile(path .. '/mapgen_forsaken_tundra_under.lua') +end +if Everness.settings.biomes.everness_forsaken_tundra.enabled then + dofile(path .. '/mapgen_forsaken_tundra.lua') +end +if Everness.settings.biomes.everness_frosted_icesheet_ocean.enabled then + dofile(path .. '/mapgen_frosted_icesheet_ocean.lua') +end +if Everness.settings.biomes.everness_frosted_icesheet_under.enabled then + dofile(path .. '/mapgen_frosted_icesheet_under.lua') +end +if Everness.settings.biomes.everness_frosted_icesheet.enabled then + dofile(path .. '/mapgen_frosted_icesheet.lua') +end +if Everness.settings.biomes.everness_mineral_waters.enabled then + dofile(path .. '/mapgen_mineral_waters.lua') +end +if Everness.settings.biomes.everness_mineral_waters_under.enabled then + dofile(path .. '/mapgen_mineral_waters_under.lua') +end + +-- Reusable data buffers for VoxelManip in the async worker thread +local data = {} +local p2data = {} + +-- Persistent content ID and group caches for async mapgen lookups +local cid_cache = {} +local group_cids_cache = {} + +local function safe_get_content_id(name) + local id = cid_cache[name] + if id ~= nil then + if id then + return id + end + return nil + end + local ok, res = pcall(core.get_content_id, name) + if ok and type(res) == 'number' then + cid_cache[name] = res + return res + end + cid_cache[name] = false + return nil +end + +local function get_group_cids(group_name) + local list = group_cids_cache[group_name] + if list then + return list + end + list = {} + for node_name in pairs(core.registered_nodes) do + if core.get_item_group(node_name, group_name) > 0 then + local id = safe_get_content_id(node_name) + if id and (not core.CONTENT_IGNORE or id ~= core.CONTENT_IGNORE) then + list[#list + 1] = id + end + end + end + group_cids_cache[group_name] = list + return list +end + +local function build_cids_map(nodenames) + local cids_map = {} + for _, name in ipairs(nodenames) do + if name:sub(1, 6) == 'group:' then + local g = name:sub(7) + local cids = get_group_cids(g) + for i = 1, #cids do + cids_map[cids[i]] = name + end + else + local id = safe_get_content_id(name) + if id then + cids_map[id] = name + end + end + end + return cids_map +end + +-- Async on_generated callback in Minetest 5.9.0+ / Luanti +-- Receives `vmanip` as the first argument; engine commits vmanip automatically on return +core.register_on_generated(function(vmanip, minp, maxp, blockseed) + local rand = PcgRandom(blockseed) + local biomemap = core.get_mapgen_object('biomemap') or {} + local gennotify = core.get_mapgen_object('gennotify') or {} + local emin, emax = vmanip:get_emerged_area() + local area = VoxelArea:new({ MinEdge = emin, MaxEdge = emax }) + + -- Fetch raw voxel data upfront for direct, high-performance array indexing + vmanip:get_data(data) + vmanip:get_param2_data(p2data) + + local c_air = core.get_content_id('air') + local ystride = area.ystride + + -- Expose VoxelManip-backed helper functions for structure / marker checks during mapgen + core.get_node = function(pos) + return vmanip:get_node_at(pos) + end + core.set_node = function(pos, node) + return vmanip:set_node_at(pos, node) + end + core.remove_node = function(pos) + return vmanip:set_node_at(pos, { name = 'air' }) + end + core.swap_node = function(pos, node) + return vmanip:set_node_at(pos, node) + end + + core.find_nodes_in_area = function(search_minp, search_maxp, nodenames, grouped) + if type(nodenames) == 'string' then + nodenames = { nodenames } + end + local cids_map = build_cids_map(nodenames) + + if grouped then + local res = {} + local counts = {} + for _, name in ipairs(nodenames) do + res[name] = {} + counts[name] = 0 + end + for z = search_minp.z, search_maxp.z do + for y = search_minp.y, search_maxp.y do + local vi = area:index(search_minp.x, y, z) + for x = search_minp.x, search_maxp.x do + local cid = data[vi] + local match_name = cids_map[cid] + if match_name then + local tbl = res[match_name] + tbl[#tbl + 1] = vector.new(x, y, z) + counts[match_name] = counts[match_name] + 1 + end + vi = vi + 1 + end + end + end + return res, counts + else + local res = {} + local counts = {} + for z = search_minp.z, search_maxp.z do + for y = search_minp.y, search_maxp.y do + local vi = area:index(search_minp.x, y, z) + for x = search_minp.x, search_maxp.x do + local cid = data[vi] + local match_name = cids_map[cid] + if match_name then + res[#res + 1] = vector.new(x, y, z) + counts[match_name] = (counts[match_name] or 0) + 1 + end + vi = vi + 1 + end + end + end + return res, counts + end + end + + core.emerge_area = function(search_minp, search_maxp, callback, extra_data) + if extra_data and extra_data.callback then + extra_data.callback(extra_data.data) + elseif callback then + callback(nil, 0, 0, extra_data) + end + end + + core.place_schematic = function(pos, schem, rot, repl, force, flags) + return core.place_schematic_on_vmanip(vmanip, pos, schem, rot, repl, force, flags) + end + + core.find_nodes_in_area_under_air = function(search_minp, search_maxp, nodenames) + if type(nodenames) == 'string' then + nodenames = { nodenames } + end + local cids_map = build_cids_map(nodenames) + local res = {} + + for z = search_minp.z, search_maxp.z do + for y = search_minp.y, search_maxp.y do + local vi = area:index(search_minp.x, y, z) + for x = search_minp.x, search_maxp.x do + local cid = data[vi] + if cids_map[cid] then + local vi_above = vi + ystride + if data[vi_above] == c_air then + res[#res + 1] = vector.new(x, y, z) + end + end + vi = vi + 1 + end + end + end + return res + end + + local chunk_biomes = {} + for i = 1, #biomemap do + chunk_biomes[biomemap[i]] = true + end + + local active_defs = {} + for _, def in ipairs(Everness.on_generated_queue) do + if def.can_run(biomemap, chunk_biomes) then + table.insert(active_defs, def) + end + end + + if #active_defs == 0 then + return + end + + local shared_args = {} + + -- 1. on_data: Raw VoxelManip content/param2 manipulation + for _, def in ipairs(active_defs) do + if def.on_data then + shared_args[def.name] = shared_args[def.name] or {} + def.on_data(minp, maxp, area, data, p2data, gennotify, rand, shared_args[def.name], biomemap) + end + end + + vmanip:set_data(data) + vmanip:set_param2_data(p2data) + + -- 2. after_set_data: Schematics placement on VoxelManip + for _, def in ipairs(active_defs) do + if def.after_set_data then + shared_args[def.name] = shared_args[def.name] or {} + def.after_set_data(minp, maxp, vmanip, area, data, p2data, gennotify, rand, shared_args[def.name]) + end + end + + -- 3. Lighting & Liquid calculation + vmanip:set_lighting({ day = 0, night = 0 }) + vmanip:calc_lighting() + vmanip:update_liquids() + -- Note: vmanip:write_to_map() is NOT called here because the engine automatically + -- writes and commits the async vmanip upon callback completion. +end) diff --git a/mods/everness/mapgen_bamboo_forest.lua b/mods/everness/mapgen_bamboo_forest.lua new file mode 100644 index 0000000..3e2fb4a --- /dev/null +++ b/mods/everness/mapgen_bamboo_forest.lua @@ -0,0 +1,538 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_bamboo_forest.y_max +local y_min = Everness.settings.biomes.everness_bamboo_forest.y_min + +-- Bamboo Forest + +Everness:register_biome({ + name = 'everness:bamboo_forest', + node_top = 'everness:dirt_with_grass_1', + depth_top = 1, + node_filler = 'everness:dirt_1', + depth_filler = 1, + node_riverbed = 'default:sand', + depth_riverbed = 2, + node_dungeon = 'everness:bamboo_wood', + node_dungeon_alt = 'everness:bamboo_mosaic_wood', + node_dungeon_stair = 'stairs:stair_bamboo_wood', + y_max = y_max, + y_min = y_min, + heat_point = 80, + humidity_point = 60, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:bamboo_forest_small_bamboo', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 80, + fill_ratio = 0.1, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_small_bamboo.mts', + flags = 'place_center_x, place_center_z, force_placement', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_large_bamboo', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 80, + fill_ratio = 0.1, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_large_bamboo.mts', + flags = 'place_center_x, place_center_z, force_placement', + rotation = 'random', +}) + +-- Jungle tree and log + +local jungle_tree_schem +local jungle_log_schem + +if core.get_modpath('default') then + jungle_tree_schem = core.get_modpath('default') .. '/schematics/jungle_tree.mts' + jungle_log_schem = core.get_modpath('default') .. '/schematics/jungle_log.mts' +elseif core.get_modpath('mcl_core') then + jungle_tree_schem = core.get_modpath('mcl_core') .. '/schematics/mcl_core_jungle_tree.mts' + jungle_log_schem = { + size = { x = 3, y = 3, z = 1 }, + data = { + { name = 'air', prob = 0 }, + { name = 'air', prob = 0 }, + { name = 'air', prob = 0 }, + { name = 'mcl_core:jungletree', param2 = 12 }, + { name = 'mcl_core:jungletree', param2 = 12 }, + { name = 'mcl_core:jungletree', param2 = 12, prob = 127 }, + { name = 'air', prob = 0 }, + { name = 'mcl_mushrooms:mushroom_brown', prob = 50 }, + { name = 'air', prob = 0 }, + }, + } +end + +if jungle_tree_schem then + Everness:register_decoration({ + name = 'everness:bamboo_forest_jungle_tree', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 16, + noise_params = { + offset = 0.0015, + scale = 0.0021, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + schematic = jungle_tree_schem, + flags = 'place_center_x, place_center_z', + rotation = 'random', + }) +end + +if jungle_log_schem then + Everness:register_decoration({ + name = 'everness:bamboo_forest_jungle_log', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_grass_1' }, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0015, + scale = 0.0021, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + schematic = jungle_log_schem, + flags = 'place_center_x', + rotation = 'random', + spawn_by = 'everness:dirt_with_grass_1', + num_spawn_by = 8, + }) +end + +-- Bush + +local bush_schem +local blueberry_bush_schem + +if core.get_modpath('default') then + bush_schem = core.get_modpath('default') .. '/schematics/bush.mts' + blueberry_bush_schem = core.get_modpath('default') .. '/schematics/blueberry_bush.mts' +elseif core.get_modpath('mcl_core') then + local everness_path = core.get_modpath('everness') + bush_schem = everness_path .. '/mod_support_mcl/schematics/bush.mts' + blueberry_bush_schem = everness_path .. '/mod_support_mcl/schematics/blueberry_bush.mts' +end + +if bush_schem then + Everness:register_decoration({ + name = 'everness:bamboo_forest_bush', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + schematic = bush_schem, + flags = 'place_center_x, place_center_z', + }) +end + +if blueberry_bush_schem then + Everness:register_decoration({ + name = 'everness:bamboo_forest_blueberry_bush', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_grass_1' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 697, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + place_offset_y = 1, + schematic = blueberry_bush_schem, + flags = 'place_center_x, place_center_z', + }) +end + +-- Flowers +local function register_flower_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:bamboo_forest_flowers_' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_grass_1' }, + param2 = 0, + param2_max = 3, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:flowers_' .. length, + }) +end + +register_flower_decoration(-0.03, 0.09, 4) +register_flower_decoration(-0.015, 0.075, 3) +register_flower_decoration(0, 0.06, 2) +register_flower_decoration(0.015, 0.045, 1) + +local function register_flower_magenta_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:bamboo_forest_flowers_magenta_' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_grass_1' }, + param2 = 0, + param2_max = 3, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:flowers_magenta_' .. length, + }) +end + +register_flower_magenta_decoration(-0.03, 0.09, 4) +register_flower_magenta_decoration(-0.015, 0.075, 3) +register_flower_magenta_decoration(0, 0.06, 2) +register_flower_magenta_decoration(0.015, 0.045, 1) + +-- Clovers +local function register_clover_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:bamboo_forest_clover_' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_grass_1' }, + param2 = 0, + param2_max = 3, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:clover_' .. length, + }) +end + +register_clover_decoration(-0.03, -0.09, 4) +register_clover_decoration(-0.015, -0.075, 3) +register_clover_decoration(0, -0.06, 2) +register_clover_decoration(0.015, -0.045, 1) + +-- Clovers with flowers +local function register_clover_with_flowers_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:bamboo_forest_clover_with_flowers_' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_grass_1' }, + param2 = 0, + param2_max = 3, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:bamboo_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:clover_with_flovers_' .. length, + }) +end + +register_clover_with_flowers_decoration(-0.03, -0.09, 4) +register_clover_with_flowers_decoration(-0.015, -0.075, 3) +register_clover_with_flowers_decoration(0, -0.06, 2) +register_clover_with_flowers_decoration(0.015, -0.045, 1) + +-- +-- On Generated +-- + +local disp = 16 +local chance = 20 +local schem = core.get_modpath('everness') .. '/schematics/everness_japanese_shrine.mts' + +local c_everness_bamboo_1 = core.get_content_id('everness:bamboo_1') +local c_everness_bamboo_2 = core.get_content_id('everness:bamboo_2') +local c_everness_bamboo_3 = core.get_content_id('everness:bamboo_3') +local c_everness_bamboo_4 = core.get_content_id('everness:bamboo_4') +local c_everness_bamboo_5 = core.get_content_id('everness:bamboo_5') +local c_dirt_with_grass_1 = core.get_content_id('everness:dirt_with_grass_1') +local c_dirt_with_grass_extras_1 = core.get_content_id('everness:dirt_with_grass_extras_1') +local c_dirt_with_grass_extras_2 = core.get_content_id('everness:dirt_with_grass_extras_2') + +local biome_id_bamboo_forest = core.get_biome_id('everness:bamboo_forest') + +local d_everness_bamboo_forest_small_bamboo = core.get_decoration_id('everness:bamboo_forest_small_bamboo') +local d_everness_bamboo_forest_large_bamboo = core.get_decoration_id('everness:bamboo_forest_large_bamboo') + +Everness:register_gen_notify_decoration({ + d_everness_bamboo_forest_small_bamboo, + d_everness_bamboo_forest_large_bamboo, +}) + +Everness:add_to_queue_on_generated({ + name = 'everness:bamboo_forest', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_bamboo_forest]) or table.indexof(biomemap, biome_id_bamboo_forest) ~= -1 + end, + on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args) + -- + -- Small Bamboo + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_bamboo_forest_small_bamboo or '')] or {}) do + local vi = area:indexp(pos) + local stalk_color = rand:next(0, 7) * 32 + local stalk_p2 = stalk_color + (p2data[vi + area.ystride] % 32) + for i = 1, 3 do + local cur_vi = vi + area.ystride * i + if data[cur_vi] == c_everness_bamboo_1 or data[cur_vi] == c_everness_bamboo_2 then + p2data[cur_vi] = stalk_p2 + end + end + end + + -- + -- Large Bamboo + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_bamboo_forest_large_bamboo or '')] or {}) do + -- For bamboo large this is position of the 'place_on' node, e.g. 'everness:dirt_with_grass_extras_2' + local vi = area:indexp(pos) + local while_counter = 1 + local bamboo_height = 0 + local last_vi = vi + area.ystride * while_counter + + local stalk_color = rand:next(0, 7) * 32 + local stalk_p2 = stalk_color + (p2data[vi + area.ystride] % 32) + + -- Get bamboo height and color each bamboo node + while data[last_vi] == c_everness_bamboo_3 do + p2data[last_vi] = stalk_p2 + bamboo_height = bamboo_height + 1 + while_counter = while_counter + 1 + last_vi = vi + area.ystride * while_counter + end + + -- Position of the top bamboo_3 node + last_vi = vi + area.ystride * bamboo_height + + -- Add top bamboo nodes with leaves based on their generated height + if bamboo_height > 4 then + for i = 1, 3 do + if data[last_vi + area.ystride * i] == core.CONTENT_AIR then + if i == 1 then + data[last_vi + area.ystride * i] = c_everness_bamboo_4 + else + data[last_vi + area.ystride * i] = c_everness_bamboo_5 + end + + p2data[last_vi + area.ystride * i] = stalk_p2 + end + end + else + for i = 1, 2 do + if data[last_vi + area.ystride * i] == core.CONTENT_AIR then + if i == 1 then + data[last_vi + area.ystride * i] = c_everness_bamboo_4 + else + data[last_vi + area.ystride * i] = c_everness_bamboo_5 + end + + p2data[last_vi + area.ystride * i] = stalk_p2 + end + end + end + end + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if + ( + data[vi + area.ystride] == core.CONTENT_AIR + or data[vi + area.ystride] == c_everness_bamboo_1 + or data[vi + area.ystride] == c_everness_bamboo_3 + ) + and ( + data[vi] == c_dirt_with_grass_1 + or data[vi] == c_dirt_with_grass_extras_1 + or data[vi] == c_dirt_with_grass_extras_2 + ) + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Japanese Shrine + -- + + local size = { x = 11, y = 19, z = 15 } + local size_x = math.round(size.x / 2) + local size_z = math.round(size.z / 2) + local schem_pos = vector.new(s_pos) + + -- find floor big enough + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:dirt_with_grass_1' + } + ) + -- Can force over these blocks + local force_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:dirt_with_grass_extras_1', + 'everness:dirt_with_grass_extras_2', + 'group:bamboo', + 'group:flower', + 'group:leaves' + } + ) + + if #positions + #force_positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air', + 'group:bamboo', + 'group:flower', + 'group:leaves' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_japanese_shrine = shared_args.schem_positions.everness_japanese_shrine or {} + + table.insert(shared_args.schem_positions.everness_japanese_shrine, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Japanese Shrine was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_bamboo_forest_under.lua b/mods/everness/mapgen_bamboo_forest_under.lua new file mode 100644 index 0000000..61b9afb --- /dev/null +++ b/mods/everness/mapgen_bamboo_forest_under.lua @@ -0,0 +1,239 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_bamboo_forest_under.y_max +local y_min = Everness.settings.biomes.everness_bamboo_forest_under.y_min + +-- Bamboo Forest Under + +Everness:register_biome({ + name = 'everness:bamboo_forest_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'everness:bamboo_wood', + node_dungeon_alt = 'everness:bamboo_mosaic_wood', + node_dungeon_stair = 'stairs:stair_bamboo_wood', + y_max = y_max, + y_min = y_min, + heat_point = 80, + humidity_point = 60, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 10, + biomes = { 'everness:bamboo_forest_under' }, + y_max = y_max, + y_min = y_min, + place_offset_y = -1, + flags = 'all_floors,force_placement', + decoration = { + 'everness:moss_block', + 'default:clay' + }, +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_ceiling', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = { 'everness:bamboo_forest_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { 'everness:moss_block' }, +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_forsythia_bush', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:bamboo_forest_under' }, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + flags = 'all_floors', + decoration = { 'everness:forsythia_bush' }, +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_vines', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + sidelen = 16, + fill_ratio = 0.09, + decoration = { + 'everness:vine_cave', + 'everness:vine_cave_with_mese_leaves' + }, + biomes = { 'everness:bamboo_forest_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_plants', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + param2 = 8, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:bamboo_forest_under' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:cave_flower' }, + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_plants_2', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + param2 = 8, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:bamboo_forest_under' }, + y_max = y_max - 1000 > y_min and y_max - 1000 or y_max, + y_min = y_min, + decoration = { 'everness:cave_flower_with_particles' }, + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:bamboo_forest_under_blue_vine_lantern', + deco_type = 'simple', + place_on = { + 'everness:moss_block', + 'default:clay' + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:bamboo_forest_under' }, + y_max = y_max - 1500 > y_min and y_max - 1500 or y_max, + y_min = y_min, + decoration = { 'everness:blue_vine_lantern' }, + flags = 'all_floors', +}) + +-- Luminous Mushrooms +local function register_luminous_mushroom_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:bamboo_forest_under_luminous_mushroom_' .. length, + deco_type = 'simple', + place_on = { + 'everness:moss_block', + 'default:clay' + }, + param2 = 0, + param2_max = 3, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:bamboo_forest_under' }, + y_max = y_max - 1500 > y_min and y_max - 1500 or y_max, + y_min = y_min, + decoration = 'everness:luminous_mushroom_' .. length, + flags = 'all_floors' + }) +end + +register_luminous_mushroom_decoration(-0.03, 0.09, 4) +register_luminous_mushroom_decoration(-0.015, 0.075, 3) +register_luminous_mushroom_decoration(0, 0.06, 2) +register_luminous_mushroom_decoration(0.015, 0.045, 1) + +-- Glossy Mushrooms +local function register_glossy_mushroom_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:bamboo_forest_under_glossy_mushroom_' .. length, + deco_type = 'simple', + place_on = { + 'everness:moss_block', + 'default:clay' + }, + param2 = 0, + param2_max = 3, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:bamboo_forest_under' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:glossy_mushroom_' .. length, + flags = 'all_floors' + }) +end + +register_glossy_mushroom_decoration(-0.03, -0.09, 4) +register_glossy_mushroom_decoration(-0.015, -0.075, 3) +register_glossy_mushroom_decoration(0, -0.06, 2) +register_glossy_mushroom_decoration(0.015, -0.045, 1) diff --git a/mods/everness/mapgen_baobab_savanna.lua b/mods/everness/mapgen_baobab_savanna.lua new file mode 100644 index 0000000..eff8f1a --- /dev/null +++ b/mods/everness/mapgen_baobab_savanna.lua @@ -0,0 +1,279 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_baobab_savanna.y_max +local y_min = Everness.settings.biomes.everness_baobab_savanna.y_min + +-- Baobab Savanna + +Everness:register_biome({ + name = 'everness:baobab_savanna', + node_top = 'everness:dry_dirt_with_dry_grass', + depth_top = 1, + node_filler = 'everness:dry_dirt', + depth_filler = 1, + node_riverbed = 'default:sand', + depth_riverbed = 2, + node_dungeon = 'default:cobble', + node_dungeon_alt = 'default:mossycobble', + node_dungeon_stair = 'stairs:stair_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 80, + humidity_point = 30, +}) + +-- +-- Register decorations +-- + +-- Savanna bare dirt patches. +-- Must come before all savanna decorations that are placed on dry grass. +-- Noise is similar to long dry grass noise, but scale inverted, to appear +-- where long dry grass is least dense and shortest. + +Everness:register_decoration({ + name = 'everness:baobab_savanna_dry_dirt_with_dry_grass', + deco_type = 'simple', + place_on = { 'everness:dry_dirt_with_dry_grass' }, + sidelen = 4, + noise_params = { + offset = -1.5, + scale = -1.5, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 4, + persist = 1.0 + }, + biomes = { 'everness:baobab_savanna' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:dry_dirt', + place_offset_y = -1, + flags = 'force_placement', +}) + +Everness:register_decoration({ + name = 'everness:baobab_savanna_baobab_tree_1', + deco_type = 'schematic', + place_on = { 'everness:dry_dirt_with_dry_grass', 'everness:dry_dirt' }, + spawn_by = { 'everness:dry_dirt_with_dry_grass', 'everness:dry_dirt' }, + num_spawn_by = 8, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:baobab_savanna' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_baobab_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:baobab_savanna_baobab_tree_2', + deco_type = 'schematic', + place_on = { 'everness:dry_dirt_with_dry_grass', 'everness:dry_dirt' }, + spawn_by = { 'everness:dry_dirt_with_dry_grass', 'everness:dry_dirt' }, + num_spawn_by = 8, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 90155, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:baobab_savanna' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_baobab_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:baobab_savanna_baobab_log', + deco_type = 'schematic', + place_on = { 'everness:dry_dirt_with_dry_grass' }, + sidelen = 16, + place_offset_y = 1, + noise_params = { + offset = 0, + scale = 0.001, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:baobab_savanna' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_baobab_log.mts', + flags = 'place_center_x', + rotation = 'random', + spawn_by = 'everness:dry_dirt_with_dry_grass', + num_spawn_by = 8, +}) + +-- Dry grasses + +local function register_dry_grass_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:dry_grass_' .. length, + deco_type = 'simple', + place_on = { 'everness:dry_dirt_with_dry_grass' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:baobab_savanna' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:dry_grass_' .. length, + param2 = 0, + param2_max = 239, + }) +end + +register_dry_grass_decoration(0.01, 0.05, 4) +register_dry_grass_decoration(0.03, 0.03, 3) +register_dry_grass_decoration(0.05, 0.01, 2) +register_dry_grass_decoration(0.07, -0.01, 1) + +-- +-- On Generated +-- + +local disp = 16 +local chance = 100 +local schem = core.get_modpath('everness') .. '/schematics/everness_giant_sequoia_tree.mts' +local size = { x = 25, y = 75, z = 25 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +local baobab_tree_size = { x = 24, y = 39, z = 24 } +local baobab_tree_size_x = math.round(baobab_tree_size.x / 2) +local baobab_tree_size_z = math.round(baobab_tree_size.z / 2) + +local biome_id_baobab_savanna = core.get_biome_id('everness:baobab_savanna') + +local deco_ids_baobab = { + core.get_decoration_id('everness:baobab_savanna_baobab_tree_1'), + core.get_decoration_id('everness:baobab_savanna_baobab_tree_2') +} + +if #deco_ids_baobab > 1 then + Everness:register_gen_notify_decoration(deco_ids_baobab) +end + +Everness:add_to_queue_on_generated({ + name = 'everness:baobab_savanna', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_baobab_savanna]) or table.indexof(biomemap, biome_id_baobab_savanna) ~= -1 + end, + after_write_to_map = function(shared_args, gennotify, rand, minp, maxp) + -- + -- Baobab Tree - fix light + -- + for _, deco_id in ipairs(deco_ids_baobab) do + for _, pos in ipairs(gennotify['decoration#' .. (deco_id or '')] or {}) do + core.fix_light( + vector.new(pos.x - baobab_tree_size_x, pos.y - 1, pos.z - baobab_tree_size_z), + vector.new(pos.x + baobab_tree_size_x, pos.y + baobab_tree_size.y, pos.z + baobab_tree_size_z) + ) + end + end + + -- + -- Giant Sequoia (placed on main thread via emerge_area to prevent chunk boundary cut-offs) + -- + if minp and maxp and rand and rand:next(0, 100) < chance then + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + local target_x = minp.x + math.floor(sidelength / 2) + x_disp + local target_z = minp.z + math.floor(sidelength / 2) + z_disp + + local ground_nodes = core.find_nodes_in_area_under_air( + vector.new(target_x, minp.y, target_z), + vector.new(target_x, maxp.y, target_z), + { + 'everness:dry_dirt_with_dry_grass', + 'everness:dry_dirt' + } + ) + + if #ground_nodes > 0 then + local s_pos = ground_nodes[1] + + core.emerge_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + function(blockpos, action, calls_remaining, param) + Everness:emerge_area(blockpos, action, calls_remaining, param) + end, + { + callback = function() + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:dry_dirt_with_dry_grass', + 'everness:dry_dirt', + 'group:flora', + 'group:flower' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + core.place_schematic( + s_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + core.log('action', '[Everness] Giant Sequoia was placed at ' .. s_pos:to_string()) + end + } + ) + end + end + end +}) diff --git a/mods/everness/mapgen_coral_forest.lua b/mods/everness/mapgen_coral_forest.lua new file mode 100644 index 0000000..e0d1ad6 --- /dev/null +++ b/mods/everness/mapgen_coral_forest.lua @@ -0,0 +1,312 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_coral_forest.y_max +local y_min = Everness.settings.biomes.everness_coral_forest.y_min + +-- Coral Forest + +Everness:register_biome({ + name = 'everness:coral_forest', + node_top = 'everness:dirt_with_coral_grass', + depth_top = 1, + node_filler = 'everness:coral_dirt', + depth_filler = 1, + node_riverbed = 'everness:coral_dirt', + depth_riverbed = 2, + node_stone = 'everness:coral_desert_stone', + node_dungeon = 'everness:coral_desert_stone_block', + node_dungeon_alt = 'everness:coral_desert_stone_brick', + node_dungeon_stair = 'stairs:stair_coral_desert_stone_block', + y_max = y_max, + y_min = y_min, + heat_point = 60, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Coral sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_sand', + wherein = { 'everness:coral_desert_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_dirt', + wherein = { 'everness:coral_desert_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:coral_desert_stone_with_coal', + wherein = 'everness:coral_desert_stone', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:coral_forest' } +}) + +-- +-- Register decorations +-- + +-- Coral Forest + +local chunksize = tonumber(core.get_mapgen_setting('chunksize')) or 5 + +if chunksize >= 5 then + Everness:register_decoration({ + name = 'everness:coral_forest_coral_tree', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_coral_grass' }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0.0015, + scale = 0.0021, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_coral_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', + spawn_by = 'everness:dirt_with_coral_grass', + num_spawn_by = 8, + }) +end + +Everness:register_decoration({ + name = 'everness:coral_forest_coral_bones_tree', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_coral_grass' }, + sidelen = 16, + place_offset_y = -1, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_coral_bones_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_coral_burdock', + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:coral_burdock_1', 'everness:coral_burdock_2' }, + spawn_by = 'everness:coral_tree', + param2 = 8 +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_coral_bush', + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand', 'everness:coral_white_sand' }, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:coral_bush' +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_coral_shrub', + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand', 'everness:coral_white_sand' }, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 1220999, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:coral_shrub' +}) + +local function register_coral_grass_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:coral_forest_coral_grass_' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:coral_grass_' .. length, + param2 = 0, + param2_max = 239, + }) +end + +-- Grasses + +register_coral_grass_decoration(-0.03, 0.09, 5) +register_coral_grass_decoration(-0.015, 0.075, 4) +register_coral_grass_decoration(0, 0.06, 3) +register_coral_grass_decoration(0.015, 0.045, 2) +register_coral_grass_decoration(0.03, 0.03, 1) + +-- Staghorn Coral + +local function register_staghorn_coral_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:coral_forest_staghorn_coral_' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand' }, + param2 = 0, + param2_max = 3, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:staghorn_coral_' .. length + }) +end + +register_staghorn_coral_decoration(-0.03, -0.09, 3) +register_staghorn_coral_decoration(-0.015, -0.075, 2) +register_staghorn_coral_decoration(0, -0.06, 1) + +-- +-- On Generated +-- + +local deco_id_coral_bones_tree = core.get_decoration_id('everness:coral_forest_coral_bones_tree') +local biome_id_coral_forest = core.get_biome_id('everness:coral_forest') +local coral_bones_tree_size = { x = 16, y = 35, z = 16 } + +Everness:register_gen_notify_decoration(deco_id_coral_bones_tree) + +Everness:add_to_queue_on_generated({ + name = 'everness:coral_forest', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_coral_forest]) or table.indexof(biomemap, biome_id_coral_forest) ~= -1 + end, + after_write_to_map = function(shared_args, gennotify) + -- + -- Coral bone tree - fix light + -- + for _, pos in ipairs(gennotify['decoration#' .. (deco_id_coral_bones_tree or '')] or {}) do + core.fix_light( + vector.round(vector.new(pos.x - (coral_bones_tree_size.x / 2), pos.y, pos.z - (coral_bones_tree_size.z / 2))), + vector.round(vector.new(pos.x + (coral_bones_tree_size.x / 2), pos.y + coral_bones_tree_size.y, pos.z + (coral_bones_tree_size.z / 2))) + ) + end + end +}) diff --git a/mods/everness/mapgen_coral_forest_deep_ocean.lua b/mods/everness/mapgen_coral_forest_deep_ocean.lua new file mode 100644 index 0000000..0454728 --- /dev/null +++ b/mods/everness/mapgen_coral_forest_deep_ocean.lua @@ -0,0 +1,449 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_coral_forest_deep_ocean.y_max +local y_min = Everness.settings.biomes.everness_coral_forest_deep_ocean.y_min + +-- Coral Forest Ocean + +Everness:register_biome({ + name = 'everness:coral_forest_deep_ocean', + node_top = 'everness:coral_forest_deep_ocean_sand', + depth_top = 1, + node_filler = 'everness:coral_forest_deep_ocean_sand', + depth_filler = 3, + node_riverbed = 'everness:coral_forest_deep_ocean_sand', + depth_riverbed = 2, + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:coral_deep_ocean_sandstone_block', + node_dungeon_alt = 'everness:coral_deep_ocean_sandstone_brick', + node_dungeon_stair = 'stairs:stair_coral_deep_ocean_sandstone_block', + y_max = y_max, + y_min = y_min, + heat_point = 60, + humidity_point = 50, +}) + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Coral Desert Stone + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_desert_stone', + wherein = { 'default:stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest_deep_ocean' } +}) + +-- +-- Register decorations +-- + +-- Coral reef + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_coral_reef_pink', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:coral_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_reef_pink.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_coral_reef_cyan', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:coral_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_reef_cyan.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_coral_reef_green', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:coral_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_reef_green.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_coral_reef_red', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:coral_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_reef_red.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:everness_coral_forest_deep_ocean_pink', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = { 'everness:coral_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_pink.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:everness_coral_forest_deep_ocean_cyan', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = { 'everness:coral_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_cyan.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:everness_coral_forest_deep_ocean_green', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = { 'everness:coral_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_green.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:everness_coral_forest_deep_ocean_red', + deco_type = 'schematic', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = { 'everness:coral_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_coral_red.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_mud', + deco_type = 'simple', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + fill_ratio = 0.002, + biomes = { 'everness:coral_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:coral_deep_ocean_mud' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_plants_1', + deco_type = 'simple', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:coral_forest_deep_ocean_coral_plant_1' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_plants_2', + deco_type = 'simple', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:coral_forest_deep_ocean_coral_plant_2' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_deep_ocean_plants_3', + deco_type = 'simple', + place_on = { 'everness:coral_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 19822, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:coral_forest_deep_ocean_coral_plant_3' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +-- +-- On Generated +-- + +local c_water_source = core.get_content_id('mapgen_water_source') +local c_everness_coral_forest_deep_ocean_sand = core.get_content_id('everness:coral_forest_deep_ocean_sand') +local c_everness_coral_forest_deep_ocean_coral_plant_1 = core.get_content_id('everness:coral_forest_deep_ocean_coral_plant_1') +local c_everness_coral_forest_deep_ocean_coral_plant_2 = core.get_content_id('everness:coral_forest_deep_ocean_coral_plant_2') +local c_everness_coral_forest_deep_ocean_coral_plant_3 = core.get_content_id('everness:coral_forest_deep_ocean_coral_plant_3') +local c_everness_coral_forest_deep_ocean_coral_1 = core.get_content_id('everness:coral_forest_deep_ocean_coral_1') +local c_everness_coral_forest_deep_ocean_coral_2 = core.get_content_id('everness:coral_forest_deep_ocean_coral_2') +local c_everness_coral_forest_deep_ocean_coral_3 = core.get_content_id('everness:coral_forest_deep_ocean_coral_3') +local c_everness_coral_forest_deep_ocean_coral_4 = core.get_content_id('everness:coral_forest_deep_ocean_coral_4') +-- Biome IDs +local biome_id_everness_coral_forest_deep_ocean = core.get_biome_id('everness:coral_forest_deep_ocean') + +local chance = 30 +local schem = core.get_modpath('everness') .. '/schematics/everness_coral_forest_deep_ocean_house.mts' +local size = { x = 11, y = 17, z = 12 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +Everness:add_to_queue_on_generated({ + name = 'everness:coral_forest_deep_ocean', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_coral_forest_deep_ocean]) or table.indexof(biomemap, biome_id_everness_coral_forest_deep_ocean) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + shared_args.schem_positions = {} + local schem_placed = false + + if rand:next(0, 100) < chance then + for y = maxp.y, minp.y, -1 do + if schem_placed then + break + end + + for z = minp.z, maxp.z do + if schem_placed then + break + end + + for x = minp.x, maxp.x do + local vi = area:index(x, y, z) + + if + data[vi] == c_everness_coral_forest_deep_ocean_sand + and data[vi + area.ystride] == c_water_source + then + local s_pos = area:position(vi) + + -- + -- Coral Forest Deep Ocean House + -- + + local schem_pos = vector.new(s_pos) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + c_everness_coral_forest_deep_ocean_sand, + c_everness_coral_forest_deep_ocean_coral_plant_1, + c_everness_coral_forest_deep_ocean_coral_plant_2, + c_everness_coral_forest_deep_ocean_coral_plant_3, + c_everness_coral_forest_deep_ocean_coral_1, + c_everness_coral_forest_deep_ocean_coral_2, + c_everness_coral_forest_deep_ocean_coral_3, + c_everness_coral_forest_deep_ocean_coral_4 + }, + data, + area + ) + + if #indexes < size.x * size.z then + -- not enough space + return + end + + -- enough water to place structure ? + local water_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + c_water_source + }, + data, + area + ) + + if #water_indexes > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + schem_placed = true + + shared_args.schem_positions.everness_coral_forest_deep_ocean_house = shared_args.schem_positions.everness_coral_forest_deep_ocean_house or {} + + table.insert(shared_args.schem_positions.everness_coral_forest_deep_ocean_house, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Coral Forest Deep Ocean House was placed at ' .. schem_pos:to_string()) + + break + end + end + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_coral_forest_dunes.lua b/mods/everness/mapgen_coral_forest_dunes.lua new file mode 100644 index 0000000..26240c8 --- /dev/null +++ b/mods/everness/mapgen_coral_forest_dunes.lua @@ -0,0 +1,303 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_coral_forest_dunes.y_max +local y_min = Everness.settings.biomes.everness_coral_forest_dunes.y_min + +-- Coral Forest Dunes + +Everness:register_biome({ + name = 'everness:coral_forest_dunes', + node_top = 'everness:coral_sand', + depth_top = 1, + node_filler = 'everness:coral_sand', + depth_filler = 3, + node_riverbed = 'everness:coral_sand', + depth_riverbed = 2, + node_stone = 'everness:coral_desert_stone', + node_dungeon = 'everness:coral_sandstone', + node_dungeon_alt = 'everness:coral_sandstone_brick', + node_dungeon_stair = 'stairs:stair_coral_sandstone', + vertical_blend = 1, + y_max = y_max, + y_min = y_min, + heat_point = 60, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Coral sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_sand', + wherein = { 'everness:coral_desert_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest_dunes' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_dirt', + wherein = { 'everness:coral_desert_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest_dunes' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:coral_desert_stone_with_coal', + wherein = 'everness:coral_desert_stone', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:coral_forest_dunes' } +}) + +-- +-- Register decorations +-- + +-- Coral Forest Dunes + +Everness:register_decoration({ + name = 'everness:coral_forest_dunes_coral_volcano', + deco_type = 'schematic', + place_on = { 'everness:coral_sand' }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = { x = 100, y = 100, z = 100 }, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest_dunes' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('x_clay') + and core.get_modpath('everness') .. '/schematics/everness_coral_volcano_x_clay.mts' + or core.get_modpath('everness') .. '/schematics/everness_coral_volcano.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', + spawn_by = 'everness:coral_sand', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_dunes_coral_bush', + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand', 'everness:coral_white_sand' }, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest_dunes' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:coral_bush' +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_dunes_coral_shrub', + deco_type = 'simple', + place_on = { 'everness:dirt_with_coral_grass', 'everness:coral_sand', 'everness:coral_white_sand' }, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 1220999, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest_dunes' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:coral_shrub' +}) + +-- +-- On Generated +-- + +local disp = 16 +local chance = 5 +local water_level = tonumber(core.settings:get('water_level')) or 1 +local schem = core.get_modpath('everness') .. '/schematics/everness_coral_forest_ocean_fishing_dock.mts' +local size = { x = 26, y = 10, z = 23 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 1 + +local c_water_source = core.get_content_id('mapgen_water_source') + +local biome_id_everness_coral_forest_dunes = core.get_biome_id('everness:coral_forest_dunes') + +Everness:add_to_queue_on_generated({ + name = 'everness:coral_forest_dunes', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_coral_forest_dunes]) or table.indexof(biomemap, biome_id_everness_coral_forest_dunes) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + if rand:next(0, 100) < chance then + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == core.CONTENT_AIR + and data[vi] == c_water_source + -- Water Level + and water_level >= minp.y + and water_level <= maxp.y + then + local s_pos = area:position(vi) + + -- + -- Coral Forest Ocean Fishing Dock + -- + + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + c_water_source, + core.CONTENT_AIR + }, + data, + area + ) + + if #indexes < size.x * size.z then + -- not enough space + return + end + + -- enough space to place structure ? + local space_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + c_water_source, + core.CONTENT_AIR + }, + data, + area + ) + + if #space_indexes > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock = shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock or {} + + table.insert(shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Coral Forest Ocean Fishing Dock was placed at ' .. schem_pos:to_string()) + + break + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_coral_forest_ocean.lua b/mods/everness/mapgen_coral_forest_ocean.lua new file mode 100644 index 0000000..e3c9214 --- /dev/null +++ b/mods/everness/mapgen_coral_forest_ocean.lua @@ -0,0 +1,284 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_coral_forest_ocean.y_max +local y_min = Everness.settings.biomes.everness_coral_forest_ocean.y_min + +-- Coral Forest Ocean + +Everness:register_biome({ + name = 'everness:coral_forest_ocean', + node_top = 'everness:coral_white_sand', + depth_top = 1, + node_filler = 'everness:coral_white_sand', + depth_filler = 3, + node_riverbed = 'everness:coral_white_sand', + depth_riverbed = 2, + node_stone = 'everness:coral_desert_stone', + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:coral_desert_cobble', + node_dungeon_alt = 'everness:coral_desert_mossy_cobble', + node_dungeon_stair = 'stairs:stair_coral_desert_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 60, + humidity_point = 50, +}) + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Clay + +Everness:register_ore({ + ore_type = 'blob', + ore = 'default:clay', + wherein = { 'everness:coral_white_sand' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest_ocean' } +}) + +-- Coral sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_sand', + wherein = { 'everness:coral_desert_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest_ocean' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_dirt', + wherein = { 'everness:coral_desert_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest_ocean' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:coral_desert_stone_with_coal', + wherein = 'everness:coral_desert_stone', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:coral_forest_ocean' } +}) + +-- +-- Register decorations +-- + +-- Coral Forest Under + +-- Coral reef + +Everness:register_decoration({ + name = 'everness:coral_forest_ocean_corals', + deco_type = 'simple', + place_on = { 'everness:coral_white_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:coral_forest_ocean' }, + y_max = y_max - 5 > y_min and y_max - 5 or y_max, + y_min = y_max - 11 > y_min and y_max - 11 or y_min, + flags = 'force_placement', + decoration = { + 'everness:coral_corals', + 'everness:coral_jellyfish', + 'everness:coral_skeleton' + }, +}) + +-- +-- On Generated +-- + +local disp = 16 +local chance = 5 +local water_level = tonumber(core.settings:get('water_level')) or 1 +local schem = core.get_modpath('everness') .. '/schematics/everness_coral_forest_ocean_fishing_dock.mts' +local size = { x = 26, y = 10, z = 23 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 1 + +local c_water_source = core.get_content_id('mapgen_water_source') + +local biome_id_everness_coral_forest_ocean = core.get_biome_id('everness:coral_forest_ocean') + +Everness:add_to_queue_on_generated({ + name = 'everness:coral_forest_ocean', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_coral_forest_ocean]) or table.indexof(biomemap, biome_id_everness_coral_forest_ocean) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + if rand:next(0, 100) < chance then + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == core.CONTENT_AIR + and data[vi] == c_water_source + -- Water Level + and water_level >= minp.y + and water_level <= maxp.y + then + local s_pos = area:position(vi) + + -- + -- Coral Forest Ocean Fishing Dock + -- + + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + c_water_source, + core.CONTENT_AIR + }, + data, + area + ) + + if #indexes < size.x * size.z then + -- not enough space + return + end + + -- enough space to place structure ? + local space_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + c_water_source, + core.CONTENT_AIR + }, + data, + area + ) + + if #space_indexes > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock = shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock or {} + + table.insert(shared_args.schem_positions.everness_coral_forest_ocean_fishing_dock, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Coral Forest Ocean Fishing Dock was placed at ' .. schem_pos:to_string()) + + break + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_coral_forest_under.lua b/mods/everness/mapgen_coral_forest_under.lua new file mode 100644 index 0000000..b199017 --- /dev/null +++ b/mods/everness/mapgen_coral_forest_under.lua @@ -0,0 +1,290 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_coral_forest_under.y_max +local y_min = Everness.settings.biomes.everness_coral_forest_under.y_min + +-- Coral Forest Under + +Everness:register_biome({ + name = 'everness:coral_forest_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'everness:coral_desert_cobble', + node_dungeon_alt = 'everness:coral_desert_mossy_cobble', + node_dungeon_stair = 'stairs:stair_coral_desert_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 60, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Coral Desert Stone + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:coral_desert_stone', + wherein = { 'default:stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:coral_forest_under' } +}) + +-- +-- Register decorations +-- + +-- Coral Forest Under + +Everness:register_decoration({ + name = 'everness:coral_forest_under_desert_stone_with_moss_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 10, + biomes = { 'everness:coral_forest_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_floors, force_placement', + decoration = { + 'everness:coral_desert_stone_with_moss' + }, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_under_mold_stone_ceilings', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = { 'everness:coral_forest_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { + 'everness:moss_block' + }, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_under_coral_tree_bioluminescent', + deco_type = 'simple', + place_on = { 'everness:coral_desert_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:coral_forest_under' }, + y_max = y_max - 1500 > y_min and y_max - 1500 or y_max, + y_min = y_min, + flags = 'all_floors', + decoration = { + 'everness:marker' + }, +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_under_coral_plant_bioluminescent', + deco_type = 'simple', + place_on = { 'everness:coral_desert_stone_with_moss' }, + param2 = 8, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest_under' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:coral_plant_bioluminescent', + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_under_lumecorn', + deco_type = 'simple', + place_on = { 'everness:coral_desert_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:coral_forest_under' }, + y_max = y_max - 1000 > y_min and y_max - 1000 or y_max, + y_min = y_min, + decoration = 'everness:lumecorn', + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_under_vines', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + sidelen = 16, + fill_ratio = 0.09, + biomes = { 'everness:coral_forest_under' }, + param2 = 8, + decoration = { + 'everness:lumabus_vine_1', + 'everness:lumabus_vine_2', + 'everness:flowered_vine_1', + 'everness:flowered_vine_2' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:coral_forest_under_plants', + deco_type = 'simple', + place_on = { 'everness:coral_desert_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:coral_forest_under' }, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = { + 'everness:coral_grass_orange', + 'everness:globulagus', + 'everness:coral_grass_tall', + }, + flags = 'all_floors', +}) + +-- +-- On Generated +-- + +local biome_id_everness_coral_forest_under = core.get_biome_id('everness:coral_forest_under') + +local deco_id_coral_forest_under_coral_tree_bioluminescent = core.get_decoration_id('everness:coral_forest_under_coral_tree_bioluminescent') + +local schem_bioluminescent_tree = core.get_modpath('everness') .. '/schematics/everness_coral_tree_bioluminescent.mts' +local coral_bioluminescent_tree_size = { x = 15, y = 17, z = 15 } +local bioluminescent_tree_size_x = math.round(coral_bioluminescent_tree_size.x / 2) +local bioluminescent_tree_size_z = math.round(coral_bioluminescent_tree_size.z / 2) +local bioluminescent_tree_safe_volume = (coral_bioluminescent_tree_size.x * coral_bioluminescent_tree_size.y * coral_bioluminescent_tree_size.z) / 1.5 +local bioluminescent_tree_y_dis = 1 +local bioluminescent_tree_place_on = Everness.to_set(core.registered_decorations['everness:coral_forest_under_coral_tree_bioluminescent'].place_on) + +Everness:register_gen_notify_decoration(deco_id_coral_forest_under_coral_tree_bioluminescent) + +Everness:add_to_queue_on_generated({ + name = 'everness:coral_forest_under', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_coral_forest_under]) or table.indexof(biomemap, biome_id_everness_coral_forest_under) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + -- + -- Coral Tree Bioluminescent + -- + for _, pos in ipairs(gennotify['decoration#' .. (deco_id_coral_forest_under_coral_tree_bioluminescent or '')] or {}) do + -- `pos` is position of the 'place_on' node + local marker_pos = vector.new(pos.x, pos.y + 1, pos.z) + local marker_node = core.get_node(marker_pos) + local place_on_node = core.get_node(pos) + + if marker_node and marker_node.name == 'everness:marker' then + -- remove marker + core.remove_node(marker_pos) + + if place_on_node and bioluminescent_tree_place_on[place_on_node.name] then + -- enough air to place structure ? + local positions = core.find_nodes_in_area( + vector.new( + pos.x - bioluminescent_tree_size_x, + pos.y - bioluminescent_tree_y_dis, + pos.z - bioluminescent_tree_size_z + ), + vector.new( + pos.x + bioluminescent_tree_size_x, + pos.y - bioluminescent_tree_y_dis + coral_bioluminescent_tree_size.y, + pos.z + bioluminescent_tree_size_z + ), + { + 'air', + 'everness:coral_tree' + }, + true + ) + + local air = positions.air or {} + local tree = positions['everness:coral_tree'] or {} + + -- do not overlap another tree + if #tree == 0 and #air > bioluminescent_tree_safe_volume then + core.place_schematic_on_vmanip( + vm, + vector.new(marker_pos.x, marker_pos.y - bioluminescent_tree_y_dis, marker_pos.z), + schem_bioluminescent_tree, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + -- core.log('action', '[Everness] Coral Tree Bioluminescent was placed at ' .. pos:to_string()) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_crystal_forest.lua b/mods/everness/mapgen_crystal_forest.lua new file mode 100644 index 0000000..716399d --- /dev/null +++ b/mods/everness/mapgen_crystal_forest.lua @@ -0,0 +1,569 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_crystal_forest.y_max +local y_min = Everness.settings.biomes.everness_crystal_forest.y_min + +-- Crystal Forest + +Everness:register_biome({ + name = 'everness:crystal_forest', + node_top = 'everness:dirt_with_crystal_grass', + depth_top = 1, + node_filler = 'everness:crystal_dirt', + depth_filler = 1, + node_riverbed = 'everness:crystal_dirt', + depth_riverbed = 2, + node_stone = 'everness:crystal_stone', + node_dungeon = 'everness:crystal_cobble', + node_dungeon_alt = 'everness:crystal_mossy_cobble', + node_dungeon_stair = 'stairs:stair_crystal_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 35, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Crystal sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_sand', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_dirt', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:crystal_stone_with_coal', + wherein = 'everness:crystal_stone', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:crystal_forest' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:crystal_forest_crystal_mushrooms', + deco_type = 'simple', + place_on = { 'everness:dirt_with_crystal_grass' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:crystal_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:crystal_mushrooms', + param2 = 40 +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_crystal_tree', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_crystal_grass' }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:crystal_forest' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_crystal_tree_large', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_crystal_grass' }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.001, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:crystal_forest' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_tree_large.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_crystal_bush', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_crystal_grass' }, + sidelen = 16, + place_offset_y = 1, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:crystal_forest' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_bush.mts', + flags = 'place_center_x, place_center_z', +}) + +local function register_crystal_grass_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:crystal_forest_crystal_grass_' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_crystal_grass' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:crystal_forest' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:crystal_grass_' .. length, + param2 = 0, + param2_max = 239, + }) +end + +-- Crystal Grasses + +register_crystal_grass_decoration(-0.03, 0.09, 3) +register_crystal_grass_decoration(-0.015, 0.075, 2) +register_crystal_grass_decoration(0, 0.06, 1) + +-- +-- On Generated +-- + +local chance = 20 +local disp = 16 +local schem = core.get_modpath('everness') .. '/schematics/everness_quartz_temple.mts' +local size = { x = 16, y = 13, z = 16 } +local math_sin = math.sin +local math_floor = math.floor +local math_sqrt = math.sqrt +local math_min = math.min +local math_max = math.max + +local size_x = math_floor(size.x / 2) +local size_z = math_floor(size.z / 2) +local y_dis = 1 + +local c_dirt_with_crystal_grass = core.get_content_id('everness:dirt_with_crystal_grass') + +local c_megalith_1 = core.get_content_id('everness:crystal_megalith_1') +local c_megalith_2 = core.get_content_id('everness:crystal_megalith_2') +local c_megalith_3 = core.get_content_id('everness:crystal_megalith_3') +local c_megalith_4 = core.get_content_id('everness:crystal_megalith_4') +local c_megalith_5 = core.get_content_id('everness:crystal_megalith_5') + +local c_cluster = core.get_content_id('everness:crystal_cluster') + +local is_replaceable = { + [core.CONTENT_AIR] = true, + [core.get_content_id('everness:crystal_grass_1')] = true, + [core.get_content_id('everness:crystal_grass_2')] = true, + [core.get_content_id('everness:crystal_grass_3')] = true, +} + +local np_crystal_grass = { + offset = 0, + scale = 1, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6, +} + +local nobj_crystal_grass = nil +local grass_noise_buf = {} +local points_x = {} +local points_z = {} + +local function place_megalith(data, p2data, vi, ystride, height, pal_idx, rot) + local p2 = pal_idx * 32 + rot + if height == 9 then + -- 9-tall Megalith: 1 -> 2 -> 2 -> 3 -> 3 -> 4 -> 4 -> 4 -> 5 + data[vi + ystride * 1] = c_megalith_1 + data[vi + ystride * 2] = c_megalith_2 + data[vi + ystride * 3] = c_megalith_2 + data[vi + ystride * 4] = c_megalith_3 + data[vi + ystride * 5] = c_megalith_3 + data[vi + ystride * 6] = c_megalith_4 + data[vi + ystride * 7] = c_megalith_4 + data[vi + ystride * 8] = c_megalith_4 + data[vi + ystride * 9] = c_megalith_5 + for i = 1, 9 do p2data[vi + ystride * i] = p2 end + elseif height == 7 then + -- 7-tall Megalith: 1 -> 2 -> 3 -> 3 -> 4 -> 4 -> 5 + data[vi + ystride * 1] = c_megalith_1 + data[vi + ystride * 2] = c_megalith_2 + data[vi + ystride * 3] = c_megalith_3 + data[vi + ystride * 4] = c_megalith_3 + data[vi + ystride * 5] = c_megalith_4 + data[vi + ystride * 6] = c_megalith_4 + data[vi + ystride * 7] = c_megalith_5 + for i = 1, 7 do p2data[vi + ystride * i] = p2 end + elseif height == 5 then + -- 5-tall Megalith: 1 -> 2 -> 3 -> 4 -> 5 + data[vi + ystride * 1] = c_megalith_1 + data[vi + ystride * 2] = c_megalith_2 + data[vi + ystride * 3] = c_megalith_3 + data[vi + ystride * 4] = c_megalith_4 + data[vi + ystride * 5] = c_megalith_5 + for i = 1, 5 do p2data[vi + ystride * i] = p2 end + elseif height == 3 then + -- 3-tall Spire: 1 -> 4 -> 5 + data[vi + ystride * 1] = c_megalith_1 + data[vi + ystride * 2] = c_megalith_4 + data[vi + ystride * 3] = c_megalith_5 + for i = 1, 3 do p2data[vi + ystride * i] = p2 end + end +end + +local np_heat = { + offset = 50, + scale = 50, + spread = { x = 1000, y = 1000, z = 1000 }, + seed = 5349, + octaves = 3, + persist = 0.5, +} + +local nobj_heat = nil + +local function get_heat_at(x, z, col_idx, heatmap) + if heatmap and heatmap[col_idx] then + return heatmap[col_idx] + end + if not nobj_heat then + if core.get_perlin then + nobj_heat = core.get_perlin(np_heat) + elseif PerlinNoise then + nobj_heat = PerlinNoise(np_heat) + end + end + if nobj_heat then + return nobj_heat:get_2d({ x = x, y = z }) + end + return 35 +end + +local function get_crystal_palette_index(heat, x, z) + -- Map Crystal Forest biome heat window (~18 to ~52, centered at heat_point 35) to full palette (0 to 7) + local min_biome_heat = 18.0 + local max_biome_heat = 52.0 + local norm_heat = math_min(math_max((heat - min_biome_heat) / (max_biome_heat - min_biome_heat), 0.0), 1.0) + local base_idx = math_floor(norm_heat * 8) + if base_idx >= 8 then + base_idx = 7 + end + -- Subtle micro-variation (+/- 1 palette step) based on local position + local jitter = ((x * 13 + z * 17) % 3) - 1 + local pal_idx = base_idx + jitter + if pal_idx < 0 then + pal_idx = 0 + elseif pal_idx > 7 then + pal_idx = 7 + end + return pal_idx +end + +local biome_id_everness_crystal_forest = core.get_biome_id('everness:crystal_forest') + +Everness:add_to_queue_on_generated({ + name = 'everness:crystal_forest', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_crystal_forest]) or table.indexof(biomemap, biome_id_everness_crystal_forest) ~= -1 + end, + on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args) + local cell_size = 192 + local max_edge_dist = 68.0 + local ystride = area.ystride + local chunk_size_x = maxp.x - minp.x + 1 + local chunk_size_z = maxp.z - minp.z + 1 + + -- 1. Precompute 2D grass noise flat buffer in C++ (eliminates thousands of Lua-C calls & table allocations) + if not nobj_crystal_grass then + if core.get_perlin_map then + nobj_crystal_grass = core.get_perlin_map(np_crystal_grass, { x = chunk_size_x, y = chunk_size_z, z = 1 }) + elseif PerlinNoiseMap then + nobj_crystal_grass = PerlinNoiseMap(np_crystal_grass, { x = chunk_size_x, y = chunk_size_z, z = 1 }) + end + end + if nobj_crystal_grass then + nobj_crystal_grass:get_2d_map_flat({ x = minp.x, y = minp.z }, grass_noise_buf) + end + + -- 2. Precompute the small set of Worley feature points covering this chunk once (reduces trig calls by 99.99%) + local min_gx = math_floor(minp.x / cell_size) - 1 + local max_gx = math_floor(maxp.x / cell_size) + 1 + local min_gz = math_floor(minp.z / cell_size) - 1 + local max_gz = math_floor(maxp.z / cell_size) + 1 + + local num_pts = 0 + for cx = min_gx, max_gx do + for cz = min_gz, max_gz do + local n = math_sin(cx * 127.1 + cz * 311.7 + 8741.3) * 43758.5453 + local rx = (n - math_floor(n)) * 0.6 + 0.2 + local n2 = math_sin(cx * 269.5 + cz * 183.3 + 4521.7) * 43758.5453 + local rz = (n2 - math_floor(n2)) * 0.6 + 0.2 + num_pts = num_pts + 1 + points_x[num_pts] = (cx + rx) * cell_size + points_z[num_pts] = (cz + rz) * cell_size + end + end + + local heatmap = core.get_mapgen_object('heatmap') + + for z = minp.z, maxp.z do + local col_z_offset = (z - minp.z) * chunk_size_x + for x = minp.x, maxp.x do + local col_idx = col_z_offset + (x - minp.x) + 1 + + -- Veins only generate in the opposite noise spectrum where crystal grass does not grow + if not grass_noise_buf[col_idx] or grass_noise_buf[col_idx] <= 0 then + -- Fast Worley F1/F2 distance from precomputed feature points + local min1_sq = 1e9 + local min2_sq = 1e9 + for i = 1, num_pts do + local dx = x - points_x[i] + local dz = z - points_z[i] + local dist_sq = dx * dx + dz * dz + if dist_sq < min1_sq then + min2_sq = min1_sq + min1_sq = dist_sq + elseif dist_sq < min2_sq then + min2_sq = dist_sq + end + end + local edge_dist = math_sqrt(min2_sq) - math_sqrt(min1_sq) + + -- Crystals generate along the white Worley cell boundary veins + if edge_dist <= max_edge_dist then + -- Density gradient: concentration at vein center (~25%), smoothly thinning outward (~4%) + local t = edge_dist / max_edge_dist + local spawn_chance = 0.25 * ((1.0 - t) ^ 1.1) + local pos_rnd = (math_sin(x * 374.1 + z * 513.7 + 8741.3) * 43758.5453) % 1.0 + + if pos_rnd < spawn_chance then + local vi = area:index(x, maxp.y - 9, z) + for y = maxp.y - 9, minp.y, -1 do + if data[vi] == c_dirt_with_crystal_grass then + local vi_up1 = vi + ystride + if is_replaceable[data[vi_up1]] then + local rot = (x * 7 + z * 13) % 4 + local heat = get_heat_at(x, z, col_idx, heatmap) + local pal_idx = get_crystal_palette_index(heat, x, z) + + if edge_dist <= 8.0 then + -- Tier 1 (Center Spine): 9-tall Megaliths + place_megalith(data, p2data, vi, ystride, 9, pal_idx, rot) + elseif edge_dist <= 18.0 then + -- Tier 2: 7-tall Megaliths + place_megalith(data, p2data, vi, ystride, 7, pal_idx, rot) + elseif edge_dist <= 30.0 then + -- Tier 3: 5-tall Megaliths + place_megalith(data, p2data, vi, ystride, 5, pal_idx, rot) + elseif edge_dist <= 46.0 then + -- Tier 4: 3-tall Spires + place_megalith(data, p2data, vi, ystride, 3, pal_idx, rot) + else + -- Tier 5 (Outer Spread): 1-tall Glass Crystal Clusters + data[vi + ystride * 1] = c_cluster + p2data[vi + ystride * 1] = pal_idx * 32 + rot + end + end + break + end + vi = vi - ystride + end + end + end + end + end + end + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local center_x = minp.x + math_floor(sidelength / 2) + rand:next(0, disp) + local center_z = minp.z + math_floor(sidelength / 2) + rand:next(0, disp) + local vi = area:index(center_x, minp.y, center_z) + local ystride = area.ystride + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + if data[vi + ystride] == core.CONTENT_AIR + and data[vi] == c_dirt_with_crystal_grass + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Quartz Temple + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:dirt_with_crystal_grass' + } + ) + + if #positions >= math_floor((size.x * size.z) * 0.7) then + -- enough air to place structure ? + local air_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_quartz_temple = shared_args.schem_positions.everness_quartz_temple or {} + + table.insert(shared_args.schem_positions.everness_quartz_temple, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Quartz Temple was placed at ' .. schem_pos:to_string()) + break + end + end + end + vi = vi + ystride + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_crystal_forest_deep_ocean.lua b/mods/everness/mapgen_crystal_forest_deep_ocean.lua new file mode 100644 index 0000000..9deff20 --- /dev/null +++ b/mods/everness/mapgen_crystal_forest_deep_ocean.lua @@ -0,0 +1,317 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_crystal_forest_deep_ocean.y_max +local y_min = Everness.settings.biomes.everness_crystal_forest_deep_ocean.y_min + +-- Coral Forest Ocean + +Everness:register_biome({ + name = 'everness:crystal_forest_deep_ocean', + node_top = 'everness:crystal_forest_deep_ocean_sand', + depth_top = 1, + node_filler = 'everness:crystal_forest_deep_ocean_sand', + depth_filler = 3, + node_riverbed = 'everness:crystal_forest_deep_ocean_sand', + depth_riverbed = 2, + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:crystal_forest_deep_ocean_sandstone_block', + node_dungeon_alt = 'everness:crystal_forest_deep_ocean_sandstone_brick', + node_dungeon_stair = 'stairs:stair_crystal_forest_deep_ocean_sandstone_block', + y_max = y_max, + y_min = y_min, + heat_point = 35, + humidity_point = 50, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_coral_1', + deco_type = 'schematic', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.003, + biomes = { 'everness:crystal_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_forest_deep_ocean_coral_1.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_coral_2', + deco_type = 'schematic', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.003, + biomes = { 'everness:crystal_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_forest_deep_ocean_coral_2.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_coral_3', + deco_type = 'schematic', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.003, + biomes = { 'everness:crystal_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_forest_deep_ocean_coral_3.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_sand_with_crack', + deco_type = 'simple', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + fill_ratio = 0.002, + biomes = { 'everness:crystal_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:crystal_forest_deep_ocean_sand_with_crack' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_coral_plant_1', + deco_type = 'simple', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:crystal_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:crystal_forest_deep_ocean_coral_plant_1' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_coral_plant_2', + deco_type = 'simple', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:crystal_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:crystal_forest_deep_ocean_coral_plant_2' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_deep_ocean_coral_plant_3', + deco_type = 'simple', + place_on = { 'everness:crystal_forest_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 19822, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:crystal_forest_deep_ocean' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:crystal_forest_deep_ocean_coral_plant_3' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +-- +-- On Generated +-- + +local c_water_source = core.get_content_id('mapgen_water_source') +local c_everness_crystal_forest_deep_ocean_sand = core.get_content_id('everness:crystal_forest_deep_ocean_sand') +local c_everness_crystal_forest_deep_ocean_coral_plant_1 = core.get_content_id('everness:crystal_forest_deep_ocean_coral_plant_1') +local c_everness_crystal_forest_deep_ocean_coral_plant_2 = core.get_content_id('everness:crystal_forest_deep_ocean_coral_plant_2') +local c_everness_crystal_forest_deep_ocean_coral_plant_3 = core.get_content_id('everness:crystal_forest_deep_ocean_coral_plant_3') +local c_everness_crystal_forest_deep_ocean_coral_1 = core.get_content_id('everness:crystal_forest_deep_ocean_coral_1') +local c_everness_crystal_forest_deep_ocean_coral_2 = core.get_content_id('everness:crystal_forest_deep_ocean_coral_2') +local c_everness_crystal_forest_deep_ocean_coral_3 = core.get_content_id('everness:crystal_forest_deep_ocean_coral_3') +-- Biome IDs +local biome_id_everness_crystal_forest_deep_ocean = core.get_biome_id('everness:crystal_forest_deep_ocean') + +local chance = 30 +local schem = core.get_modpath('everness') .. '/schematics/everness_crystal_forest_deep_ocean_ruins.mts' +local size = { x = 14, y = 12, z = 9 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +Everness:add_to_queue_on_generated({ + name = 'everness:crystal_forest_deep_ocean', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_crystal_forest_deep_ocean]) or table.indexof(biomemap, biome_id_everness_crystal_forest_deep_ocean) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + shared_args.schem_positions = {} + local schem_placed = false + + if rand:next(0, 100) < chance then + for y = maxp.y, minp.y, -1 do + if schem_placed then + break + end + + for z = minp.z, maxp.z do + if schem_placed then + break + end + + for x = minp.x, maxp.x do + local vi = area:index(x, y, z) + + if + data[vi] == c_everness_crystal_forest_deep_ocean_sand + and data[vi + area.ystride] == c_water_source + then + local s_pos = area:position(vi) + + -- + -- Crystal Forest Deep Ocean Ruins + -- + + local schem_pos = vector.new(s_pos) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + c_everness_crystal_forest_deep_ocean_sand, + c_everness_crystal_forest_deep_ocean_coral_plant_1, + c_everness_crystal_forest_deep_ocean_coral_plant_2, + c_everness_crystal_forest_deep_ocean_coral_plant_3, + c_everness_crystal_forest_deep_ocean_coral_1, + c_everness_crystal_forest_deep_ocean_coral_2, + c_everness_crystal_forest_deep_ocean_coral_3 + }, + data, + area + ) + + if #indexes < size.x * size.z then + -- not enough space + return + end + + -- enough water to place structure ? + local water_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + c_water_source + }, + data, + area + ) + + if #water_indexes > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + schem_placed = true + + shared_args.schem_positions.everness_crystal_forest_deep_ocean_ruins = shared_args.schem_positions.everness_crystal_forest_deep_ocean_ruins or {} + + table.insert(shared_args.schem_positions.everness_crystal_forest_deep_ocean_ruins, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Crystal Forest Deep Ocean Ruins was placed at ' .. schem_pos:to_string()) + + break + end + end + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_crystal_forest_dunes.lua b/mods/everness/mapgen_crystal_forest_dunes.lua new file mode 100644 index 0000000..23c52b0 --- /dev/null +++ b/mods/everness/mapgen_crystal_forest_dunes.lua @@ -0,0 +1,337 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_crystal_forest_dunes.y_max +local y_min = Everness.settings.biomes.everness_crystal_forest_dunes.y_min + +-- Crystal Forest Dunes + +Everness:register_biome({ + name = 'everness:crystal_forest_dunes', + node_top = 'everness:crystal_sand', + depth_top = 1, + node_filler = 'everness:crystal_sand', + depth_filler = 3, + node_riverbed = 'everness:crystal_sand', + depth_riverbed = 2, + node_stone = 'everness:crystal_stone', + node_dungeon = 'everness:crystal_cobble', + node_dungeon_alt = 'everness:crystal_mossy_cobble', + node_dungeon_stair = 'stairs:stair_crystal_cobble', + vertical_blend = 1, + y_max = y_max, + y_min = y_min, + heat_point = 35, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Crystal sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_sand', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest_dunes' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_dirt', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest_dunes' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:crystal_forest_dunes_ruins_1', + deco_type = 'schematic', + place_on = { 'everness:crystal_sand' }, + sidelen = 16, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = { x = 200, y = 200, z = 200 }, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:crystal_forest_dunes' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_forest_ruins_1.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_dunes_ruins_2', + deco_type = 'schematic', + place_on = { 'everness:crystal_sand' }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = { x = 200, y = 200, z = 200 }, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:crystal_forest_dunes' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_crystal_forest_ruins_2.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +-- +-- On Generated +-- + +local chance = 20 +local chance_water = 10 +local disp = 16 +local water_level = tonumber(core.settings:get('water_level')) or 1 + +local schem = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_quartz_fountain.mts', {}) +local size = { x = 11, y = 10, z = 11 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 1 + +local schem_shrine = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_crystal_forest_ocean_shrine.mts', {}) +local size_shrine = { x = 13, y = 16, z = 13 } +local size_x_shrine = math.round(size.x / 2) +local size_z_shrine = math.round(size.z / 2) +local y_dis_shrine = 8 + +local c_everness_crystal_sand = core.get_content_id('everness:crystal_sand') +local c_water_source = core.get_content_id('mapgen_water_source') + +local biome_id_everness_crystal_forest_dunes = core.get_biome_id('everness:crystal_forest_dunes') + +Everness:add_to_queue_on_generated({ + name = 'everness:crystal_forest_dunes', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_crystal_forest_dunes]) or table.indexof(biomemap, biome_id_everness_crystal_forest_dunes) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == core.CONTENT_AIR then + local s_pos = area:position(vi) + + if + data[vi] == c_everness_crystal_sand + and rand:next(0, 100) < chance + then + -- + -- Quartz Fountain + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:crystal_sand' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + local replacements + + if rand:next(0, 100) < 50 then + replacements = { + ['everness:chest'] = 'everness:quartz_pillar' + } + end + + if #air_positions > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + replacements, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_quartz_fountain = shared_args.schem_positions.everness_quartz_fountain or {} + + table.insert(shared_args.schem_positions.everness_quartz_fountain, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Quartz Fountain was placed at ' .. schem_pos:to_string()) + end + end + + if data[vi] == c_water_source + and rand:next(0, 100) < chance_water + -- Water Level + and water_level >= minp.y + and water_level <= maxp.y + then + -- + -- Crystal Forest Ocean Shrine + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis_shrine, s_pos.z) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x_shrine, s_pos.y - 1, s_pos.z - size_z_shrine), + vector.new(s_pos.x + size_x_shrine, s_pos.y + 1, s_pos.z + size_z_shrine), + { + c_water_source, + core.CONTENT_AIR + }, + data, + area + ) + + if #indexes < size_shrine.x * size_shrine.z then + -- not enough space + return + end + + -- enough space to place structure ? + local space_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x_shrine, s_pos.y, s_pos.z - size_z_shrine), + vector.new(s_pos.x + size_x_shrine, s_pos.y + size_shrine.y, s_pos.z + size_z_shrine), + { + c_water_source, + core.CONTENT_AIR + }, + data, + area + ) + + if #space_indexes > (size_shrine.x * size_shrine.y * size_shrine.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem_shrine, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_crystal_forest_ocean_shrine = shared_args.schem_positions.everness_crystal_forest_ocean_shrine or {} + + table.insert(shared_args.schem_positions.everness_crystal_forest_ocean_shrine, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x_shrine, s_pos.y - y_dis_shrine, s_pos.z - size_z_shrine), + maxp = vector.new(s_pos.x + size_x_shrine, s_pos.y - y_dis_shrine + size_shrine.y, s_pos.z + size_z_shrine) + }) + + core.log('action', '[Everness] Crystal Forest Ocean Shrine was placed at ' .. schem_pos:to_string()) + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_crystal_forest_ocean.lua b/mods/everness/mapgen_crystal_forest_ocean.lua new file mode 100644 index 0000000..85ac59f --- /dev/null +++ b/mods/everness/mapgen_crystal_forest_ocean.lua @@ -0,0 +1,147 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_crystal_forest_ocean.y_max +local y_min = Everness.settings.biomes.everness_crystal_forest_ocean.y_min + +-- Crystal Forest Ocean + +Everness:register_biome({ + name = 'everness:crystal_forest_ocean', + node_top = 'everness:crystal_sand', + depth_top = 1, + node_filler = 'everness:crystal_sand', + depth_filler = 3, + node_riverbed = 'everness:crystal_sand', + depth_riverbed = 2, + node_stone = 'everness:crystal_stone', + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:crystal_cobble', + node_dungeon_alt = 'everness:crystal_mossy_cobble', + node_dungeon_stair = 'stairs:stair_crystal_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 35, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Clay + +Everness:register_ore({ + ore_type = 'blob', + ore = 'default:clay', + wherein = { 'everness:crystal_sand' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest_ocean' } +}) + +-- Crystal sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_sand', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest_ocean' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_dirt', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest_ocean' } +}) + +-- +-- Register decorations +-- + +-- Coral reef + +Everness:register_decoration({ + name = 'everness:crystal_forest_ocean_corals', + deco_type = 'simple', + place_on = { 'everness:crystal_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:crystal_forest_ocean' }, + y_max = y_max, + y_min = y_max - 10 > y_min and y_max - 10 or y_min, + flags = 'force_placement', + decoration = { + 'everness:crystal_coral_dark', + 'everness:crystal_coral_light', + 'everness:coral_skeleton' + }, +}) diff --git a/mods/everness/mapgen_crystal_forest_shore.lua b/mods/everness/mapgen_crystal_forest_shore.lua new file mode 100644 index 0000000..43319af --- /dev/null +++ b/mods/everness/mapgen_crystal_forest_shore.lua @@ -0,0 +1,136 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_crystal_forest_shore.y_max +local y_min = Everness.settings.biomes.everness_crystal_forest_shore.y_min + +-- Crystal Forest Shore + +Everness:register_biome({ + name = 'everness:crystal_forest_shore', + node_top = 'everness:crystal_sand', + depth_top = 1, + node_filler = 'everness:crystal_sand', + depth_filler = 3, + node_riverbed = 'everness:crystal_sand', + depth_riverbed = 2, + node_stone = 'everness:crystal_stone', + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:crystal_cobble', + node_dungeon_alt = 'everness:crystal_mossy_cobble', + node_dungeon_stair = 'stairs:stair_crystal_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 35, + humidity_point = 50, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Crystal sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_sand', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest_shore' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:crystal_dirt', + wherein = { 'everness:crystal_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:crystal_forest_shore' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:crystal_stone_with_coal', + wherein = 'everness:crystal_stone', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:crystal_forest_shore' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:crystal_forest_shore_crystal_waterlily', + deco_type = 'simple', + place_on = { 'everness:crystal_sand' }, + sidelen = 16, + noise_params = { + offset = -0.12, + scale = 0.3, + spread = { x = 200, y = 200, z = 200 }, + seed = 33, + octaves = 3, + persist = 0.7 + }, + biomes = { 'everness:crystal_forest_shore' }, + y_max = y_max, + y_min = y_max, + decoration = 'everness:crystal_waterlily', + param2 = 0, + param2_max = 3, + place_offset_y = 1, +}) diff --git a/mods/everness/mapgen_crystal_forest_under.lua b/mods/everness/mapgen_crystal_forest_under.lua new file mode 100644 index 0000000..27eba2f --- /dev/null +++ b/mods/everness/mapgen_crystal_forest_under.lua @@ -0,0 +1,446 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_crystal_forest_under.y_max +local y_min = Everness.settings.biomes.everness_crystal_forest_under.y_min + +-- Crystal Forest Under + +Everness:register_biome({ + name = 'everness:crystal_forest_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'everness:crystal_cobble', + node_dungeon_alt = 'everness:crystal_mossy_cobble', + node_dungeon_stair = 'stairs:stair_crystal_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 35, + humidity_point = 50, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 10, + biomes = { 'everness:crystal_forest_under' }, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:crystal_cave_dirt_with_moss', + 'everness:crystal_moss_block' + }, + flags = 'all_floors, force_placement' +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_ceilings', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = { 'everness:crystal_forest_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { + 'everness:crystal_moss_block' + }, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_vines', + deco_type = 'simple', + place_on = { 'everness:crystal_moss_block' }, + sidelen = 16, + fill_ratio = 0.09, + biomes = { 'everness:crystal_forest_under' }, + param2 = 8, + decoration = { + 'everness:twisted_vine_1', + 'everness:twisted_vine_2', + 'everness:golden_vine_1', + 'everness:golden_vine_2' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_crystal_sphere_cluster', + deco_type = 'simple', + place_on = { + 'everness:crystal_cave_dirt_with_moss', + 'everness:crystal_moss_block' + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.0005, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:crystal_forest_under' }, + y_max = y_max - 1500 > y_min and y_max - 1500 or y_max, + y_min = y_min, + flags = 'all_floors', + decoration = { + 'everness:marker' + }, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_crystal_cyan', + deco_type = 'simple', + place_on = { + 'everness:crystal_cave_dirt_with_moss', + 'everness:crystal_moss_block' + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:crystal_forest_under' }, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:crystal_cyan', + 'everness:crystal_purple', + 'everness:crystal_orange' + }, + flags = 'all_floors', + param2 = 1 +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_twisted_crystal_grass', + deco_type = 'simple', + place_on = { + 'everness:crystal_cave_dirt_with_moss', + 'everness:crystal_moss_block' + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.2, + spread = { x = 100, y = 100, z = 100 }, + seed = 801, + octaves = 3, + persist = 0.7 + }, + biomes = { 'everness:crystal_forest_under' }, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = 'everness:twisted_crystal_grass', + flags = 'all_floors', + param2 = 0, + param2_max = 239, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_twisted_crystal_spire', + deco_type = 'simple', + place_on = { + 'everness:crystal_cave_dirt_with_moss', + 'everness:crystal_moss_block' + }, + sidelen = 16, + noise_params = { + offset = -0.05, + scale = 0.1, + spread = { x = 100, y = 100, z = 100 }, + seed = 801, + octaves = 3, + persist = 0.7 + }, + biomes = { 'everness:crystal_forest_under' }, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = 'everness:twisted_crystal_spire', + flags = 'all_floors', + param2 = 0, + param2_max = 239, +}) + +Everness:register_decoration({ + name = 'everness:crystal_forest_under_crystal_cyan_ceiling', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:crystal_forest_under' }, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:crystal_cyan', + 'everness:crystal_purple', + 'everness:crystal_orange' + }, + flags = 'all_ceilings', +}) + +-- +-- On Generated +-- + +local math_floor = math.floor +local math_sin = math.sin + +local floor_nodes = {} +local function register_floor_node(name) + local id = core.get_content_id(name) + if id and id ~= core.CONTENT_IGNORE and id ~= core.CONTENT_AIR then + floor_nodes[id] = true + end +end +register_floor_node('everness:crystal_cave_dirt_with_moss') +register_floor_node('everness:crystal_moss_block') + +local c_air = core.get_content_id('air') + +local replaceable_nodes = { + [c_air] = true, +} +local function register_replaceable_node(name) + local id = core.get_content_id(name) + if id and id ~= core.CONTENT_IGNORE and id ~= core.CONTENT_AIR then + replaceable_nodes[id] = true + end +end +register_replaceable_node('everness:twisted_crystal_grass') +register_replaceable_node('everness:twisted_crystal_spire') +register_replaceable_node('everness:crystal_cyan') +register_replaceable_node('everness:crystal_purple') +register_replaceable_node('everness:crystal_orange') + +local biome_id_everness_crystal_forest_under = core.get_biome_id('everness:crystal_forest_under') + +local deco_id_crystal_forest_under_crystal_sphere_cluster = core.get_decoration_id('everness:crystal_forest_under_crystal_sphere_cluster') + +-- `core.read_schematic` here so we don't cache the schem file, otherwise `replacements` will not work +local schem_crystal_sphere_cluster = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_crystal_purple_cluster.mts', {}) +local crystal_sphere_cluster_size = { x = 20, y = 19, z = 19 } +local crystal_sphere_cluster_size_x = math.round(crystal_sphere_cluster_size.x / 2) +local crystal_sphere_cluster_size_z = math.round(crystal_sphere_cluster_size.z / 2) +local crystal_sphere_cluster_safe_volume = (crystal_sphere_cluster_size.x * crystal_sphere_cluster_size.y * crystal_sphere_cluster_size.z) / 2 +local crystal_sphere_cluster_place_on = Everness.to_set(core.registered_decorations['everness:crystal_forest_under_crystal_sphere_cluster'].place_on) + +Everness:register_gen_notify_decoration({ + deco_id_crystal_forest_under_crystal_sphere_cluster +}) + +Everness:add_to_queue_on_generated({ + name = 'everness:crystal_forest_under', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_crystal_forest_under]) or table.indexof(biomemap, biome_id_everness_crystal_forest_under) ~= -1 + end, + -- 1. on_data: Raw VoxelManip content/param2 manipulation (committed automatically via set_data) + on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args, biomemap) + -- + -- Crystal Clusters (Marker-free Worley Cellular Noise L-System) + -- + local cell_size = 32 + local min_gx = math_floor(minp.x / cell_size) - 1 + local max_gx = math_floor(maxp.x / cell_size) + 1 + local min_gz = math_floor(minp.z / cell_size) - 1 + local max_gz = math_floor(maxp.z / cell_size) + 1 + local ystride = area.ystride + local chunk_size_x = maxp.x - minp.x + 1 + + for cx = min_gx, max_gx do + for cz = min_gz, max_gz do + local n = math_sin(cx * 127.1 + cz * 311.7 + 5432.1) * 43758.5453 + local rand_val = (n - math_floor(n)) + + -- 80% chance cell has a crystal cluster, 20% empty spacing + if rand_val < 0.80 then + local n2 = math_sin(cx * 269.5 + cz * 183.3 + 9876.5) * 43758.5453 + local rx = (n2 - math_floor(n2)) * 0.7 + 0.15 + local n3 = math_sin(cx * 419.2 + cz * 371.9 + 1357.9) * 43758.5453 + local rz = (n3 - math_floor(n3)) * 0.7 + 0.15 + + local seed_x = math_floor((cx + rx) * cell_size) + local seed_z = math_floor((cz + rz) * cell_size) + + if seed_x >= minp.x and seed_x <= maxp.x and seed_z >= minp.z and seed_z <= maxp.z then + -- Check column biome + local col_idx = (seed_z - minp.z) * chunk_size_x + (seed_x - minp.x) + 1 + if not biomemap or not biomemap[col_idx] or biomemap[col_idx] == biome_id_everness_crystal_forest_under then + -- Color zoning (Orange 45%, Cyan 30%, Purple 25%) + local color_choice = math_floor((rand_val / 0.80) * 3) % 3 + local rand_color = (color_choice == 0 and 'orange') or (color_choice == 1 and 'cyan') or 'purple' + + -- Scan vertical column for cavern floor surface + for y = maxp.y - 1, minp.y, -1 do + local vi = area:index(seed_x, y, seed_z) + local node_id = data[vi] + local above_id = data[vi + ystride] + + if floor_nodes[node_id] and replaceable_nodes[above_id] then + -- Check vertical clearance (counting air and replaceable grass/decorations) + local clearance = 0 + for h = 1, 12 do + local check_y = y + h + if check_y <= maxp.y and replaceable_nodes[data[vi + h * ystride]] then + clearance = clearance + 1 + else + break + end + end + + if clearance >= 2 then + local stage = 1 + if clearance >= 9 and rand_val < 0.25 then + stage = 3 -- Grand Cavern Spire + elseif clearance >= 5 and rand_val < 0.55 then + stage = 2 -- Medium Cluster + end + + local cluster_pos = vector.new(seed_x, y + 1, seed_z) + Everness.spawn_crystal_cluster_vmanip( + nil, + area, + data, + p2data, + cluster_pos, + rand_color, + stage, + rand + ) + end + break -- Placed at highest valid floor in this column + end + end + end + end + end + end + end + end, + -- 2. after_set_data: Schematics placement on VoxelManip + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + + -- + -- Crystal Sphere Cluster + -- + for _, pos in ipairs(gennotify['decoration#' .. (deco_id_crystal_forest_under_crystal_sphere_cluster or '')] or {}) do + -- `pos` is position of the 'place_on' node + local marker_pos = vector.new(pos.x, pos.y + 1, pos.z) + local marker_node = core.get_node(marker_pos) + local place_on_node = core.get_node(pos) + local crystal_sphere_cluster_y_dis = rand:next(5, 9) + + if marker_node and marker_node.name == 'everness:marker' then + -- remove marker + core.remove_node(marker_pos) + + if place_on_node and crystal_sphere_cluster_place_on[place_on_node.name] then + -- enough air to place structure ? + local positions = core.find_nodes_in_area( + vector.new( + pos.x - crystal_sphere_cluster_size_x, + pos.y - crystal_sphere_cluster_y_dis, + pos.z - crystal_sphere_cluster_size_z + ), + vector.new( + pos.x + crystal_sphere_cluster_size_x, + pos.y - crystal_sphere_cluster_y_dis + crystal_sphere_cluster_size.y, + pos.z + crystal_sphere_cluster_size_z + ), + { + 'air', + 'everness:coral_tree', + 'everness:crystal_block_orange', + 'everness:crystal_block_purple', + 'everness:crystal_block_cyan', + }, + true + ) + + local air = positions.air or {} + local tree = positions['everness:coral_tree'] or {} + local block_orange = positions['everness:crystal_block_orange'] or {} + local block_purple = positions['everness:crystal_block_purple'] or {} + local block_cyan = positions['everness:crystal_block_cyan'] or {} + + if + #air > crystal_sphere_cluster_safe_volume + -- do not overlap + and not ( + #tree > 0 + or #block_orange > 0 + or #block_purple > 0 + or #block_cyan > 0 + ) + then + local replacements + local rand_color + + if rand:next(0, 100) < 25 then + local colors = { 'orange', 'cyan' } + rand_color = colors[rand:next(1, #colors)] + + replacements = { + ['everness:crystal_block_purple'] = 'everness:crystal_block_' .. rand_color, + ['everness:crystal_purple'] = 'everness:crystal_' .. rand_color + } + end + + core.place_schematic_on_vmanip( + vm, + vector.new(marker_pos.x, marker_pos.y - crystal_sphere_cluster_y_dis, marker_pos.z), + schem_crystal_sphere_cluster, + 'random', + replacements, + true, + 'place_center_x, place_center_z' + ) + + -- core.log('action', '[Everness] Crystal Sphere Cluster ' .. (rand_color or 'orange') .. ' was placed at ' .. pos:to_string()) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_cursed_lands.lua b/mods/everness/mapgen_cursed_lands.lua new file mode 100644 index 0000000..c0e3b3f --- /dev/null +++ b/mods/everness/mapgen_cursed_lands.lua @@ -0,0 +1,454 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_cursed_lands.y_max +local y_min = Everness.settings.biomes.everness_cursed_lands.y_min + +-- Cursed Lands + +Everness:register_biome({ + name = 'everness:cursed_lands', + node_top = 'everness:dirt_with_cursed_grass', + depth_top = 1, + node_filler = 'everness:cursed_dirt', + depth_filler = 1, + node_riverbed = 'everness:cursed_dirt', + depth_riverbed = 2, + node_stone = 'everness:cursed_stone_carved', + node_dungeon = 'everness:cursed_brick', + node_dungeon_alt = 'everness:cursed_brick_with_growth', + node_dungeon_stair = 'stairs:stair_cursed_brick', + y_max = y_max, + y_min = y_min, + heat_point = 45, + humidity_point = 85, +}) + +-- +-- Register ores +-- + +-- Stratum ores. +-- These obviously first. + +Everness:register_ore({ + ore_type = 'stratum', + ore = 'everness:cursed_stone', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 1, + y_max = (y_max - y_max) + 46, + y_min = (y_max - y_max) + 4, + noise_params = { + offset = 28, + scale = 16, + spread = { x = 128, y = 128, z = 128 }, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 4, + biomes = { 'everness:cursed_lands' }, +}) + +Everness:register_ore({ + ore_type = 'stratum', + ore = 'everness:cursed_stone', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 1, + y_max = (y_max - y_max) + 42, + y_min = (y_max - y_max) + 6, + noise_params = { + offset = 24, + scale = 16, + spread = { x = 128, y = 128, z = 128 }, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = { 'everness:cursed_lands' }, +}) + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_sand', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_dirt', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 766, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands' } +}) + +-- Mud + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_mud', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:cursed_stone_carved_with_coal', + wherein = 'everness:cursed_stone_carved', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:cursed_lands' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:cursed_lands_cemetery', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_cursed_grass' }, + sidelen = 8, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = { x = 200, y = 200, z = 200 }, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_cemetery.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_ruins_1', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_cursed_grass' }, + sidelen = 8, + noise_params = { + offset = -0.0003, + scale = 0.0009, + spread = { x = 200, y = 200, z = 200 }, + seed = 230, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_ruins_1.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +local function register_red_castor_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:cursed_lands_red_castor_' .. length, + deco_type = 'simple', + place_on = { 'everness:dirt_with_cursed_grass' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:red_castor_' .. length, + param2 = 0, + param2_max = 239, + }) +end + +-- Red Castor Grasses + +register_red_castor_decoration(-0.03, 0.09, 4) +register_red_castor_decoration(-0.015, 0.075, 3) +register_red_castor_decoration(0, 0.06, 2) +register_red_castor_decoration(0.015, 0.045, 1) + +local function register_cursed_bone_decoration(bone_id, node_name, offset, param2_max) + Everness:register_decoration({ + name = 'everness:cursed_lands_bones_' .. bone_id, + deco_type = 'simple', + place_on = { 'everness:dirt_with_cursed_grass' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = -0.02, -- Gentle item density inside each cluster + spread = { x = 200, y = 200, z = 200 }, -- Matched to red castor spread + seed = 329, -- Matched to red castor seed + octaves = 5, -- Extra octaves create high-frequency ripples inside the empty areas + persist = 0.6 + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + decoration = node_name, + param2 = 0, + param2_max = param2_max, + }) +end + +-- Cursed Bones (thresholds set so clusters appear throughout the empty non-castor areas) +register_cursed_bone_decoration('cursed_bone_1', 'everness:cursed_bone_1', -0.011, 255) -- colordegrotate +register_cursed_bone_decoration('cursed_bone_2', 'everness:cursed_bone_2', -0.009, 239) -- degrotate +register_cursed_bone_decoration('cursed_bone_3', 'everness:cursed_bone_3', -0.010, 239) -- degrotate + +Everness:register_decoration({ + name = 'everness:cursed_lands_cursed_mud', + deco_type = 'simple', + place_on = { 'everness:dirt_with_cursed_grass', 'everness:cursed_dirt', 'everness:cursed_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:cursed_mud' }, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_dry_tree', + deco_type = 'schematic', + place_on = { + 'everness:dirt_with_cursed_grass', + 'everness:cursed_dirt', + 'everness:cursed_sand', + 'everness:cursed_stone' + }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0.0015, + scale = 0.0021, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_dry_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_cursed_bush', + deco_type = 'schematic', + place_on = { 'everness:dirt_with_cursed_grass' }, + sidelen = 16, + place_offset_y = 1, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:cursed_lands' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_cursed_bush.mts', + flags = 'place_center_x, place_center_z', +}) + +-- +-- On Generated +-- + +local chance = 20 +local disp = 16 +local schem = core.get_modpath('everness') .. '/schematics/everness_haunted_house.mts' +local size = { x = 11, y = 22, z = 10 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 1 + +local c_dirt_with_cursed_grass = core.get_content_id('everness:dirt_with_cursed_grass') + +local biome_id_everness_cursed_lands = core.get_biome_id('everness:cursed_lands') + +Everness:add_to_queue_on_generated({ + name = 'everness:cursed_lands', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_cursed_lands]) or table.indexof(biomemap, biome_id_everness_cursed_lands) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == core.CONTENT_AIR + and data[vi] == c_dirt_with_cursed_grass + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Haunted House + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:dirt_with_cursed_grass' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_haunted_house = shared_args.schem_positions.everness_haunted_house or {} + + table.insert(shared_args.schem_positions.everness_haunted_house, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Haunted House was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_cursed_lands_deep_ocean.lua b/mods/everness/mapgen_cursed_lands_deep_ocean.lua new file mode 100644 index 0000000..2abef28 --- /dev/null +++ b/mods/everness/mapgen_cursed_lands_deep_ocean.lua @@ -0,0 +1,317 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_cursed_lands_deep_ocean.y_max +local y_min = Everness.settings.biomes.everness_cursed_lands_deep_ocean.y_min + +-- Cursed Lands Deep Ocean + +Everness:register_biome({ + name = 'everness:cursed_lands_deep_ocean', + node_top = 'everness:cursed_lands_deep_ocean_sand', + depth_top = 1, + node_filler = 'everness:cursed_lands_deep_ocean_sand', + depth_filler = 3, + node_riverbed = 'everness:cursed_lands_deep_ocean_sand', + depth_riverbed = 2, + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:cursed_lands_deep_ocean_sandstone_block', + node_dungeon_alt = 'everness:cursed_lands_deep_ocean_sandstone_brick', + node_dungeon_stair = 'stairs:stair_cursed_lands_deep_ocean_sandstone_block', + y_max = y_max, + y_min = y_min, + heat_point = 45, + humidity_point = 85, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_lands_deep_ocean_coral_alcyonacea', + deco_type = 'schematic', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = { 'everness:cursed_lands_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_forsaken_lands_deep_ocean_coral_alcyonacea.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_lands_deep_ocean_coral_ostracod', + deco_type = 'schematic', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = { 'everness:cursed_lands_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_forsaken_lands_deep_ocean_coral_ostracod.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_lands_deep_ocean_coral_octocurse', + deco_type = 'schematic', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, + sidelen = 16, + fill_ratio = 0.002, + biomes = { 'everness:cursed_lands_deep_ocean' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_forsaken_lands_deep_ocean_coral_octocurse.mts', + flags = 'place_center_x, place_center_z, force_placement', +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_deep_ocean_mud', + deco_type = 'simple', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + fill_ratio = 0.002, + biomes = { 'everness:cursed_lands_deep_ocean' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:cursed_lands_deep_ocean_sand_with_crack' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_deep_ocean_plants_1', + deco_type = 'simple', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:cursed_lands_deep_ocean' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:cursed_lands_deep_ocean_coral_plant_anemone' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_deep_ocean_plants_2', + deco_type = 'simple', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:cursed_lands_deep_ocean' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:cursed_lands_deep_ocean_coral_plant_darkilluma' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_deep_ocean_plants_3', + deco_type = 'simple', + place_on = { 'everness:cursed_lands_deep_ocean_sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -0.02, + scale = 0.04, + spread = { x = 200, y = 200, z = 200 }, + seed = 19822, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:cursed_lands_deep_ocean' }, + y_max = y_max, + y_min = y_min, + flags = 'force_placement', + decoration = { 'everness:cursed_lands_deep_ocean_coral_plant_demon' }, + spawn_by = 'mapgen_water_source', + num_spawn_by = 8, +}) + +-- +-- On Generated +-- + +local c_water_source = core.get_content_id('mapgen_water_source') +local c_everness_cursed_lands_deep_ocean_sand = core.get_content_id('everness:cursed_lands_deep_ocean_sand') +local c_everness_cursed_lands_deep_ocean_coral_plant_anemone = core.get_content_id('everness:cursed_lands_deep_ocean_coral_plant_anemone') +local c_everness_cursed_lands_deep_ocean_coral_plant_darkilluma = core.get_content_id('everness:cursed_lands_deep_ocean_coral_plant_darkilluma') +local c_everness_cursed_lands_deep_ocean_coral_plant_demon = core.get_content_id('everness:cursed_lands_deep_ocean_coral_plant_demon') +local c_everness_cursed_lands_deep_ocean_coral_alcyonacea = core.get_content_id('everness:cursed_lands_deep_ocean_coral_alcyonacea') +local c_everness_cursed_lands_deep_ocean_coral_ostracod = core.get_content_id('everness:cursed_lands_deep_ocean_coral_ostracod') +local c_everness_cursed_lands_deep_ocean_coral_octocurse = core.get_content_id('everness:cursed_lands_deep_ocean_coral_octocurse') +-- Biome IDs +local biome_id_everness_cursed_lands_deep_ocean = core.get_biome_id('everness:cursed_lands_deep_ocean') + +local chance = 30 +local schem = core.get_modpath('everness') .. '/schematics/everness_cursed_lands_deep_ocean_skull.mts' +local size = { x = 10, y = 11, z = 11 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +Everness:add_to_queue_on_generated({ + name = 'everness:cursed_lands_deep_ocean', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_cursed_lands_deep_ocean]) or table.indexof(biomemap, biome_id_everness_cursed_lands_deep_ocean) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + shared_args.schem_positions = {} + local schem_placed = false + + if rand:next(0, 100) < chance then + for y = maxp.y, minp.y, -1 do + if schem_placed then + break + end + + for z = minp.z, maxp.z do + if schem_placed then + break + end + + for x = minp.x, maxp.x do + local vi = area:index(x, y, z) + + if + data[vi] == c_everness_cursed_lands_deep_ocean_sand + and data[vi + area.ystride] == c_water_source + then + local s_pos = area:position(vi) + + -- + -- Cursed Lands Deep Ocean Skull + -- + + local schem_pos = vector.new(s_pos) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + c_everness_cursed_lands_deep_ocean_sand, + c_everness_cursed_lands_deep_ocean_coral_plant_anemone, + c_everness_cursed_lands_deep_ocean_coral_plant_darkilluma, + c_everness_cursed_lands_deep_ocean_coral_plant_demon, + c_everness_cursed_lands_deep_ocean_coral_alcyonacea, + c_everness_cursed_lands_deep_ocean_coral_ostracod, + c_everness_cursed_lands_deep_ocean_coral_octocurse + }, + data, + area + ) + + if #indexes < size.x * size.z then + -- not enough space + return + end + + -- enough water to place structure ? + local water_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + c_water_source + }, + data, + area + ) + + if #water_indexes > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + schem_placed = true + + shared_args.schem_positions.everness_cursed_lands_deep_ocean_skull = shared_args.schem_positions.everness_cursed_lands_deep_ocean_skull or {} + + table.insert(shared_args.schem_positions.everness_cursed_lands_deep_ocean_skull, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Cursed Lands Deep Ocean Skull was placed at ' .. schem_pos:to_string()) + + break + end + end + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_cursed_lands_dunes.lua b/mods/everness/mapgen_cursed_lands_dunes.lua new file mode 100644 index 0000000..11587f6 --- /dev/null +++ b/mods/everness/mapgen_cursed_lands_dunes.lua @@ -0,0 +1,348 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_cursed_lands_dunes.y_max +local y_min = Everness.settings.biomes.everness_cursed_lands_dunes.y_min + +-- Cursed Lands Dunes + +Everness:register_biome({ + name = 'everness:cursed_lands_dunes', + node_top = 'everness:cursed_sand', + depth_top = 1, + node_filler = 'everness:cursed_sand', + depth_filler = 3, + node_riverbed = 'everness:cursed_sand', + depth_riverbed = 2, + node_stone = 'everness:cursed_stone_carved', + node_dungeon = 'everness:cursed_sandstone_brick', + node_dungeon_alt = 'everness:cursed_sandstone_block', + node_dungeon_stair = 'stairs:stair_cursed_sandstone_brick', + vertical_blend = 1, + y_max = y_max, + y_min = y_min, + heat_point = 45, + humidity_point = 85, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_sand', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_dunes' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_dirt', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 766, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_dunes' } +}) + +-- Mud + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_mud', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_dunes' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:cursed_stone_carved_with_coal', + wherein = 'everness:cursed_stone_carved', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:cursed_lands_dunes' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:cursed_lands_dunes_dry_tree', + deco_type = 'schematic', + place_on = { + 'everness:dirt_with_cursed_grass', + 'everness:cursed_dirt', + 'everness:cursed_sand', + 'everness:cursed_stone' + }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0.0015, + scale = 0.0021, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:cursed_lands_dunes' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_dry_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +-- +-- On Generated +-- + +local chance = 30 +local chance_water = 10 +local disp = 16 +local water_level = tonumber(core.settings:get('water_level')) or 1 + +local schem_cursed_cabin = core.get_modpath('everness') .. '/schematics/everness_cursed_cabin.mts' +local size = { x = 7, y = 7, z = 12 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +local schem_ocean_island = core.get_modpath('everness') .. '/schematics/everness_cursed_lands_deep_ocean_island.mts' +local size_ocean_island = { x = 25, y = 23, z = 23 } +local size_x_ocean_island = math.round(size.x / 2) +local size_z_ocean_island = math.round(size.z / 2) +local y_dis_ocean_island = 7 + +local c_cursed_sand = core.get_content_id('everness:cursed_sand') +local c_water_source = core.get_content_id('mapgen_water_source') + +local biome_id_everness_cursed_lands_dunes = core.get_biome_id('everness:cursed_lands_dunes') + +Everness:add_to_queue_on_generated({ + name = 'everness:cursed_lands_dunes', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_cursed_lands_dunes]) or table.indexof(biomemap, biome_id_everness_cursed_lands_dunes) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == core.CONTENT_AIR then + local s_pos = area:position(vi) + + if data[vi] == c_cursed_sand + and rand:next(0, 100) < chance + then + -- + -- Cursed Cabin + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y, s_pos.z) + + -- find floor big enough + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:cursed_sand' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem_cursed_cabin, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_cursed_cabin = shared_args.schem_positions.everness_cursed_cabin or {} + + table.insert(shared_args.schem_positions.everness_cursed_cabin, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Cursed Cabin was placed at ' .. schem_pos:to_string()) + end + end + + if data[vi] == c_water_source + and rand:next(0, 100) < chance_water + -- Water Level + and water_level >= minp.y + and water_level <= maxp.y + then + -- + -- Cursed Lands Deep Ocean Island + -- + + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis_ocean_island, s_pos.z) + + -- find floor big enough + local indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x_ocean_island, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x_ocean_island, s_pos.y + 1, s_pos.z + size_z), + { + c_water_source, + core.CONTENT_AIR + }, + data, + area + ) + + if #indexes < size_ocean_island.x * size_ocean_island.z then + -- not enough space + return + end + + -- enough space to place structure ? + local space_indexes = Everness.find_content_in_vm_area( + vector.new(s_pos.x - size_x_ocean_island, s_pos.y, s_pos.z - size_z_ocean_island), + vector.new(s_pos.x + size_x_ocean_island, s_pos.y + size_ocean_island.y, s_pos.z + size_z_ocean_island), + { + c_water_source, + core.CONTENT_AIR + }, + data, + area + ) + + if #space_indexes > (size_ocean_island.x * size_ocean_island.y * size_ocean_island.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem_ocean_island, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_cursed_lands_deep_ocean_island = shared_args.schem_positions.everness_cursed_lands_deep_ocean_island or {} + + table.insert(shared_args.schem_positions.everness_cursed_lands_deep_ocean_island, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x_ocean_island, s_pos.y - y_dis_ocean_island, s_pos.z - size_z_ocean_island), + maxp = vector.new(s_pos.x + size_x_ocean_island, s_pos.y - y_dis_ocean_island + size_ocean_island.y, s_pos.z + size_z_ocean_island) + }) + + core.log('action', '[Everness] Cursed Lands Deep Ocean Island was placed at ' .. schem_pos:to_string()) + end + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_cursed_lands_ocean.lua b/mods/everness/mapgen_cursed_lands_ocean.lua new file mode 100644 index 0000000..79dee80 --- /dev/null +++ b/mods/everness/mapgen_cursed_lands_ocean.lua @@ -0,0 +1,213 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_cursed_lands_ocean.y_max +local y_min = Everness.settings.biomes.everness_cursed_lands_ocean.y_min + +-- Cursed Lands Ocean + +Everness:register_biome({ + name = 'everness:cursed_lands_ocean', + node_top = 'everness:cursed_stone', + depth_top = 1, + node_filler = 'everness:cursed_stone', + depth_filler = 3, + node_riverbed = 'everness:cursed_stone', + depth_riverbed = 2, + node_stone = 'everness:cursed_stone_carved', + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:cursed_lands_deep_ocean_sandstone_block', + node_dungeon_alt = 'everness:cursed_lands_deep_ocean_sandstone_brick', + node_dungeon_stair = 'stairs:stair_cursed_lands_deep_ocean_sandstone_block', + y_max = y_max, + y_min = y_min, + heat_point = 45, + humidity_point = 85, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Clay + +Everness:register_ore({ + ore_type = 'blob', + ore = 'default:clay', + wherein = { 'everness:cursed_stone', 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_ocean' } +}) + +-- Sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_sand', + wherein = { 'everness:cursed_stone', 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_ocean' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_dirt', + wherein = { 'everness:cursed_stone', 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 766, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_ocean' } +}) + +-- Mud + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_mud', + wherein = { 'everness:cursed_stone', 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_ocean' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:cursed_stone_carved_with_coal', + wherein = 'everness:cursed_stone_carved', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:cursed_lands_ocean' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:cursed_lands_ocean_dry_tree', + deco_type = 'schematic', + place_on = { + 'everness:dirt_with_cursed_grass', + 'everness:cursed_dirt', + 'everness:cursed_sand', + 'everness:cursed_stone' + }, + place_offset_y = 0, + sidelen = 16, + noise_params = { + offset = 0.0015, + scale = 0.0021, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:cursed_lands_ocean' }, + y_max = y_max, + y_min = y_max - (y_max + 1), + schematic = core.get_modpath('everness') .. '/schematics/everness_dry_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +-- Spine Kelp + +Everness:register_decoration({ + name = 'everness:sand_with_spine_kelp', + deco_type = 'simple', + place_on = { 'everness:cursed_stone' }, + place_offset_y = -1, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.1, + spread = { x = 200, y = 200, z = 200 }, + seed = 87112, + octaves = 3, + persist = 0.7 + }, + biomes = { 'everness:cursed_lands_ocean' }, + y_max = y_max - (y_max + 5), + y_min = y_max - (y_max + 10), + flags = 'force_placement', + decoration = { + 'everness:sand_with_spine_kelp', + 'everness:coral_skeleton' + }, + param2 = 48, + param2_max = 96, +}) diff --git a/mods/everness/mapgen_cursed_lands_swamp.lua b/mods/everness/mapgen_cursed_lands_swamp.lua new file mode 100644 index 0000000..b6b415e --- /dev/null +++ b/mods/everness/mapgen_cursed_lands_swamp.lua @@ -0,0 +1,293 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_cursed_lands_swamp.y_max +local y_min = Everness.settings.biomes.everness_cursed_lands_swamp.y_min + +-- Cursed Lands Swamp + +Everness:register_biome({ + name = 'everness:cursed_lands_swamp', + node_top = 'everness:cursed_stone', + depth_top = 1, + node_filler = 'everness:cursed_stone', + depth_filler = 3, + node_riverbed = 'everness:cursed_stone', + depth_riverbed = 2, + node_stone = 'everness:cursed_stone_carved', + node_dungeon = 'everness:cursed_sandstone_brick', + node_dungeon_alt = 'everness:cursed_sandstone_block', + node_dungeon_stair = 'stairs:stair_cursed_sandstone_brick', + y_max = y_max, + y_min = y_min, + heat_point = 45, + humidity_point = 85, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +-- Sand + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_sand', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 2316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_swamp' } +}) + +-- Dirt + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_dirt', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 766, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_swamp' } +}) + +-- Mud + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:cursed_mud', + wherein = { 'everness:cursed_stone_carved' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 17676, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:cursed_lands_swamp' } +}) + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:cursed_stone_carved_with_coal', + wherein = 'everness:cursed_stone_carved', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:cursed_lands_swamp' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:cursed_lands_swamp_dry_tree', + deco_type = 'schematic', + place_on = { 'everness:cursed_stone' }, + place_offset_y = 0, + sidelen = 16, + -- Noise tuned to place swamp trees where papyrus is absent + noise_params = { + offset = 0.0, + scale = -0.1, + spread = { x = 200, y = 200, z = 200 }, + seed = 354, + octaves = 1, + persist = 0.5 + }, + biomes = { 'everness:cursed_lands_swamp' }, + y_max = y_min, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_dry_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_swamp_marsh_grass', + deco_type = 'schematic', + place_on = { 'everness:cursed_stone' }, + place_offset_y = 1, + sidelen = 16, + -- Noise tuned to place where papyrus is absent + noise_params = { + offset = 0.0, + scale = -0.1, + spread = { x = 200, y = 200, z = 200 }, + seed = 354, + octaves = 1, + persist = 0.5 + }, + biomes = { 'everness:cursed_lands_swamp' }, + y_max = y_max, + y_min = y_max, + schematic = core.get_modpath('everness') .. '/schematics/everness_marsh_grass.mts', +}) + +-- +-- On Generated +-- + +local chance = 30 +local disp = 16 +local schem = core.get_modpath('everness') .. '/schematics/everness_cursed_cabin.mts' +local size = { x = 7, y = 7, z = 12 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = -1 + +local c_cursed_stone = core.get_content_id('everness:cursed_stone') +local c_water_source = core.get_content_id('mapgen_water_source') + +local biome_id_everness_cursed_lands_swamp = core.get_biome_id('everness:cursed_lands_swamp') + +Everness:add_to_queue_on_generated({ + name = 'everness:cursed_lands_swamp', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_cursed_lands_swamp]) or table.indexof(biomemap, biome_id_everness_cursed_lands_swamp) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == c_water_source + and data[vi] == c_cursed_stone + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Cursed Cabin + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:cursed_stone', + 'mapgen_water_source' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air', + 'mapgen_water_source' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_cursed_cabin = shared_args.schem_positions.everness_cursed_cabin or {} + + table.insert(shared_args.schem_positions.everness_cursed_cabin, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Cursed Cabin was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_cursed_lands_under.lua b/mods/everness/mapgen_cursed_lands_under.lua new file mode 100644 index 0000000..81b91eb --- /dev/null +++ b/mods/everness/mapgen_cursed_lands_under.lua @@ -0,0 +1,296 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_cursed_lands_under.y_max +local y_min = Everness.settings.biomes.everness_cursed_lands_under.y_min + +-- Cursed Lands Under + +Everness:register_biome({ + name = 'everness:cursed_lands_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'everness:cursed_brick', + node_dungeon_alt = 'everness:cursed_brick_with_growth', + node_dungeon_stair = 'stairs:stair_cursed_brick', + y_max = y_max, + y_min = y_min, + heat_point = 45, + humidity_point = 85, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_soul_sandstone_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 10, + biomes = { 'everness:cursed_lands_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_floors, force_placement', + decoration = { + 'everness:soul_sandstone_veined' + }, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_mold_stone_ceilings', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = { 'everness:cursed_lands_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { + 'everness:moss_block' + }, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_skull_with_candle', + deco_type = 'simple', + place_on = { 'everness:soul_sandstone_veined' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:cursed_lands_under' }, + y_max = y_max - 1000 > y_min and y_max - 1000 or y_max, + y_min = y_min, + decoration = 'everness:skull_with_candle', + flags = 'all_floors', + param2_max = 3 +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_vines', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + sidelen = 16, + fill_ratio = 0.09, + biomes = { 'everness:cursed_lands_under' }, + param2 = 8, + decoration = { + 'everness:eye_vine_1', + 'everness:eye_vine_2', + 'everness:ivis_vine_1', + 'everness:ivis_vine_2' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_pumpkin_lantern', + deco_type = 'simple', + place_on = { 'everness:soul_sandstone_veined' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:cursed_lands_under' }, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = { 'everness:cursed_pumpkin_lantern' }, + flags = 'all_floors', + param2_max = 3 +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_cursed_dream_tree', + deco_type = 'simple', + place_on = { 'everness:soul_sandstone_veined' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:cursed_lands_under' }, + y_max = y_max - 1500 > y_min and y_max - 1500 or y_max, + y_min = y_min, + flags = 'all_floors', + decoration = { + 'everness:marker' + }, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_plants', + deco_type = 'simple', + place_on = { 'everness:soul_sandstone_veined' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:cursed_lands_under' }, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:egg_plant', + 'everness:ngrass_1', + 'everness:ngrass_2', + }, + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_ivis_moss', + deco_type = 'simple', + place_on = { 'everness:soul_sandstone_veined' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:cursed_lands_under' }, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:ivis_moss', + }, + flags = 'all_floors', + param2 = 0, + param2_max = 239, +}) + +Everness:register_decoration({ + name = 'everness:cursed_lands_under_cobweb_floors', + deco_type = 'simple', + place_on = { 'everness:soul_sandstone_veined' }, + sidelen = 16, + fill_ratio = 0.02, + biomes = { 'everness:cursed_lands_under' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:cobweb' }, + flags = 'all_floors' +}) + +-- +-- On Generated +-- + +local biome_id_everness_cursed_lands_under = core.get_biome_id('everness:cursed_lands_under') + +local deco_id_cursed_lands_under_cursed_dream_tree = core.get_decoration_id('everness:cursed_lands_under_cursed_dream_tree') + +local schem_cursed_dream_tree = core.get_modpath('everness') .. '/schematics/everness_cursed_dream_tree.mts' +local cursed_dream_tree_size = { x = 17, y = 15, z = 17 } +local cursed_dream_tree_size_x = math.round(cursed_dream_tree_size.x / 2) +local cursed_dream_tree_size_z = math.round(cursed_dream_tree_size.z / 2) +local cursed_dream_tree_safe_volume = (cursed_dream_tree_size.x * cursed_dream_tree_size.y * cursed_dream_tree_size.z) / 1.5 +local cursed_dream_tree_y_dis = 1 +local cursed_dream_tree_place_on = Everness.to_set(core.registered_decorations['everness:cursed_lands_under_cursed_dream_tree'].place_on) + +Everness:register_gen_notify_decoration(deco_id_cursed_lands_under_cursed_dream_tree) + +Everness:add_to_queue_on_generated({ + name = 'everness:cursed_lands_under', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_cursed_lands_under]) or table.indexof(biomemap, biome_id_everness_cursed_lands_under) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + -- + -- Cursed Dream Tree + -- + for _, pos in ipairs(gennotify['decoration#' .. (deco_id_cursed_lands_under_cursed_dream_tree or '')] or {}) do + -- `pos` is position of the 'place_on' node + local marker_pos = vector.new(pos.x, pos.y + 1, pos.z) + local marker_node = core.get_node(marker_pos) + local place_on_node = core.get_node(pos) + + if marker_node and marker_node.name == 'everness:marker' then + -- remove marker + core.remove_node(marker_pos) + + if place_on_node and cursed_dream_tree_place_on[place_on_node.name] then + -- enough air to place structure ? + local positions = core.find_nodes_in_area( + vector.new( + pos.x - cursed_dream_tree_size_x, + pos.y - cursed_dream_tree_y_dis, + pos.z - cursed_dream_tree_size_z + ), + vector.new( + pos.x + cursed_dream_tree_size_x, + pos.y - cursed_dream_tree_y_dis + cursed_dream_tree_size.y, + pos.z + cursed_dream_tree_size_z + ), + { + 'air', + 'everness:dry_tree' + }, + true + ) + + local air = positions.air or {} + local tree = positions['everness:dry_tree'] or {} + + if #air > cursed_dream_tree_safe_volume and #tree <= 1 then + core.place_schematic_on_vmanip( + vm, + vector.new(marker_pos.x, marker_pos.y - cursed_dream_tree_y_dis, marker_pos.z), + schem_cursed_dream_tree, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + -- core.log('action', '[Everness] Cursed Dream Tree was placed at ' .. pos:to_string()) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_forsaken_desert.lua b/mods/everness/mapgen_forsaken_desert.lua new file mode 100644 index 0000000..a1f1219 --- /dev/null +++ b/mods/everness/mapgen_forsaken_desert.lua @@ -0,0 +1,304 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_desert.y_max +local y_min = Everness.settings.biomes.everness_forsaken_desert.y_min + +-- Forsaken Desert + +Everness:register_biome({ + name = 'everness:forsaken_desert', + node_top = 'everness:forsaken_desert_sand', + depth_top = 1, + node_stone = 'everness:forsaken_desert_stone', + node_filler = 'everness:forsaken_desert_sand', + depth_filler = 1, + node_riverbed = 'everness:forsaken_desert_sand', + depth_riverbed = 2, + node_dungeon = 'everness:forsaken_desert_brick', + node_dungeon_alt = 'everness:forsaken_desert_brick_red', + node_dungeon_stair = 'stairs:stair_forsaken_desert_brick', + y_max = y_max, + y_min = y_min, + heat_point = 100, + humidity_point = 30, +}) + +-- +-- Register ores +-- + +-- Stratum ores. +-- These obviously first. + +Everness:register_ore({ + ore_type = 'stratum', + ore = 'everness:forsaken_desert_cobble', + wherein = { 'everness:forsaken_desert_stone' }, + clust_scarcity = 1, + y_max = (y_max - y_max) + 46, + y_min = (y_max - y_max) + 4, + noise_params = { + offset = 28, + scale = 16, + spread = { x = 128, y = 128, z = 128 }, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 4, + biomes = { 'everness:forsaken_desert' }, +}) + +Everness:register_ore({ + ore_type = 'stratum', + ore = 'everness:forsaken_desert_cobble', + wherein = { 'everness:forsaken_desert_stone' }, + clust_scarcity = 1, + y_max = (y_max - y_max) + 42, + y_min = (y_max - y_max) + 6, + noise_params = { + offset = 24, + scale = 16, + spread = { x = 128, y = 128, z = 128 }, + seed = 90122, + octaves = 1, + }, + stratum_thickness = 2, + biomes = { 'everness:forsaken_desert' }, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_desert_sand_plants_1', + deco_type = 'simple', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:forsaken_desert' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:forsaken_desert_plant_1' }, + param2 = 11, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_sand_plants_2', + deco_type = 'simple', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:forsaken_desert' }, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:forsaken_desert_plant_2', + 'everness:forsaken_desert_plant_3' + }, + param2 = 8, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_termite_nest', + deco_type = 'schematic', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_desert' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_termite_nest.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_hollow_tree', + deco_type = 'schematic', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:forsaken_desert' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_hollow_tree.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_hollow_tree_large', + deco_type = 'schematic', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.001, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:forsaken_desert' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_hollow_tree_large.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +-- +-- On Generated +-- + +local chance = 20 +local disp = 16 +local schem = core.get_modpath('everness') .. '/schematics/everness_forsaken_desert_temple.mts' +local size = { x = 9, y = 16, z = 9 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +local c_forsaken_desert_sand = core.get_content_id('everness:forsaken_desert_sand') + +local biome_id_everness_forsaken_desert = core.get_biome_id('everness:forsaken_desert') + +Everness:add_to_queue_on_generated({ + name = 'everness:forsaken_desert', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_forsaken_desert]) or table.indexof(biomemap, biome_id_everness_forsaken_desert) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == core.CONTENT_AIR + and data[vi] == c_forsaken_desert_sand + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Forsaken Desert Temple + -- + + local schem_pos = vector.new(s_pos.x, s_pos.y, s_pos.z) + + -- find floor big enough + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:forsaken_desert_sand' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_forsaken_desert_temple = shared_args.schem_positions.everness_forsaken_desert_temple or {} + + table.insert(shared_args.schem_positions.everness_forsaken_desert_temple, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Forsaken Desert Temple was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_forsaken_desert_ocean.lua b/mods/everness/mapgen_forsaken_desert_ocean.lua new file mode 100644 index 0000000..4f0d8e1 --- /dev/null +++ b/mods/everness/mapgen_forsaken_desert_ocean.lua @@ -0,0 +1,155 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_desert_ocean.y_max +local y_min = Everness.settings.biomes.everness_forsaken_desert_ocean.y_min + +-- Forsaken Desert Ocean + +Everness:register_biome({ + name = 'everness:forsaken_desert_ocean', + node_top = 'everness:dry_ocean_dirt', + depth_top = 1, + node_stone = 'everness:forsaken_desert_stone', + node_filler = 'everness:dry_ocean_dirt', + depth_filler = 3, + node_water_top = 'everness:dry_ocean_dirt', + depth_water_top = 10, + node_river_water = 'everness:dry_ocean_dirt', + node_riverbed = 'everness:dry_ocean_dirt', + depth_riverbed = 2, + node_dungeon = 'everness:forsaken_desert_brick', + node_dungeon_alt = 'everness:forsaken_desert_brick_red', + node_dungeon_stair = 'stairs:stair_forsaken_desert_brick', + y_max = y_max, + y_min = y_min, + heat_point = 100, + humidity_point = 30, +}) + +-- +-- On Generated +-- + +local chance = 20 +local disp = 16 +local schem = core.get_modpath('everness') .. '/schematics/everness_forsaken_desert_temple_3.mts' +local size = { x = 11, y = 13, z = 13 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = -1 + +local c_dry_ocean_dirt = core.get_content_id('everness:dry_ocean_dirt') + +local biome_id_everness_forsaken_desert_ocean = core.get_biome_id('everness:forsaken_desert_ocean') + +Everness:add_to_queue_on_generated({ + name = 'everness:forsaken_desert_ocean', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_forsaken_desert_ocean]) or table.indexof(biomemap, biome_id_everness_forsaken_desert_ocean) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == core.CONTENT_AIR + and data[vi] == c_dry_ocean_dirt + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Forsaken Desert Temple 3 + -- + + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:dry_ocean_dirt' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_forsaken_desert_temple_3 = shared_args.schem_positions.everness_forsaken_desert_temple_3 or {} + + table.insert(shared_args.schem_positions.everness_forsaken_desert_temple_3, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Forsaken Desert Temple 3 was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_forsaken_desert_under.lua b/mods/everness/mapgen_forsaken_desert_under.lua new file mode 100644 index 0000000..281db55 --- /dev/null +++ b/mods/everness/mapgen_forsaken_desert_under.lua @@ -0,0 +1,331 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_desert_under.y_max +local y_min = Everness.settings.biomes.everness_forsaken_desert_under.y_min + +-- Forsaken Desert Under + +Everness:register_biome({ + name = 'everness:forsaken_desert_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'default:cobble', + node_dungeon_alt = 'default:mossycobble', + node_dungeon_stair = 'stairs:stair_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 100, + humidity_point = 30, +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 10, + biomes = { 'everness:forsaken_desert_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_floors, force_placement', + decoration = { + 'everness:forsaken_desert_sand' + }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_floors_chiseled', + deco_type = 'simple', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 0.2, + biomes = { 'everness:forsaken_desert_under' }, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = { + 'everness:forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_brick', + 'everness:forsaken_desert_brick_red', + 'everness:forsaken_desert_engraved_stone', + 'everness:forsaken_desert_cobble_red', + 'everness:forsaken_desert_cobble', + }, + flags = 'all_floors, force_placement' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_ceilings', + deco_type = 'simple', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = { 'everness:forsaken_desert_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { + 'everness:moss_block' + }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_cactus_blue', + deco_type = 'simple', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_desert_under' }, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = 'everness:cactus_blue', + height = 2, + height_max = 6, + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_cave_barrel_cactus', + deco_type = 'simple', + place_on = { + 'everness:forsaken_desert_sand', + 'everness:forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_brick', + 'everness:forsaken_desert_engraved_stone' + }, + sidelen = 16, + fill_ratio = 0.005, + biomes = { 'everness:forsaken_desert_under' }, + y_max = y_max - 250 > y_min and y_max - 250 or y_max, + y_min = y_min, + decoration = { + 'everness:cave_barrel_cactus', + 'everness:venus_trap' + }, + flags = 'all_floors', + param2_max = 3 +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_cave_illumi_root', + deco_type = 'simple', + place_on = { + 'everness:forsaken_desert_sand', + 'everness:forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_brick', + 'everness:forsaken_desert_engraved_stone' + }, + sidelen = 16, + fill_ratio = 0.005, + biomes = { 'everness:forsaken_desert_under' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:illumi_root' }, + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_vines', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + sidelen = 16, + fill_ratio = 0.09, + biomes = { 'everness:forsaken_desert_under' }, + param2 = 8, + decoration = { + 'everness:dense_vine_1', + 'everness:dense_vine_2' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:forsaken_desert_under_hollow_tree', + deco_type = 'simple', + place_on = { 'everness:forsaken_desert_sand' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:forsaken_desert_under' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:hollow_tree', + height = 3, + height_max = 7, + flags = 'all_floors' +}) + +-- +-- On Generated +-- + +local disp = 16 +local chance = 20 +local schem = core.get_modpath('everness') .. '/schematics/everness_forsaken_desert_temple_2.mts' +local size = { x = 16, y = 17, z = 15 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +local c_forsaken_desert_sand = core.get_content_id('everness:forsaken_desert_sand') +local c_forsaken_desert_chiseled_stone = core.get_content_id('everness:forsaken_desert_chiseled_stone') +local c_forsaken_desert_brick = core.get_content_id('everness:forsaken_desert_brick') +local c_forsaken_desert_engraved_stone = core.get_content_id('everness:forsaken_desert_engraved_stone') + +local biome_id_everness_forsaken_desert_under = core.get_biome_id('everness:forsaken_desert_under') + +Everness:add_to_queue_on_generated({ + name = 'everness:forsaken_desert_under', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_forsaken_desert_under]) or table.indexof(biomemap, biome_id_everness_forsaken_desert_under) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if + ( + data[vi] == c_forsaken_desert_sand + or data[vi] == c_forsaken_desert_chiseled_stone + or data[vi] == c_forsaken_desert_brick + or data[vi] == c_forsaken_desert_engraved_stone + ) + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Forsaken Desert Temple 2 + -- + + local schem_pos = vector.new(s_pos.x, s_pos.y, s_pos.z) + + -- find floor big enough + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:forsaken_desert_sand', + 'everness:forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_brick', + 'everness:forsaken_desert_engraved_stone', + 'group:stone', + 'group:sand', + 'group:everness_sand', + 'default:gravel', + 'default:stone_with_coal', + 'default:stone_with_iron', + 'default:stone_with_copper', + 'default:stone_with_tin', + 'default:stone_with_gold', + 'default:stone_with_mese', + 'default:stone_with_diamond', + 'everness:cave_barrel_cactus', + 'everness:venus_trap', + 'group:flora', + 'everness:quartz_ore', + 'everness:stone_with_pyrite', + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_forsaken_desert_temple_2 = shared_args.schem_positions.everness_forsaken_desert_temple_2 or {} + + table.insert(shared_args.schem_positions.everness_forsaken_desert_temple_2, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Forsaken Desert Temple 2 was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_forsaken_tundra.lua b/mods/everness/mapgen_forsaken_tundra.lua new file mode 100644 index 0000000..9877d71 --- /dev/null +++ b/mods/everness/mapgen_forsaken_tundra.lua @@ -0,0 +1,368 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_tundra.y_max +local y_min = Everness.settings.biomes.everness_forsaken_tundra.y_min + +-- Forsaken Tundra + +Everness:register_biome({ + name = 'everness:forsaken_tundra', + node_top = 'everness:forsaken_tundra_dirt', + depth_top = 1, + node_stone = 'everness:forsaken_tundra_stone', + node_filler = 'everness:forsaken_tundra_dirt', + depth_filler = 1, + node_riverbed = 'everness:forsaken_tundra_beach_sand', + depth_riverbed = 2, + node_dungeon = 'everness:forsaken_tundra_cobble', + node_dungeon_alt = 'everness:forsaken_tundra_brick', + node_dungeon_stair = 'stairs:stair_forsaken_tundra_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 10, + humidity_point = 10, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:sulfur_stone', + wherein = { 'default:stone', 'everness:forsaken_tundra_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = {'everness:forsaken_tundra' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_volcanic_sulfur', + deco_type = 'simple', + place_on = { 'everness:forsaken_tundra_dirt' }, + sidelen = 4, + noise_params = { + offset = -0.7, + scale = 4.0, + spread = { x = 16, y = 16, z = 16 }, + seed = 513337, + octaves = 1, + persist = 0.0, + flags = 'absvalue, eased' + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:volcanic_sulfur' }, + place_offset_y = -1, + flags = 'force_placement', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_sulfur_stone', + deco_type = 'simple', + place_on = { + 'everness:forsaken_tundra_dirt', + 'everness:volcanic_sulfur' + }, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + place_offset_y = -1, + flags = 'force_placement', + decoration = { 'everness:sulfur_stone' }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_dirt_with_grass', + deco_type = 'simple', + place_on = { + 'everness:forsaken_tundra_dirt', + 'everness:volcanic_sulfur' + }, + sidelen = 4, + noise_params = { + offset = -0.8, + scale = 2.0, + spread = { x = 100, y = 100, z = 100 }, + seed = 53995, + octaves = 3, + persist = 1.0 + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:forsaken_tundra_dirt_with_grass', + place_offset_y = -1, + flags = 'force_placement', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_volcanic_sulfur_on_top_of_sulfur_stone', + deco_type = 'simple', + place_on = { 'everness:sulfur_stone' }, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:volcanic_sulfur' }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_rocks', + deco_type = 'schematic', + place_on = { 'everness:forsaken_tundra_dirt', 'everness:forsaken_tundra_dirt_with_grass' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_forsaken_tundra_rocks.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_sulfur_volcano', + deco_type = 'schematic', + place_on = { 'everness:forsaken_tundra_dirt', 'everness:volcanic_sulfur' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_sulfur_volcano.mts', + flags = 'place_center_x, place_center_z', + rotation = 'random', + spawn_by = { 'everness:forsaken_tundra_dirt', 'everness:volcanic_sulfur' }, + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_bloodpore_plant', + deco_type = 'simple', + place_on = { 'everness:forsaken_tundra_dirt_with_grass' }, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.09, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:bloodspore_plant', + param2 = 8, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_bloodspore_plant_on_dirt', + deco_type = 'simple', + place_on = { 'everness:forsaken_tundra_dirt' }, + spawn_by = 'everness:forsaken_tundra_dirt_with_grass', + num_spawn_by = 1, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.09, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:forsaken_tundra' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:bloodspore_plant', + param2 = 8, +}) + +-- +-- On Generated +-- + +local chance = 20 +local disp = 16 +local schem = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_jungle_temple.mts', {}) +local size = { x = 12, y = 14, z = 15 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 3 + +local c_everness_forsaken_tundra_dirt = core.get_content_id('everness:forsaken_tundra_dirt') +local c_everness_forsaken_tundra_dirt_with_grass = core.get_content_id('everness:forsaken_tundra_dirt_with_grass') +local c_everness_volcanic_sulfur = core.get_content_id('everness:volcanic_sulfur') + +local biome_id_everness_forsaken_tundra = core.get_biome_id('everness:forsaken_tundra') + +Everness:add_to_queue_on_generated({ + name = 'everness:forsaken_tundra', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_forsaken_tundra]) or table.indexof(biomemap, biome_id_everness_forsaken_tundra) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == core.CONTENT_AIR + and ( + data[vi] == c_everness_forsaken_tundra_dirt + or data[vi] == c_everness_forsaken_tundra_dirt_with_grass + or data[vi] == c_everness_volcanic_sulfur + ) + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Jungle Temple + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:forsaken_tundra_dirt', + 'everness:forsaken_tundra_dirt_with_grass', + 'everness:volcanic_sulfur' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_jungle_temple = shared_args.schem_positions.everness_jungle_temple or {} + + table.insert(shared_args.schem_positions.everness_jungle_temple, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Jungle Temple was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) + diff --git a/mods/everness/mapgen_forsaken_tundra_beach.lua b/mods/everness/mapgen_forsaken_tundra_beach.lua new file mode 100644 index 0000000..1e348d8 --- /dev/null +++ b/mods/everness/mapgen_forsaken_tundra_beach.lua @@ -0,0 +1,94 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_tundra_beach.y_max +local y_min = Everness.settings.biomes.everness_forsaken_tundra_beach.y_min + +-- Forsaken Tundra Beach + +Everness:register_biome({ + name = 'everness:forsaken_tundra_beach', + node_top = 'everness:forsaken_tundra_beach_sand', + depth_top = 1, + node_filler = 'everness:forsaken_tundra_beach_sand', + depth_filler = 2, + node_riverbed = 'everness:forsaken_tundra_beach_sand', + depth_riverbed = 2, + node_dungeon = 'everness:forsaken_tundra_cobble', + node_dungeon_alt = 'everness:forsaken_tundra_brick', + node_dungeon_stair = 'stairs:stair_forsaken_tundra_cobble', + vertical_blend = 1, + y_max = y_max, + y_min = y_min, + heat_point = 10, + humidity_point = 10, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:sulfur_stone', + wherein = { 'default:stone', 'everness:forsaken_tundra_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:forsaken_tundra_beach' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_beach_sand_with_shells', + deco_type = 'simple', + place_on = { 'everness:forsaken_tundra_beach_sand' }, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_tundra_beach' }, + y_max = y_max, + y_min = y_min, + place_offset_y = -1, + flags = 'force_placement', + decoration = { 'everness:forsaken_tundra_beach_sand_with_shells' }, +}) diff --git a/mods/everness/mapgen_forsaken_tundra_ocean.lua b/mods/everness/mapgen_forsaken_tundra_ocean.lua new file mode 100644 index 0000000..a29e95c --- /dev/null +++ b/mods/everness/mapgen_forsaken_tundra_ocean.lua @@ -0,0 +1,96 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_tundra_ocean.y_max +local y_min = Everness.settings.biomes.everness_forsaken_tundra_ocean.y_min + +-- Forsaken Tundra Ocean + +Everness:register_biome({ + name = 'everness:forsaken_tundra_ocean', + node_top = 'everness:forsaken_tundra_beach_sand', + depth_top = 1, + node_stone = 'everness:forsaken_tundra_stone', + node_filler = 'everness:forsaken_tundra_beach_sand', + depth_filler = 3, + node_riverbed = 'everness:forsaken_tundra_beach_sand', + depth_riverbed = 2, + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:forsaken_tundra_cobble', + node_dungeon_alt = 'everness:forsaken_tundra_brick', + node_dungeon_stair = 'stairs:stair_forsaken_tundra_cobble', + vertical_blend = 1, + y_max = y_max, + y_min = y_min, + heat_point = 10, + humidity_point = 10, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:sulfur_stone', + wherein = { 'default:stone', 'everness:forsaken_tundra_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:forsaken_tundra_ocean' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_beach_sand_with_shells', + deco_type = 'simple', + place_on = { 'everness:forsaken_tundra_beach_sand' }, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_tundra_ocean' }, + y_max = y_max, + y_min = y_min, + place_offset_y = -1, + flags = 'force_placement', + decoration = { 'everness:forsaken_tundra_beach_sand_with_shells' }, +}) diff --git a/mods/everness/mapgen_forsaken_tundra_under.lua b/mods/everness/mapgen_forsaken_tundra_under.lua new file mode 100644 index 0000000..281c460 --- /dev/null +++ b/mods/everness/mapgen_forsaken_tundra_under.lua @@ -0,0 +1,354 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_forsaken_tundra_under.y_max +local y_min = Everness.settings.biomes.everness_forsaken_tundra_under.y_min + +-- Forsaken Tundra Under + +Everness:register_biome({ + name = 'everness:forsaken_tundra_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'everness:forsaken_tundra_cobble', + node_dungeon_alt = 'everness:forsaken_tundra_brick', + node_dungeon_stair = 'stairs:stair_forsaken_tundra_cobble', + y_max = y_max, + y_min = y_min, + heat_point = 10, + humidity_point = 10, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:sulfur_stone', + wherein = { 'default:stone', 'everness:forsaken_tundra_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:forsaken_tundra_under' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_mold_stone_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 10, + biomes = { 'everness:forsaken_tundra_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_floors, force_placement', + decoration = { + 'everness:mold_stone_with_moss' + }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_mold_stone_ceilings', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = { 'everness:forsaken_tundra_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { + 'everness:moss_block' + }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_obsidian_floors', + deco_type = 'simple', + place_on = { 'default:stone', 'everness:mold_stone_with_moss' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 0.02, + biomes = { 'everness:forsaken_tundra_under' }, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = { + 'everness:blue_crying_obsidian', + 'everness:blue_weeping_obsidian', + 'everness:weeping_obsidian' + }, + flags = 'all_floors, force_placement' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_obsidian_ceilings', + deco_type = 'simple', + place_on = { 'default:stone', 'everness:moss_block' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 0.02, + biomes = { 'everness:forsaken_tundra_under' }, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = { + 'everness:blue_crying_obsidian', + 'everness:blue_weeping_obsidian', + 'everness:weeping_obsidian' + }, + flags = 'all_ceilings, force_placement' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_cactus_orange', + deco_type = 'simple', + place_on = { 'everness:mold_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:forsaken_tundra_under' }, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = 'everness:cactus_orange', + height = 2, + height_max = 6, + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_willow_tree', + deco_type = 'simple', + place_on = { + 'everness:mold_stone_with_moss', + 'everness:blue_crying_obsidian', + 'everness:blue_weeping_obsidian', + 'everness:weeping_obsidian' + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:forsaken_tundra_under' }, + y_max = y_max - 1500 > y_min and y_max - 1500 or y_max, + y_min = y_min, + flags = 'all_floors', + decoration = { + 'everness:marker' + }, +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_bloodspore_plant_small', + deco_type = 'simple', + place_on = { 'everness:mold_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:forsaken_tundra_under' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:bloodspore_plant_small', + param2 = 8, + flags = 'all_floors' +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_vines', + deco_type = 'simple', + place_on = { 'everness:moss_block' }, + sidelen = 16, + fill_ratio = 0.09, + biomes = { 'everness:forsaken_tundra_under' }, + param2 = 8, + decoration = { + 'everness:whispering_gourd_vine_1', + 'everness:whispering_gourd_vine_2', + 'everness:bulb_vine_1', + 'everness:bulb_vine_2' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_glowing_pillar', + deco_type = 'simple', + place_on = { 'everness:mold_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.002, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:forsaken_tundra_under' }, + y_max = y_max - 1000 > y_min and y_max - 1000 or y_max, + y_min = y_min, + decoration = { 'everness:glowing_pillar' }, + flags = 'all_floors', +}) + +local function register_agave_leaf_decoration(offset, scale, length) + Everness:register_decoration({ + name = 'everness:forsaken_tundra_under_agave_leaf_' .. length, + deco_type = 'simple', + place_on = { 'everness:mold_stone_with_moss' }, + sidelen = 16, + noise_params = { + offset = offset, + scale = scale, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + param2 = 8, + biomes = { 'everness:forsaken_tundra_under' }, + y_max = y_max, + y_min = y_min, + decoration = 'everness:agave_leaf_' .. length, + flags = 'all_floors' + }) +end + +-- Grasses + +register_agave_leaf_decoration(-0.03, 0.09, 3) +register_agave_leaf_decoration(-0.015, 0.075, 2) +register_agave_leaf_decoration(0, 0.06, 1) + +-- +-- On Generated +-- + +local biome_id_everness_forsaken_tundra_under = core.get_biome_id('everness:forsaken_tundra_under') + +local deco_id_everness_forsaken_tundra_under_willow_tree = core.get_decoration_id('everness:forsaken_tundra_under_willow_tree') + +local willow_tree_schem = core.get_modpath('everness') .. '/schematics/everness_willow_tree.mts' +local size = { x = 39, y = 28, z = 39 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local safe_volume = (size.x * size.y * size.z) / 1.5 +local y_dis = 1 +local willow_tree_place_on = Everness.to_set(core.registered_decorations['everness:forsaken_tundra_under_willow_tree'].place_on) + +Everness:register_gen_notify_decoration(deco_id_everness_forsaken_tundra_under_willow_tree) + +Everness:add_to_queue_on_generated({ + name = 'everness:forsaken_tundra_under', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_forsaken_tundra_under]) or table.indexof(biomemap, biome_id_everness_forsaken_tundra_under) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + -- + -- Willow Tree + -- + + for _, pos in ipairs(gennotify['decoration#' .. (deco_id_everness_forsaken_tundra_under_willow_tree or '')] or {}) do + -- `pos` is position of the 'place_on' node + local marker_pos = vector.new(pos.x, pos.y + 1, pos.z) + local marker_node = core.get_node(marker_pos) + local place_on_node = core.get_node(pos) + + if marker_node and marker_node.name == 'everness:marker' then + -- remove marker + core.remove_node(marker_pos) + + if place_on_node and willow_tree_place_on[place_on_node.name] then + -- enough air to place structure ? + local positions = core.find_nodes_in_area( + vector.new( + pos.x - size_x, + pos.y - y_dis, + pos.z - size_z + ), + vector.new( + pos.x + size_x, + pos.y - y_dis + size.y, + pos.z + size_z + ), + { + 'air', + 'everness:willow_tree' + }, + true + ) + + local air = positions.air or {} + local tree = positions['everness:willow_tree'] or {} + + if #air > safe_volume and #tree == 0 then + core.place_schematic_on_vmanip( + vm, + vector.new(marker_pos.x, marker_pos.y - y_dis, marker_pos.z), + willow_tree_schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + -- core.log('action', '[Everness] Willow Tree was placed at ' .. pos:to_string()) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_frosted_icesheet.lua b/mods/everness/mapgen_frosted_icesheet.lua new file mode 100644 index 0000000..588a3de --- /dev/null +++ b/mods/everness/mapgen_frosted_icesheet.lua @@ -0,0 +1,238 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_frosted_icesheet.y_max +local y_min = Everness.settings.biomes.everness_frosted_icesheet.y_min + +-- Frosted Icesheet + +Everness:register_biome({ + name = 'everness:frosted_icesheet', + node_dust = 'everness:frosted_snowblock', + node_top = 'everness:frosted_snowblock', + depth_top = 1, + node_filler = 'everness:frosted_snowblock', + depth_filler = 3, + node_stone = 'everness:frosted_cave_ice', + node_water_top = 'everness:frosted_ice', + depth_water_top = 2, + node_river_water = 'everness:frosted_ice', + node_riverbed = 'everness:gravel', + depth_riverbed = 2, + node_dungeon = 'everness:icecobble', + node_dungeon_alt = 'everness:snowcobble', + node_dungeon_stair = 'stairs:stair_ice', + y_max = y_max, + y_min = y_min, + heat_point = 0, + humidity_point = 93, +}) + +-- +-- Register decorations +-- + +-- Frosted Icesheet + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_stalagmite', + deco_type = 'schematic', + schematic = core.get_modpath('everness') .. '/schematics/everness_frosted_lands_stalagmite.mts', + place_on = { 'everness:frosted_snowblock' }, + place_offset_y = 1, + sidelen = 16, + noise_params = { + offset = 0.0008, + scale = 0.0007, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:frosted_icesheet' }, + y_max = y_max, + y_min = (y_max - y_max) + 4, + flags = 'place_center_x, place_center_z', + spawn_by = 'everness:frosted_snowblock', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_volcanic_rock', + deco_type = 'schematic', + schematic = core.get_modpath('everness') .. '/schematics/everness_frosted_lands_volcanic_rock.mts', + place_on = { 'everness:frosted_snowblock' }, + sidelen = 16, + noise_params = { + offset = 0.0008, + scale = 0.0007, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:frosted_icesheet' }, + y_max = y_max, + y_min = (y_max - y_max) + 2, + flags = 'place_center_x, place_center_z', + rotation = 'random', + spawn_by = 'everness:frosted_snowblock', + num_spawn_by = 8, +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_fossils', + deco_type = 'schematic', + schematic = core.get_modpath('everness') .. '/schematics/everness_frosted_lands_fossils.mts', + place_on = { 'everness:frosted_snowblock' }, + sidelen = 16, + place_offset_y = 1, + noise_params = { + offset = 0.0008, + scale = 0.0007, + spread = { x = 250, y = 250, z = 250 }, + seed = 2, + octaves = 3, + persist = 0.66 + }, + biomes = { 'everness:frosted_icesheet' }, + y_max = y_max, + y_min = (y_max - y_max) + 1, + flags = 'place_center_x, place_center_z', + rotation = 'random', + spawn_by = 'everness:frosted_snowblock', + num_spawn_by = 8, +}) + +-- +-- On Generated +-- + +local chance = 20 +local disp = 16 +local schem = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_frosted_icesheet_igloo.mts', {}) +local size = { x = 16, y = 13, z = 16 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) +local y_dis = 8 + +local c_frosted_snowblock = core.get_content_id('everness:frosted_snowblock') +local c_frosted_ice = core.get_content_id('everness:frosted_ice') + +local biome_id_everness_frosted_icesheet = core.get_biome_id('everness:frosted_icesheet') + +Everness:add_to_queue_on_generated({ + name = 'everness:frosted_icesheet', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_frosted_icesheet]) or table.indexof(biomemap, biome_id_everness_frosted_icesheet) ~= -1 + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == core.CONTENT_AIR + and ( + data[vi] == c_frosted_snowblock + or data[vi] == c_frosted_ice + ) + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Igloo + -- + + -- add Y displacement + local schem_pos = vector.new(s_pos.x, s_pos.y - y_dis, s_pos.z) + + -- find floor big enough + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:frosted_snowblock', + 'everness:frosted_ice' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + schem_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_frosted_icesheet_igloo = shared_args.schem_positions.everness_frosted_icesheet_igloo or {} + + table.insert(shared_args.schem_positions.everness_frosted_icesheet_igloo, { + pos = schem_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y - y_dis, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y - y_dis + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Igloo was placed at ' .. schem_pos:to_string()) + end + end + end + end, + after_write_to_map = function(shared_args) + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions > 0 then + Everness:populate_loot_chests(chest_positions) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_frosted_icesheet_ocean.lua b/mods/everness/mapgen_frosted_icesheet_ocean.lua new file mode 100644 index 0000000..15865b2 --- /dev/null +++ b/mods/everness/mapgen_frosted_icesheet_ocean.lua @@ -0,0 +1,73 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_frosted_icesheet_ocean.y_max +local y_min = Everness.settings.biomes.everness_frosted_icesheet_ocean.y_min + +-- Frosted Icesheet Ocean + +Everness:register_biome({ + name = 'everness:frosted_icesheet_ocean', + node_top = 'default:sand', + depth_top = 1, + node_filler = 'default:sand', + depth_filler = 3, + node_water_top = 'everness:frosted_ice', + depth_water_top = 2, + node_cave_liquid = 'mapgen_water_source', + node_dungeon = 'everness:icecobble', + node_dungeon_alt = 'everness:snowcobble', + node_dungeon_stair = 'stairs:stair_ice', + y_max = y_max, + y_min = y_min, + heat_point = 0, + humidity_point = 93, +}) + +-- +-- Register decorations +-- + +-- Frosted Icesheet Ocean + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_ocean_corals', + deco_type = 'simple', + place_on = { 'default:sand' }, + place_offset_y = -1, + sidelen = 4, + noise_params = { + offset = -4, + scale = 4, + spread = { x = 50, y = 50, z = 50 }, + seed = 7013, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:frosted_icesheet_ocean' }, + y_max = y_max - (y_max + 2), -- -2 + y_min = y_max - (y_max + 50), -- -50 + flags = 'force_placement', + decoration = { + 'everness:coral_starfish', + 'everness:coral_frosted', + 'everness:coral_skeleton' + }, +}) diff --git a/mods/everness/mapgen_frosted_icesheet_under.lua b/mods/everness/mapgen_frosted_icesheet_under.lua new file mode 100644 index 0000000..6e75aa3 --- /dev/null +++ b/mods/everness/mapgen_frosted_icesheet_under.lua @@ -0,0 +1,402 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_frosted_icesheet_under.y_max +local y_min = Everness.settings.biomes.everness_frosted_icesheet_under.y_min + +-- Frosted Icesheet Under + +Everness:register_biome({ + name = 'everness:frosted_icesheet_under', + node_cave_liquid = { 'mapgen_water_source', 'mapgen_lava_source' }, + node_dungeon = 'everness:icecobble', + node_dungeon_alt = 'everness:snowcobble', + node_dungeon_stair = 'stairs:stair_ice', + y_max = y_max, + y_min = y_min, + heat_point = 0, + humidity_point = 93, +}) + +-- +-- Register ores +-- + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:bone', + wherein = { 'default:stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = -316, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:frosted_icesheet_under' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_floors', + deco_type = 'simple', + place_on = { 'default:stone' }, + place_offset_y = -1, + sidelen = 16, + fill_ratio = 10, + biomes = { 'everness:frosted_icesheet_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_floors, force_placement', + decoration = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_ceilings', + deco_type = 'simple', + place_on = { 'default:stone' }, + sidelen = 16, + fill_ratio = 0.4, + biomes = { 'everness:frosted_icesheet_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + decoration = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_illuminating_floors', + deco_type = 'simple', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 0.01, + biomes = { 'everness:frosted_icesheet_under' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:frosted_cave_ice_illuminating' }, + flags = 'all_floors, force_placement' +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_illuminating_ceilings', + deco_type = 'simple', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 0.01, + biomes = { 'everness:frosted_icesheet_under' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:frosted_cave_ice_illuminating' }, + flags = 'all_ceilings, force_placement' +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_amaranita_lantern', + deco_type = 'simple', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:frosted_icesheet_under' }, + y_max = y_max - 500 > y_min and y_max - 500 or y_max, + y_min = y_min, + decoration = { 'everness:amaranita_lantern' }, + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_vines', + deco_type = 'simple', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + fill_ratio = 0.09, + biomes = { 'everness:frosted_icesheet_under' }, + param2 = 8, + decoration = { + 'everness:tenanea_flowers_vine_1', + 'everness:tenanea_flowers_vine_2', + 'everness:reeds_vine_1', + 'everness:reeds_vine_2' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', + spawn_by = 'air', + num_spawn_by = 8 +}) + +Everness:register_decoration({ + name = 'everness:frosted_icicle_large_ceiling', + deco_type = 'schematic', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:frosted_icesheet_under' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_frosted_icicle_large_ceiling.mts', + flags = 'place_center_x, place_center_z, all_ceilings', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:frosted_icicle_large_floor', + deco_type = 'schematic', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + noise_params = { + offset = -0.004, + scale = 0.01, + spread = { x = 100, y = 100, z = 100 }, + seed = 137, + octaves = 3, + persist = 0.7, + }, + biomes = { 'everness:frosted_icesheet_under' }, + y_max = y_max, + y_min = y_min, + schematic = core.get_modpath('everness') .. '/schematics/everness_frosted_icicle_large_floor.mts', + flags = 'place_center_x, place_center_z, all_floors', + rotation = 'random', +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_plants', + deco_type = 'simple', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + param2 = 8, + biomes = { 'everness:frosted_icesheet_under' }, + y_max = y_max, + y_min = y_min, + decoration = { + 'everness:blooming_cooksonia', + 'everness:frosted_icicle_floor', + }, + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:frosted_icesheet_under_plants_2', + deco_type = 'simple', + place_on = { + 'everness:ancient_emerald_ice', + 'everness:dense_emerald_ice', + 'everness:emerald_ice', + 'everness:frosted_ice', + 'everness:frosted_ice_translucent', + }, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.02, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:frosted_icesheet_under' }, + y_max = y_max, + y_min = y_min, + decoration = { 'everness:creeping_moss_spores' }, + flags = 'all_floors', + param2 = 26 +}) + +-- +-- On Generated +-- + +local size_ceiling = { x = 2, y = 19, z = 2 } +local size_ceiling_x = math.round(size_ceiling.x / 2) +local size_ceiling_z = math.round(size_ceiling.z / 2) +local size_floor = { x = 2, y = 20, z = 2 } +local size_floor_x = math.round(size_floor.x / 2) +local size_floor_z = math.round(size_floor.z / 2) + +local deco_id_frosted_icicle_large_ceiling = core.get_decoration_id('everness:frosted_icicle_large_ceiling') +local deco_id_frosted_icicle_large_floor = core.get_decoration_id('everness:frosted_icicle_large_floor') + +local biome_id_everness_frosted_icesheet_under = core.get_biome_id('everness:frosted_icesheet_under') + +Everness:register_gen_notify_decoration({ + deco_id_frosted_icicle_large_ceiling, + deco_id_frosted_icicle_large_floor +}) + +Everness:add_to_queue_on_generated({ + name = 'everness:frosted_icesheet_under', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_frosted_icesheet_under]) or table.indexof(biomemap, biome_id_everness_frosted_icesheet_under) ~= -1 + end, + after_write_to_map = function(shared_args, gennotify) + -- + -- Frosted Large Icicle Ceiling + -- + for _, pos in ipairs(gennotify['decoration#' .. deco_id_frosted_icicle_large_ceiling] or {}) do + local markers = core.find_nodes_in_area( + vector.new(pos.x - size_ceiling_x, pos.y - size_ceiling.y + 2, pos.z - size_ceiling_z), + vector.new(pos.x + size_ceiling_x, pos.y - size_ceiling.y, pos.z + size_ceiling_z), + { 'everness:marker' } + ) + + if #markers > 0 then + local pos_marker = markers[1] + local air_below = core.find_nodes_in_area( + vector.new(pos_marker.x, pos_marker.y, pos_marker.z), + vector.new(pos_marker.x, pos_marker.y - 7, pos_marker.z), + {'air'} + ) + + -- Replace marker + core.set_node(pos_marker, { name = 'everness:frosted_cave_ice_illuminating' }) + + if #air_below == 7 then + local incrementer = 1 + local pos_below = vector.new(pos_marker.x, pos_marker.y - incrementer, pos_marker.z) + local node_below = core.get_node(pos_below) + + Everness.stack_icicle_recursive(node_below, pos_below, incrementer, pos_marker, 'down') + end + end + end + + -- + -- Frosted Large Icicle Floor + -- + for _, pos in ipairs(gennotify['decoration#' .. deco_id_frosted_icicle_large_floor] or {}) do + local markers = core.find_nodes_in_area( + vector.new(pos.x - size_floor_x, pos.y + size_floor.y - 2, pos.z - size_floor_z), + vector.new(pos.x + size_floor_x, pos.y + size_floor.y, pos.z + size_floor_z), + { 'everness:marker' } + ) + + if #markers > 0 then + local pos_marker = markers[1] + local air_above = core.find_nodes_in_area( + vector.new(pos_marker.x, pos_marker.y, pos_marker.z), + vector.new(pos_marker.x, pos_marker.y + 7, pos_marker.z), + {'air'} + ) + + -- Replace marker + core.set_node(pos_marker, { name = 'everness:frosted_cave_ice_illuminating' }) + + -- Make sure we have some space + if #air_above == 7 then + local incrementer = 1 + local pos_above = vector.new(pos_marker.x, pos_marker.y + incrementer, pos_marker.z) + local node_above = core.get_node(pos_above) + + Everness.stack_icicle_recursive(node_above, pos_above, incrementer, pos_marker, 'up') + end + end + end + end +}) diff --git a/mods/everness/mapgen_mineral_waters.lua b/mods/everness/mapgen_mineral_waters.lua new file mode 100644 index 0000000..3467b9e --- /dev/null +++ b/mods/everness/mapgen_mineral_waters.lua @@ -0,0 +1,815 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_mineral_waters.y_max +local y_min = Everness.settings.biomes.everness_mineral_waters.y_min + +-- Mineral Waters + +Everness:register_biome({ + name = 'everness:mineral_waters', + node_top = 'everness:mineral_sand', + depth_top = 1, + node_filler = 'everness:mineral_stone', + depth_filler = 1, + node_stone = 'everness:mineral_stone', + node_riverbed = 'everness:mineral_sand', + depth_riverbed = 2, + node_dungeon = 'everness:mineral_stone_brick', + node_dungeon_alt = 'everness:mineral_stone_brick_with_growth', + node_dungeon_stair = 'stairs:stair_mineral_stone_brick', + y_max = y_max, + y_min = y_min, + vertical_blend = 16, + heat_point = 78, + humidity_point = 58, +}) + +-- +-- Register ores +-- + +-- Scatter ores + +-- Coal + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:mineral_stone_with_coal', + wherein = 'everness:mineral_stone', + clust_scarcity = 8 * 8 * 8, + clust_num_ores = 9, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:mineral_waters' } +}) + +Everness:register_ore({ + ore_type = 'scatter', + ore = 'everness:mineral_stone_with_ceramic_sherds', + wherein = 'everness:mineral_stone', + clust_scarcity = 14 * 14 * 14, + clust_num_ores = 5, + clust_size = 3, + y_max = y_max, + y_min = y_min, + biomes = { 'everness:mineral_waters' } +}) + +-- +-- On Generated +-- + +local function find_irecursive(tbl, c_id) + for _, v in ipairs(tbl) do + if type(v) == 'table' then + if find_irecursive(v, c_id) then + return true + end + elseif c_id == v then + return true + end + end + return false +end + +-- Get the content IDs for the nodes used +local c_everness_mineral_water_source = core.get_content_id('everness:mineral_water_source') +local c_everness_mineral_stone = core.get_content_id('everness:mineral_stone') +local c_everness_mineral_stone_brick = core.get_content_id('everness:mineral_stone_brick') +local c_everness_mineral_stone_brick_with_growth = core.get_content_id('everness:mineral_stone_brick_with_growth') +local c_everness_mineral_stone_brick_with_flower_growth = core.get_content_id('everness:mineral_stone_brick_with_flower_growth') +local c_everness_mineral_sand = core.get_content_id('everness:mineral_sand') +local c_everness_mineral_sandstone = core.get_content_id('everness:mineral_sandstone') +local c_everness_mineral_sandstone_block = core.get_content_id('everness:mineral_sandstone_block') +local c_everness_chest = core.get_content_id('everness:chest') +local c_everness_mineral_stone_with_coal = core.get_content_id('everness:mineral_stone_with_coal') +local c_everness_mineral_stone_with_ceramic_sherds = core.get_content_id('everness:mineral_stone_with_ceramic_sherds') +local c_everness_lotus_flower_white = core.get_content_id('everness:lotus_flower_white') +local c_everness_lotus_flower_purple = core.get_content_id('everness:lotus_flower_purple') +local c_everness_lotus_flower_pink = core.get_content_id('everness:lotus_flower_pink') +local c_everness_lotus_lotus_leaf = core.get_content_id('everness:lotus_leaf') +local c_everness_lotus_lotus_leaf_2 = core.get_content_id('everness:lotus_leaf_2') +local c_everness_lotus_lotus_leaf_3 = core.get_content_id('everness:lotus_leaf_3') +local c_everness_ceramic_pot_blank = core.get_content_id('everness:ceramic_pot_blank') +local c_everness_ceramic_pot_flowers = core.get_content_id('everness:ceramic_pot_flowers') +local c_everness_ceramic_pot_lines = core.get_content_id('everness:ceramic_pot_lines') +local c_everness_ceramic_pot_tribal = core.get_content_id('everness:ceramic_pot_tribal') +local c_everness_mineral_water_weed_1 = core.get_content_id('everness:mineral_water_weed_1') +local c_everness_mineral_water_weed_2 = core.get_content_id('everness:mineral_water_weed_2') +local c_everness_mineral_water_weed_3 = core.get_content_id('everness:mineral_water_weed_3') +local c_everness_water_geyser = core.get_content_id('everness:water_geyser') +local c_everness_rose_bush = core.get_content_id('everness:rose_bush') +-- Biome IDs +local biome_id_everness_mineral_waters = core.get_biome_id('everness:mineral_waters') + +-- Pool building blocks variations +local pool_build_nodes = { + { + c_everness_mineral_stone, + c_everness_mineral_stone_brick, + c_everness_mineral_stone_brick_with_growth, + c_everness_mineral_stone_brick_with_flower_growth + }, + { + c_everness_mineral_sandstone, + c_everness_mineral_sandstone_block + } +} +local c_lotus_flowers = { + c_everness_lotus_flower_white, + c_everness_lotus_flower_purple, + c_everness_lotus_flower_pink +} +local c_lotus_leaves = { + c_everness_lotus_lotus_leaf, + c_everness_lotus_lotus_leaf_2, + c_everness_lotus_lotus_leaf_3 +} +local c_pots = { + c_everness_ceramic_pot_blank, + c_everness_ceramic_pot_flowers, + c_everness_ceramic_pot_lines, + c_everness_ceramic_pot_tribal +} +local c_water_weeds = { + c_everness_mineral_water_weed_1, + c_everness_mineral_water_weed_2 +} + +local chance = 20 +local disp = 16 +local schem = core.get_modpath('everness') .. '/schematics/everness_mineral_waters_tower.mts' +local size = { x = 7, y = 16, z = 9 } +local size_x = math.round(size.x / 2) +local size_z = math.round(size.z / 2) + +Everness:add_to_queue_on_generated({ + name = 'everness:mineral_waters', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_mineral_waters]) or table.indexof(biomemap, biome_id_everness_mineral_waters) ~= -1 + end, + on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args, biomemap) + biomemap = biomemap or core.get_mapgen_object('biomemap') or {} + local csize_x = maxp.x - minp.x + 1 + local rand_version = rand:next(1, 2) + local chest_positions = {} + local pot_pos = {} + + if rand_version == 1 then + -- + -- Pools + -- + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + for x = minp.x, maxp.x do + local b_idx_start = (z - minp.z) * csize_x + (x - minp.x) + 1 + if biomemap[b_idx_start] == biome_id_everness_mineral_waters then + local ai = area:index(x, y, z) + local node_cid = data[ai] + local node_name = core.get_name_from_content_id(node_cid) + local node_def = core.registered_nodes[node_name] + + local is_start_tree_or_leaf = node_def and node_def.groups and ( + (node_def.groups.tree and node_def.groups.tree > 0) + or (node_def.groups.leaves and node_def.groups.leaves > 0) + or (node_def.groups.wood and node_def.groups.wood > 0) + ) + + local is_start_ground = node_def and node_def.walkable + and not is_start_tree_or_leaf + and ( + node_cid == c_everness_mineral_sand + or node_cid == c_everness_mineral_stone + or (node_def.groups and (node_def.groups.sand or node_def.groups.stone or node_def.groups.soil)) + ) + + if + data[ai + area.ystride] == core.CONTENT_AIR + and is_start_ground + then + local length = 5 + rand:next(0, 10) + local width = 5 + rand:next(0, 10) + local height = 3 + rand:next(0, 4) + local walkable_nodes = 0 + local invalid_placement = false + + -- find space for lake (walkable rectangle) + for li = 1, length do + local x_rec = x + li + + for wi = 1, width do + local z_rec = z + wi + local ai_rec = (ai + li) + (area.zstride * wi) + local n_cid = data[ai_rec] + + local is_target_biome + -- 1. Fast path: check biomemap flat array (within chunk bounds) + if x_rec >= minp.x and x_rec <= maxp.x and z_rec >= minp.z and z_rec <= maxp.z then + local b_idx = (z_rec - minp.z) * csize_x + (x_rec - minp.x) + 1 + is_target_biome = (biomemap[b_idx] == biome_id_everness_mineral_waters) + else + -- 2. Fallback: for coordinates extending outside chunk boundaries + local b_data = core.get_biome_data({ x = x_rec, y = y, z = z_rec }) + is_target_biome = (b_data and b_data.biome == biome_id_everness_mineral_waters) + end + + if n_cid == core.CONTENT_IGNORE then + if is_target_biome then + walkable_nodes = walkable_nodes + 1 + else + invalid_placement = true + break + end + else + local n_name = core.get_name_from_content_id(n_cid) + local n_def = core.registered_nodes[n_name] + + local is_tree_or_leaf = n_def and n_def.groups and ( + (n_def.groups.tree and n_def.groups.tree > 0) + or (n_def.groups.leaves and n_def.groups.leaves > 0) + or (n_def.groups.wood and n_def.groups.wood > 0) + ) + + if not is_target_biome or is_tree_or_leaf then + invalid_placement = true + break + end + + if n_def + and n_def.walkable + and data[ai_rec + area.ystride] == core.CONTENT_AIR + then + walkable_nodes = walkable_nodes + 1 + end + end + end + + if invalid_placement then + break + end + end + + -- build pool (cuboid) + if not invalid_placement and walkable_nodes >= (width * length * 0.75) then + local pool_build_nodes_group = pool_build_nodes[rand:next(1, #pool_build_nodes)] + -- offset y so the pools are sticking out / sinking in from the ground vertically + local ai_offset_y = ai - (area.ystride * height) + (area.ystride * rand:next(0, math.ceil(height / 2))) + + for hi = 1, height do + for li = 1, length do + for wi = 1, width do + local mineral_stone = pool_build_nodes_group[rand:next(1, #pool_build_nodes_group)] + local ai_cub = (ai_offset_y + li) + (area.ystride * hi) + (area.zstride * wi) + local current_c_id = data[ai_cub] + + local is_outer_boundary = (hi == 1 or li == 1 or li == length or wi == 1 or wi == width) + + if is_outer_boundary then + -- Guarantee 100% solid floor (hi == 1) and all 4 solid perimeter walls to prevent leaks + if not find_irecursive(pool_build_nodes, current_c_id) then + data[ai_cub] = mineral_stone + end + else + -- Interior of the pool: fill with water + data[ai_cub] = c_everness_mineral_water_source + end + + -- place loot chest in the middle of the pool floor + if hi == 2 + and height > 4 + and math.ceil(length / 2) == li + and math.ceil(width / 2) == wi + and data[ai_cub - area.ystride] ~= c_everness_mineral_water_source + and rand:next(0, 100) < 3 + then + data[ai_cub] = c_everness_chest + table.insert(chest_positions, vector.new(area:position(ai_cub))) + end + end + end + end + end + end + end + end + end + end + + -- Plug any holes along chunk boundaries where adjacent lake chunks placed water + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + for x = minp.x, maxp.x do + if x == minp.x or x == maxp.x or z == minp.z or z == maxp.z or z == minp.z + 1 or z == maxp.z - 1 then + local ai = area:index(x, y, z) + if data[ai] == core.CONTENT_AIR then + local is_leaking = false + + if x == minp.x and data[ai - 1] == c_everness_mineral_water_source then + is_leaking = true + elseif x == maxp.x and data[ai + 1] == c_everness_mineral_water_source then + is_leaking = true + elseif (z == minp.z and (data[ai - area.zstride] == c_everness_mineral_water_source or data[ai - area.zstride * 2] == c_everness_mineral_water_source)) + or (z == minp.z + 1 and data[ai - area.zstride * 2] == c_everness_mineral_water_source) then + is_leaking = true + elseif (z == maxp.z and (data[ai + area.zstride] == c_everness_mineral_water_source or data[ai + area.zstride * 2] == c_everness_mineral_water_source)) + or (z == maxp.z - 1 and data[ai + area.zstride * 2] == c_everness_mineral_water_source) then + is_leaking = true + end + + if is_leaking then + data[ai] = c_everness_mineral_sand + -- Support down if there is air below so the sand wall is solid + local down_count = 1 + while down_count <= 8 do + local down_ai = ai - area.ystride * down_count + if data[down_ai] == core.CONTENT_AIR then + data[down_ai] = c_everness_mineral_sand + else + break + end + down_count = down_count + 1 + end + end + end + end + end + end + end + elseif rand_version == 2 then + -- + -- Lakes + -- + local function is_valid_lake_node(c_id, nx, ny, nz) + if c_id == c_everness_mineral_sand + or c_id == c_everness_mineral_water_source + or c_id == c_everness_mineral_stone + or c_id == c_everness_mineral_stone_with_coal + or c_id == c_everness_mineral_stone_with_ceramic_sherds + then + return true + end + -- At chunk boundaries, ungenerated adjacent chunk nodes in data are CONTENT_IGNORE + if c_id == core.CONTENT_IGNORE then + local is_target_biome + if nx >= minp.x and nx <= maxp.x and nz >= minp.z and nz <= maxp.z then + local b_idx = (nz - minp.z) * csize_x + (nx - minp.x) + 1 + is_target_biome = (biomemap[b_idx] == biome_id_everness_mineral_waters) + else + local b_data = core.get_biome_data({ x = nx, y = ny, z = nz }) + is_target_biome = (b_data and b_data.biome == biome_id_everness_mineral_waters) + end + return is_target_biome == true + end + return false + end + + for z = minp.z, maxp.z do + for y = minp.y, maxp.y do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + local c_current = data[ai] + + -- Check 4 horizontal cardinal neighbors (+X, -X, +Z, -Z) + local c_right = data[ai + 1] + local c_left = data[ai - 1] + local c_front = data[ai + (area.zstride * 2)] + local c_back = data[ai - (area.zstride * 2)] + + local keep_going = true + local while_count = 1 + local max_dig_depth = 11 + + if + c_current == c_everness_mineral_sand + and is_valid_lake_node(c_right, x + 1, y, z) + and is_valid_lake_node(c_left, x - 1, y, z) + and is_valid_lake_node(c_front, x, y, z + 2) + and is_valid_lake_node(c_back, x, y, z - 2) + then + -- dig below + while keep_going and while_count <= max_dig_depth do + local while_index = ai - area.ystride * while_count + local cur_y = y - while_count + + if + ( + data[while_index] == c_everness_mineral_stone + or data[while_index] == c_everness_mineral_stone_with_coal + or data[while_index] == c_everness_mineral_stone_with_ceramic_sherds + ) + and is_valid_lake_node(data[while_index + 1 + area.ystride], x + 1, cur_y + 1, z) + and is_valid_lake_node(data[while_index - 1 + area.ystride], x - 1, cur_y + 1, z) + and is_valid_lake_node(data[while_index + area.zstride + area.ystride], x, cur_y + 1, z + 1) + and is_valid_lake_node(data[while_index - area.zstride + area.ystride], x, cur_y + 1, z - 1) + then + data[while_index + area.ystride] = c_everness_mineral_water_source + else + keep_going = false + end + + while_count = while_count + 1 + end + end + end + end + end + end + + -- Place decorations after generating (2nd pass) + -- luacheck: ignore 512 + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + -- + -- Place Lotus Flowers and Leaves + -- + if + data[ai] == c_everness_mineral_water_source + -- spawn around water + and data[ai + 1 + area.zstride] == c_everness_mineral_water_source + and data[ai + 1 - area.zstride] == c_everness_mineral_water_source + and data[ai + 1] == c_everness_mineral_water_source + and data[ai - 1] == c_everness_mineral_water_source + and data[ai - 1 + area.zstride] == c_everness_mineral_water_source + and data[ai - 1 - area.zstride] == c_everness_mineral_water_source + and data[ai + area.zstride] == c_everness_mineral_water_source + and data[ai - area.zstride] == c_everness_mineral_water_source + -- make sure there is space above + and data[ai + area.ystride] == core.CONTENT_AIR + -- spawn around air above + and data[ai + area.ystride + 1] == core.CONTENT_AIR + and data[ai + area.ystride + 1 + area.zstride] == core.CONTENT_AIR + and data[ai + area.ystride + 1 - area.zstride] == core.CONTENT_AIR + and data[ai + area.ystride - 1] == core.CONTENT_AIR + and data[ai + area.ystride - 1 + area.zstride] == core.CONTENT_AIR + and data[ai + area.ystride - 1 - area.zstride] == core.CONTENT_AIR + and data[ai + area.ystride + area.zstride] == core.CONTENT_AIR + and data[ai + area.ystride - area.zstride] == core.CONTENT_AIR + then + if rand:next(0, 100) < 2 then + data[ai + area.ystride] = c_lotus_flowers[rand:next(1, #c_lotus_flowers)] + + -- Place Lotus Leaves around Flowers + local radius = 3 + local chance_max = 80 + + for i = -radius, radius do + for j = -radius, radius do + local idx = ai + i + (area.zstride * j) + area.ystride + local distance = math.round(vector.distance(area:position(ai), area:position(idx))) + local chance_lotus_leaf = math.round(chance_max / distance) + + if chance_lotus_leaf > chance_max then + chance_lotus_leaf = chance_max + end + + if + rand:next(0, 100) < chance_lotus_leaf + and data[idx] == core.CONTENT_AIR + and data[idx - area.ystride] == c_everness_mineral_water_source + then + data[idx] = c_lotus_leaves[rand:next(1, #c_lotus_leaves)] + p2data[idx] = rand:next(0, 3) + end + end + end + elseif rand:next(0, 100) < 4 then + data[ai + area.ystride] = c_lotus_leaves[rand:next(1, #c_lotus_leaves)] + p2data[ai + area.ystride] = rand:next(0, 3) + + -- add some more leaves around the leaf + for i = -1, 1 do + for j = -1, 1 do + local idx = ai + i + (area.zstride * j) + area.ystride + + if + rand:next(0, 100) < 25 + and data[idx] == core.CONTENT_AIR + and data[idx - area.ystride] == c_everness_mineral_water_source + then + data[idx] = c_lotus_leaves[rand:next(1, #c_lotus_leaves)] + p2data[idx] = rand:next(0, 3) + end + end + end + end + end + + -- + -- Place Seaweed + -- + if + data[ai] == c_everness_mineral_water_source + and data[ai + area.ystride] == c_everness_mineral_water_source + and rand:next(0, 100) < 33 + then + local c_weed = c_water_weeds[rand:next(1, #c_water_weeds)] + + if rand:next(0, 100) < 5 then + -- Weed with light source with a bit less probability + c_weed = c_everness_mineral_water_weed_3 + end + + if data[ai + 1] == c_everness_mineral_stone then + data[ai + 1] = c_weed + data[ai + 1] = c_weed + data[ai + 1] = c_weed + p2data[ai + 1] = 2 + elseif data[ai - 1] == c_everness_mineral_stone then + data[ai - 1] = c_weed + data[ai - 1] = c_weed + data[ai - 1] = c_weed + p2data[ai - 1] = 3 + elseif data[ai + area.zstride] == c_everness_mineral_stone then + data[ai + area.zstride] = c_weed + data[ai + area.zstride] = c_weed + data[ai + area.zstride] = c_weed + p2data[ai + area.zstride] = 4 + elseif data[ai - area.zstride] == c_everness_mineral_stone then + data[ai - area.zstride] = c_weed + data[ai - area.zstride] = c_weed + data[ai - area.zstride] = c_weed + p2data[ai - area.zstride] = 5 + elseif data[ai - area.ystride] == c_everness_mineral_stone then + data[ai - area.ystride] = c_weed + data[ai - area.ystride] = c_weed + data[ai - area.ystride] = c_weed + p2data[ai - area.ystride] = 1 + end + end + + -- + -- Place pots under water + -- + if + data[ai] == c_everness_mineral_water_source + -- spawn around water + and data[ai + 1 + area.zstride] == c_everness_mineral_water_source + and data[ai + 1 - area.zstride] == c_everness_mineral_water_source + and data[ai + 1] == c_everness_mineral_water_source + and data[ai - 1] == c_everness_mineral_water_source + and data[ai - 1 + area.zstride] == c_everness_mineral_water_source + and data[ai - 1 - area.zstride] == c_everness_mineral_water_source + and data[ai + area.zstride] == c_everness_mineral_water_source + and data[ai - area.zstride] == c_everness_mineral_water_source + -- spawn around water above + and data[ai + area.ystride] == c_everness_mineral_water_source + and data[ai + area.ystride + 1] == c_everness_mineral_water_source + and data[ai + area.ystride + 1 + area.zstride] == c_everness_mineral_water_source + and data[ai + area.ystride + 1 - area.zstride] == c_everness_mineral_water_source + and data[ai + area.ystride - 1] == c_everness_mineral_water_source + and data[ai + area.ystride - 1 + area.zstride] == c_everness_mineral_water_source + and data[ai + area.ystride - 1 - area.zstride] == c_everness_mineral_water_source + and data[ai + area.ystride + area.zstride] == c_everness_mineral_water_source + and data[ai + area.ystride - area.zstride] == c_everness_mineral_water_source + -- spawn on solid node below + and data[ai - area.ystride] ~= c_everness_mineral_water_source + then + if rand:next(0, 100) < 1 then + table.insert(pot_pos, vector.new(area:position(ai))) + end + end + + -- + -- Surface Decorations on dry mineral sand (Rose Bush, Water Geyser, Pots) + -- + if + data[ai] == c_everness_mineral_sand + and data[ai + area.ystride] == core.CONTENT_AIR + then + local r_val = rand:next(1, 1000) + if r_val <= 6 then + -- Rose Bush (needs air around) + if data[ai + area.ystride * 2] == core.CONTENT_AIR + and data[ai + 1 + area.ystride] == core.CONTENT_AIR + and data[ai - 1 + area.ystride] == core.CONTENT_AIR + and data[ai + area.zstride + area.ystride] == core.CONTENT_AIR + and data[ai - area.zstride + area.ystride] == core.CONTENT_AIR + then + data[ai + area.ystride] = c_everness_rose_bush + end + elseif r_val <= 9 then + -- Water Geyser (needs air around) + if data[ai + area.ystride * 2] == core.CONTENT_AIR + and data[ai + 1 + area.ystride] == core.CONTENT_AIR + and data[ai - 1 + area.ystride] == core.CONTENT_AIR + and data[ai + area.zstride + area.ystride] == core.CONTENT_AIR + and data[ai - area.zstride + area.ystride] == core.CONTENT_AIR + then + data[ai + area.ystride] = c_everness_water_geyser + end + elseif r_val <= 12 then + -- Ceramic Pots (above water on dry sand) + if data[ai + area.ystride * 2] == core.CONTENT_AIR then + data[ai + area.ystride] = c_pots[rand:next(1, #c_pots)] + end + end + end + end + end + end + + -- Set `shared_args` + shared_args.chest_positions = chest_positions + shared_args.pot_pos = pot_pos + end, + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + local sidelength = maxp.x - minp.x + 1 + local x_disp = rand:next(0, disp) + local z_disp = rand:next(0, disp) + shared_args.schem_positions = {} + + for y = minp.y, maxp.y do + local vi = area:index(minp.x + sidelength / 2 + x_disp, y, minp.z + sidelength / 2 + z_disp) + + if data[vi + area.ystride] == core.CONTENT_AIR + and ( + data[vi] == c_everness_mineral_water_source + or data[vi] == c_everness_mineral_sand + ) + and rand:next(0, 100) < chance + then + local s_pos = area:position(vi) + + -- + -- Mineral Waters Tower + -- + + -- find floor big enough + local positions = core.find_nodes_in_area_under_air( + vector.new(s_pos.x - size_x, s_pos.y - 1, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + 1, s_pos.z + size_z), + { + 'everness:mineral_sand', + 'everness:mineral_water_source' + } + ) + + if #positions < size.x * size.z then + -- not enough space + return + end + + -- enough air to place structure ? + local air_positions = core.find_nodes_in_area( + vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z), + { + 'air' + } + ) + + if #air_positions > (size.x * size.y * size.z) / 2 then + core.place_schematic_on_vmanip( + vm, + s_pos, + schem, + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + + shared_args.schem_positions.everness_mineral_waters_tower = shared_args.schem_positions.everness_mineral_waters_tower or {} + + table.insert(shared_args.schem_positions.everness_mineral_waters_tower, { + pos = s_pos, + minp = vector.new(s_pos.x - size_x, s_pos.y, s_pos.z - size_z), + maxp = vector.new(s_pos.x + size_x, s_pos.y + size.y, s_pos.z + size_z) + }) + + core.log('action', '[Everness] Mineral Waters Tower was placed at ' .. s_pos:to_string()) + end + end + end + + -- + -- Palm Trees (placed on dry mineral sand after pools & lakes) + -- + local num_palms = rand:next(1, 33) + for _ = 1, num_palms do + local px = rand:next(minp.x + 3, maxp.x - 3) + local pz = rand:next(minp.z + 3, maxp.z - 3) + for py = maxp.y, minp.y, -1 do + local vi = area:index(px, py, pz) + local c_ground = data[vi] + if c_ground == c_everness_mineral_sand and data[vi + area.ystride] == core.CONTENT_AIR then + local p = vector.new(px, py + 1, pz) + local air_positions = core.find_nodes_in_area( + vector.new(p.x - 2, p.y, p.z - 2), + vector.new(p.x + 2, p.y + 6, p.z + 2), + { 'air' } + ) + if #air_positions >= 25 then + core.place_schematic_on_vmanip( + vm, + p, + core.get_modpath('everness') .. '/schematics/everness_palm_tree.mts', + 'random', + nil, + true, + 'place_center_x, place_center_z' + ) + end + break + elseif c_ground ~= core.CONTENT_AIR and c_ground ~= core.CONTENT_IGNORE then + break + end + end + end + + -- + -- Pots (under water) + -- + local pot_pos = shared_args.pot_pos or {} + for _, v in ipairs(pot_pos) do + vm:set_node_at(v, { name = core.get_name_from_content_id(c_pots[rand:next(1, #c_pots)]) }) + end + end, + after_write_to_map = function(shared_args, gennotify, rand, minp, maxp) + -- Populate loot chest inventory + local chest_positions = shared_args.chest_positions or {} + + if next(chest_positions) then + Everness:populate_loot_chests(chest_positions) + end + + -- Populate loot chest inventory for schematics + local schem_positions = shared_args.schem_positions or {} + + for name, tbl in pairs(schem_positions) do + if next(tbl) then + for i, v in ipairs(tbl) do + local chest_positions2 = core.find_nodes_in_area( + v.minp, + v.maxp, + { 'everness:chest' } + ) + + if #chest_positions2 > 0 then + Everness:populate_loot_chests(chest_positions2) + end + end + end + end + + -- Populate ceramic pot inventory + local pot_nodes = { + 'everness:ceramic_pot_blank', + 'everness:ceramic_pot_flowers', + 'everness:ceramic_pot_lines', + 'everness:ceramic_pot_tribal' + } + local pot_positions = (minp and maxp and core.find_nodes_in_area(minp, maxp, pot_nodes)) or {} + for _, p in ipairs(pot_positions) do + local meta = core.get_meta(p) + local inv = meta:get_inventory() + if not inv or inv:get_size('main') == 0 then + local n = core.get_node(p) + local ndef = core.registered_nodes[n.name] + if ndef and ndef.on_construct then + ndef.on_construct(p) + end + inv = meta:get_inventory() + end + if inv and inv:get_size('main') > 0 and inv:is_empty('main') then + local rand_idx = rand:next(1, #Everness.loot_chest.default) + local item_def = Everness.loot_chest.default[rand_idx] + + if item_def and core.registered_items[item_def.name] then + if rand:next(0, 100) <= item_def.chance then + local stack = ItemStack(item_def.name) + + if core.registered_tools[item_def.name] then + stack:set_wear(rand:next(1, 65535)) + else + stack:set_count(rand:next(1, math.min(item_def.max_count, stack:get_stack_max()))) + end + + inv:set_stack('main', 1, stack) + end + end + end + end + end +}) diff --git a/mods/everness/mapgen_mineral_waters_under.lua b/mods/everness/mapgen_mineral_waters_under.lua new file mode 100644 index 0000000..499050d --- /dev/null +++ b/mods/everness/mapgen_mineral_waters_under.lua @@ -0,0 +1,737 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Register biomes +-- + +local y_max = Everness.settings.biomes.everness_mineral_waters_under.y_max +local y_min = Everness.settings.biomes.everness_mineral_waters_under.y_min + +-- Mineral Waters + +Everness:register_biome({ + name = 'everness:mineral_waters_under', + node_stone = 'everness:mineral_cave_stone', + node_filler = 'everness:mineral_cave_stone', + node_cave_liquid = 'everness:lava_source', + node_water = 'air', + node_dungeon = 'everness:mineral_stone_brick', + node_dungeon_alt = 'everness:mineral_stone_brick_with_growth', + node_dungeon_stair = 'stairs:stair_mineral_stone_brick', + y_max = y_max, + y_min = y_min, + vertical_blend = 16, + heat_point = 78, + humidity_point = 58, +}) + +-- +-- Ores +-- + +core.register_on_mods_loaded(function() + local c_mapgen_stone = core.get_content_id('mapgen_stone') + local mapgen_stone_itemstring = core.get_name_from_content_id(c_mapgen_stone) + + for name, def in pairs(core.registered_ores) do + local wherein = def.wherein + local biomes = def.biomes + + if type(def.wherein) == 'string' then + wherein = { wherein } + end + + -- Register the same ores what are defined for `mapgen_stone` + if + wherein + and type(wherein) == 'table' + and table.indexof(wherein, mapgen_stone_itemstring) > -1 + and not biomes + -- ignore ores that replace everything + and def.clust_scarcity ~= 1 + then + -- prevent overriding orignal definition (breaks some mods) + def = table.copy(def) + def.wherein = { 'everness:mineral_cave_stone' } + def.biomes = { 'everness:mineral_waters_under' } + def.y_max = y_max + def.y_min = y_min + + Everness:register_ore(def) + end + end +end) + +-- Blob ore. +-- These before scatter ores to avoid other ores in blobs. + +Everness:register_ore({ + ore_type = 'blob', + ore = 'everness:mineral_stone', + wherein = { 'everness:mineral_cave_stone' }, + clust_scarcity = 16 * 16 * 16, + clust_size = 5, + y_max = y_max, + y_min = y_min, + noise_threshold = 0.0, + noise_params = { + offset = 0.5, + scale = 0.2, + spread = { x = 5, y = 5, z = 5 }, + seed = 766, + octaves = 1, + persist = 0.0 + }, + biomes = { 'everness:mineral_waters_under' } +}) + +-- +-- Register decorations +-- + +Everness:register_decoration({ + name = 'everness:mineral_waters_under_floors', + deco_type = 'simple', + place_on = { 'everness:mineral_cave_stone' }, + sidelen = 16, + place_offset_y = -1, + fill_ratio = 10, + biomes = { 'everness:mineral_waters_under' }, + y_max = y_max, + y_min = y_min, + flags = 'all_floors, force_placement', + decoration = { + 'everness:mineral_lava_stone' + }, +}) + +-- +-- Floors +-- + +Everness:register_decoration({ + name = 'everness:mineral_waters_under_volcanic_spike', + deco_type = 'simple', + place_on = { + 'everness:mineral_lava_stone', + 'everness:mineral_cave_stone' + }, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.09, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:mineral_waters_under' }, + spawn_by = 'air', + check_offset = 0, + num_spawn_by = 1, + decoration = { + 'everness:marker' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:mineral_waters_under_lava_stone_spike', + deco_type = 'simple', + place_on = { + 'everness:mineral_lava_stone', + 'everness:mineral_cave_stone' + }, + sidelen = 16, + noise_params = { + offset = -0.015, + scale = 0.075, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:mineral_waters_under' }, + decoration = { + 'everness:marker' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:mineral_waters_under_lava_tree', + deco_type = 'simple', + place_on = { + 'everness:mineral_lava_stone', + 'everness:mineral_cave_stone', + 'everness:mineral_lava_stone_with_moss' + }, + sidelen = 16, + fill_ratio = 0.025, + biomes = { 'everness:mineral_waters_under' }, + decoration = { + 'everness:marker' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_floors', +}) + +-- +-- Ceilings +-- + +Everness:register_decoration({ + name = 'everness:mineral_waters_under_volcanic_spike_ceiling', + deco_type = 'simple', + place_on = { + 'everness:mineral_lava_stone', + 'everness:mineral_cave_stone' + }, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.09, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:mineral_waters_under' }, + decoration = { + 'everness:marker' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_ceilings', +}) + +-- +-- On Generated +-- + +-- Get the content IDs for the nodes used +local c_everness_wall_vine_cave_cyan = core.get_content_id('everness:wall_vine_cave_cyan') +local c_everness_wall_vine_cave_violet = core.get_content_id('everness:wall_vine_cave_violet') +local c_everness_wall_vine_cave_blue = core.get_content_id('everness:wall_vine_cave_blue') +local c_everness_mineral_lava_stone = core.get_content_id('everness:mineral_lava_stone') +local c_everness_mineral_cave_stone = core.get_content_id('everness:mineral_cave_stone') +local c_everness_mineral_cave_cobblestone = core.get_content_id('everness:mineral_cave_cobblestone') +local c_everness_lava_source = core.get_content_id('everness:lava_source') +local c_everness_marker = core.get_content_id('everness:marker') +local c_everness_volcanic_rock = core.get_content_id('everness:volcanic_rock') +local c_everness_volcanic_spike_1 = core.get_content_id('everness:volcanic_spike_1') +local c_everness_volcanic_spike_2 = core.get_content_id('everness:volcanic_spike_2') +local c_everness_volcanic_spike_3 = core.get_content_id('everness:volcanic_spike_3') +local c_everness_volcanic_spike_4 = core.get_content_id('everness:volcanic_spike_4') +local c_everness_volcanic_spike_5 = core.get_content_id('everness:volcanic_spike_5') +local c_everness_volcanic_spike_6 = core.get_content_id('everness:volcanic_spike_6') +local c_everness_volcanic_spike_7 = core.get_content_id('everness:volcanic_spike_7') +local c_everness_mineral_cave_stone_spike_1 = core.get_content_id('everness:mineral_cave_stone_spike_1') +local c_everness_mineral_cave_stone_spike_2 = core.get_content_id('everness:mineral_cave_stone_spike_2') +local c_everness_mineral_cave_stone_spike_3 = core.get_content_id('everness:mineral_cave_stone_spike_3') +local c_everness_mineral_cave_stone_spike_4 = core.get_content_id('everness:mineral_cave_stone_spike_4') +local c_everness_mineral_cave_stone_spike_5 = core.get_content_id('everness:mineral_cave_stone_spike_5') +local c_everness_mineral_cave_stone_spike_6 = core.get_content_id('everness:mineral_cave_stone_spike_6') +local c_everness_mineral_cave_stone_spike_7 = core.get_content_id('everness:mineral_cave_stone_spike_7') +local c_everness_mineral_lava_stone_spike_1 = core.get_content_id('everness:mineral_lava_stone_spike_1') +local c_everness_mineral_lava_stone_spike_2 = core.get_content_id('everness:mineral_lava_stone_spike_2') +local c_everness_mineral_lava_stone_spike_3 = core.get_content_id('everness:mineral_lava_stone_spike_3') +local c_everness_mineral_lava_stone_spike_4 = core.get_content_id('everness:mineral_lava_stone_spike_4') +local c_everness_mineral_lava_stone_spike_5 = core.get_content_id('everness:mineral_lava_stone_spike_5') +local c_everness_mineral_lava_stone_spike_6 = core.get_content_id('everness:mineral_lava_stone_spike_6') +local c_everness_mineral_lava_stone_spike_7 = core.get_content_id('everness:mineral_lava_stone_spike_7') +local c_everness_mineral_lava_stone_with_moss = core.get_content_id('everness:mineral_lava_stone_with_moss') +-- Biome IDs +local biome_id_everness_mineral_waters_under = core.get_biome_id('everness:mineral_waters_under') +-- Decoration IDs +local d_everness_mineral_waters_under_volcanic_spike = core.get_decoration_id('everness:mineral_waters_under_volcanic_spike') +local d_everness_mineral_waters_under_volcanic_spike_ceiling = core.get_decoration_id('everness:mineral_waters_under_volcanic_spike_ceiling') +local d_everness_mineral_waters_under_lava_stone_spike = core.get_decoration_id('everness:mineral_waters_under_lava_stone_spike') +local d_everness_mineral_waters_under_lava_tree = core.get_decoration_id('everness:mineral_waters_under_lava_tree') + +local volcanic_spike_place_on = Everness.to_set(core.registered_decorations['everness:mineral_waters_under_volcanic_spike'].place_on) +local volcanic_spike_ceiling_place_on = Everness.to_set(core.registered_decorations['everness:mineral_waters_under_volcanic_spike_ceiling'].place_on) +local lava_stone_spike_place_on = Everness.to_set(core.registered_decorations['everness:mineral_waters_under_lava_stone_spike'].place_on) +local lava_tree_place_on = Everness.to_set(core.registered_decorations['everness:mineral_waters_under_lava_tree'].place_on) + +-- `core.read_schematic` here so we don't cache the schem file, otherwise `replacements` will not work +local schem_everness_lava_tree = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_lava_tree.mts', {}) +local lava_tree_size = { x = 7, y = 13, z = 7 } +local lava_tree_size_x = math.round(lava_tree_size.x / 2) +local lava_tree_size_z = math.round(lava_tree_size.z / 2) +local lava_tree_safe_volume = lava_tree_size.x * lava_tree_size.y * lava_tree_size.z + +local wall_vines = { + c_everness_wall_vine_cave_cyan, + c_everness_wall_vine_cave_violet, + c_everness_wall_vine_cave_blue +} + +local volcanic_spike_map = { + c_everness_volcanic_rock, + c_everness_volcanic_spike_1, + c_everness_volcanic_spike_2, + c_everness_volcanic_spike_3, + c_everness_volcanic_spike_4, + c_everness_volcanic_spike_5, + c_everness_volcanic_spike_6, + c_everness_volcanic_spike_7 +} + +local cave_stone_spike_map = { + c_everness_mineral_cave_cobblestone, + c_everness_mineral_cave_stone_spike_1, + c_everness_mineral_cave_stone_spike_2, + c_everness_mineral_cave_stone_spike_3, + c_everness_mineral_cave_stone_spike_4, + c_everness_mineral_cave_stone_spike_5, + c_everness_mineral_cave_stone_spike_6, + c_everness_mineral_cave_stone_spike_7 +} + +local lava_stone_spike_map = { + c_everness_mineral_lava_stone, + c_everness_mineral_lava_stone_spike_1, + c_everness_mineral_lava_stone_spike_2, + c_everness_mineral_lava_stone_spike_3, + c_everness_mineral_lava_stone_spike_4, + c_everness_mineral_lava_stone_spike_5, + c_everness_mineral_lava_stone_spike_6, + c_everness_mineral_lava_stone_spike_7 +} + +Everness:register_gen_notify_decoration({ + d_everness_mineral_waters_under_volcanic_spike, + d_everness_mineral_waters_under_lava_stone_spike, + d_everness_mineral_waters_under_volcanic_spike_ceiling, + d_everness_mineral_waters_under_lava_tree +}) + +Everness:add_to_queue_on_generated({ + name = 'everness:mineral_waters_under', + can_run = function(biomemap, chunk_biomes) + return (chunk_biomes and chunk_biomes[biome_id_everness_mineral_waters_under]) or table.indexof(biomemap, biome_id_everness_mineral_waters_under) ~= -1 + end, + -- read/write to `data` what will be eventually saved (set_data) + -- used for voxelmanip `data` manipulation + on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args) + local rand_version = rand:next(1, 2) + shared_args.rand_version = rand_version + + if rand_version == 1 then + -- + -- Lakes + -- + for z = minp.z, maxp.z do + for y = minp.y, maxp.y do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + local c_current = data[ai] + + -- +Y, -Y, +X, -X, +Z, -Z + -- top, bottom, right, left, front, back + -- right + local c_right = data[ai + 1] + -- left + local c_left = data[ai - 1] + -- front + local c_front = data[ai + area.zstride] + -- back + local c_back = data[ai - area.zstride] + + local keep_going = true + local while_count = 1 + local max_dig_depth = 11 + + if + c_current == c_everness_mineral_lava_stone + and ( + c_right == c_everness_mineral_lava_stone + or c_right == c_everness_mineral_cave_stone + or c_right == c_everness_lava_source + ) + and ( + c_left == c_everness_mineral_lava_stone + or c_left == c_everness_mineral_cave_stone + or c_left == c_everness_lava_source + ) + and ( + c_front == c_everness_mineral_lava_stone + or c_front == c_everness_mineral_cave_stone + or c_front == c_everness_lava_source + ) + and ( + c_back == c_everness_mineral_lava_stone + or c_back == c_everness_mineral_cave_stone + or c_back == c_everness_lava_source + ) + then + -- dig below + while keep_going and while_count <= max_dig_depth do + local while_index = ai - area.ystride * while_count + + if + -- below + data[while_index] == c_everness_mineral_cave_stone + and ( + -- right + data[while_index + 1 + area.ystride] == c_everness_mineral_lava_stone + or data[while_index + 1 + area.ystride] == c_everness_lava_source + or data[while_index + 1 + area.ystride] == c_everness_mineral_cave_stone + ) + and ( + -- left + data[while_index - 1 + area.ystride] == c_everness_mineral_lava_stone + or data[while_index - 1 + area.ystride] == c_everness_lava_source + or data[while_index - 1 + area.ystride] == c_everness_mineral_cave_stone + ) + and ( + -- front + data[while_index + area.zstride + area.ystride] == c_everness_mineral_lava_stone + or data[while_index + area.zstride + area.ystride] == c_everness_lava_source + or data[while_index + area.zstride + area.ystride] == c_everness_mineral_cave_stone + ) + and ( + -- back + data[while_index - area.zstride + area.ystride] == c_everness_mineral_lava_stone + or data[while_index - area.zstride + area.ystride] == c_everness_lava_source + or data[while_index - area.zstride + area.ystride] == c_everness_mineral_cave_stone + ) + then + data[while_index + area.ystride] = c_everness_lava_source + else + keep_going = false + end + + while_count = while_count + 1 + end + end + end + end + end + else + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + + if + data[ai] == c_everness_mineral_lava_stone + and data[ai + area.ystride] == core.CONTENT_AIR + and rand:next(0, 100) <= 10 + then + local radius = 7 + local chance_max = 80 + + for h = -3, 3 do + for i = -radius, radius do + for j = -radius, radius do + local idx = ai + i + (area.zstride * j) + (area.ystride * h) + local distance = math.round(vector.distance(area:position(ai), area:position(idx))) + local chance_moss = math.round(chance_max / distance) + + if chance_moss > chance_max then + chance_moss = chance_max + end + + if + data[idx] == c_everness_mineral_lava_stone + and rand:next(0, 100) < chance_moss + then + data[idx] = c_everness_mineral_lava_stone_with_moss + end + end + end + end + end + end + end + end + end + + -- + -- Decorations + -- + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + for x = minp.x, maxp.x do + local vi = area:index(x, y, z) + + if + data[vi] == core.CONTENT_AIR + and ( + data[vi + 1] == c_everness_mineral_cave_stone + or data[vi - 1] == c_everness_mineral_cave_stone + or data[vi + area.zstride] == c_everness_mineral_cave_stone + or data[vi - area.zstride] == c_everness_mineral_cave_stone + ) + and rand:next(0, 100) <= 15 + then + -- Decorate Walls + local dir = vector.zero() + + if data[vi + 1] == c_everness_mineral_cave_stone then + dir.x = 1 + end + + if data[vi - 1] == c_everness_mineral_cave_stone then + dir.x = -1 + end + + if data[vi + area.zstride] == c_everness_mineral_cave_stone then + dir.z = 1 + end + + if data[vi - area.zstride] == c_everness_mineral_cave_stone then + dir.z = -1 + end + + local rand_wall_vine = wall_vines[rand:next(1, #wall_vines)] + data[vi] = rand_wall_vine + p2data[vi] = core.dir_to_wallmounted(dir) + end + end + end + end + + -- + -- Spikes Floor + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_mineral_waters_under_volcanic_spike or '')] or {}) do + local idx = area:indexp(pos) + local idx_marker = idx + area.ystride + local place_on_node_name = core.get_name_from_content_id(data[idx]) + + if data[idx_marker] == c_everness_marker then + -- remove marker + data[idx_marker] = core.CONTENT_AIR + + if volcanic_spike_place_on[place_on_node_name] then + local min_height = 3 + local max_height = 8 + local indexes = Everness.find_content_in_vm_area( + vector.new(pos.x, pos.y + 1, pos.z), + vector.new(pos.x, pos.y + max_height, pos.z), + { + core.CONTENT_AIR + }, + data, + area + ) + + -- For smallest spike we need space above at least 3) + if #indexes > min_height then + local height = rand:next(min_height, #indexes) + local start_index = #volcanic_spike_map - height + 1 + local count = 0 + + for i = start_index, #volcanic_spike_map do + data[idx_marker + area.ystride * count] = volcanic_spike_map[i] + count = count + 1 + end + end + end + end + end + + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_mineral_waters_under_lava_stone_spike or '')] or {}) do + local idx = area:indexp(pos) + local idx_marker = idx + area.ystride + local place_on_node_name = core.get_name_from_content_id(data[idx]) + + if data[idx_marker] == c_everness_marker then + -- remove marker + data[idx_marker] = core.CONTENT_AIR + + if lava_stone_spike_place_on[place_on_node_name] then + local min_height = 3 + local max_height = 8 + local indexes = Everness.find_content_in_vm_area( + vector.new(pos.x, pos.y + 1, pos.z), + vector.new(pos.x, pos.y + max_height, pos.z), + { + core.CONTENT_AIR + }, + data, + area + ) + + -- For smallest spike we need space above at least 3) + if #indexes > min_height then + local height = rand:next(min_height, #indexes) + local start_index = #cave_stone_spike_map - height + 1 + local count = 0 + + for i = start_index, #cave_stone_spike_map do + data[idx_marker + area.ystride * count] = cave_stone_spike_map[i] + count = count + 1 + end + end + end + end + end + + -- + -- Spikes Ceiling + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_mineral_waters_under_volcanic_spike_ceiling or '')] or {}) do + local idx = area:indexp(pos) + local idx_marker = idx - area.ystride + local place_on_node_name = core.get_name_from_content_id(data[idx]) + + if data[idx_marker] == c_everness_marker then + -- remove marker + data[idx_marker] = core.CONTENT_AIR + -- data[idx_marker] = core.get_content_id('everness:pyrite_lantern') + + if volcanic_spike_ceiling_place_on[place_on_node_name] then + local min_height = 3 + local max_height = 16 + local indexes = Everness.find_content_in_vm_area( + vector.new(pos.x, pos.y - max_height, pos.z), + vector.new(pos.x, pos.y - 1, pos.z), + { + core.CONTENT_AIR + }, + data, + area + ) + + -- For smallest spike we need space above at least 3) + if #indexes > min_height then + local remainder = 0 + local height = rand:next(min_height, #indexes) + + if height > #lava_stone_spike_map then + remainder = height - #lava_stone_spike_map + height = height - remainder + end + + local start_index = #lava_stone_spike_map - height + 1 + local count = 0 + + if remainder > 0 then + for i = 1, remainder do + data[idx_marker - area.ystride * count] = c_everness_mineral_cave_cobblestone + count = count + 1 + end + end + + for i = start_index, #lava_stone_spike_map do + data[idx_marker - area.ystride * count] = lava_stone_spike_map[i] + count = count + 1 + end + end + end + end + end + end, + -- read-only (but cant and should not manipulate) voxelmanip `data` + -- used for `place_schematic_on_vmanip` which will invalidate `data` + -- therefore we are doing it after we set the data + after_set_data = function(minp, maxp, vm, area, data, p2data, gennotify, rand, shared_args) + -- + -- Lava Trees + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_mineral_waters_under_lava_tree or '')] or {}) do + -- `pos` is position of the 'place_on' node + local marker_pos = vector.new(pos.x, pos.y + 1, pos.z) + local marker_node = core.get_node(marker_pos) + local place_on_node = core.get_node(pos) + + if marker_node and marker_node.name == 'everness:marker' then + -- remove marker + core.remove_node(marker_pos) + + if shared_args.rand_version ~= 1 + and place_on_node + and lava_tree_place_on[place_on_node.name] + then + -- enough air to place structure ? + local positions = core.find_nodes_in_area( + vector.new( + pos.x - lava_tree_size_x, + pos.y, + pos.z - lava_tree_size_z + ), + vector.new( + pos.x + lava_tree_size_x, + pos.y + lava_tree_size.y, + pos.z + lava_tree_size_z + ), + { + 'air', + 'everness:lava_tree', + 'everness:lava_tree_with_lava' + }, + true + ) + + local air = positions.air or {} + local tree1 = positions['everness:lava_tree'] or {} + local tree2 = positions['everness:lava_tree_with_lava'] or {} + + -- do not overlap another tree + if + #tree1 == 0 + and #tree2 == 0 + and #air > lava_tree_safe_volume + then + local replacements + + if rand:next(0, 100) <= 25 then + replacements = { + ['everness:lava_tree'] = 'everness:lava_tree_with_lava', + } + end + + core.place_schematic_on_vmanip( + vm, + marker_pos, + schem_everness_lava_tree, + 'random', + replacements, + false, + 'place_center_x, place_center_z' + ) + + local grass_positions = core.find_nodes_in_area_under_air( + vector.subtract(marker_pos, { x = 3, y = 1, z = 3 }), + vector.add(marker_pos, { x = 3, y = 1, z = 3 }), + 'everness:mineral_lava_stone_with_moss' + ) + + if #grass_positions > 1 then + for i = 1, rand:next(1, 3) do + local rand_p = grass_positions[rand:next(1, #grass_positions)] + + if not vector.equals(marker_pos, rand_p) then + vm:set_node_at(vector.new(rand_p.x, rand_p.y + 1, rand_p.z), { name = 'everness:mineral_cave_moss_grass' }) + end + end + end + end + end + end + end + end +}) diff --git a/mods/everness/minetest.example.mcl.conf b/mods/everness/minetest.example.mcl.conf new file mode 100644 index 0000000..2645df8 --- /dev/null +++ b/mods/everness/minetest.example.mcl.conf @@ -0,0 +1,98 @@ +everness_coral_forest = true +everness_coral_forest_y_max = 194 +everness_coral_forest_y_min = 6 +everness_coral_forest_dunes = true +everness_coral_forest_dunes_y_max = 5 +everness_coral_forest_dunes_y_min = 4 +everness_coral_forest_ocean = true +everness_coral_forest_ocean_y_max = 3 +everness_coral_forest_ocean_y_min = -10 +everness_coral_forest_deep_ocean = true +everness_coral_forest_deep_ocean_y_max = -11 +everness_coral_forest_deep_ocean_y_min = -62 +everness_coral_forest_under = true +everness_coral_forest_under_y_max = -28939 +everness_coral_forest_under_y_min = -29067 +everness_frosted_icesheet = true +everness_frosted_icesheet_y_max = 194 +everness_frosted_icesheet_y_min = -8 +everness_frosted_icesheet_ocean = true +everness_frosted_icesheet_ocean_y_max = -9 +everness_frosted_icesheet_ocean_y_min = -62 +everness_frosted_icesheet_under = true +everness_frosted_icesheet_under_y_max = -28939 +everness_frosted_icesheet_under_y_min = -29067 +everness_cursed_lands = true +everness_cursed_lands_y_max = 194 +everness_cursed_lands_y_min = 6 +everness_cursed_lands_dunes = true +everness_cursed_lands_dunes_y_max = 5 +everness_cursed_lands_dunes_y_min = 1 +everness_cursed_lands_swamp = true +everness_cursed_lands_swamp_y_max = 0 +everness_cursed_lands_swamp_y_min = -1 +everness_cursed_lands_ocean = true +everness_cursed_lands_ocean_y_max = -2 +everness_cursed_lands_ocean_y_min = -10 +everness_cursed_lands_deep_ocean = true +everness_cursed_lands_deep_ocean_y_max = -11 +everness_cursed_lands_deep_ocean_y_min = -62 +everness_cursed_lands_under = true +everness_cursed_lands_under_y_max = -28939 +everness_cursed_lands_under_y_min = -29067 +everness_crystal_forest = true +everness_crystal_forest_y_max = 194 +everness_crystal_forest_y_min = 6 +everness_crystal_forest_dunes = true +everness_crystal_forest_dunes_y_max = 5 +everness_crystal_forest_dunes_y_min = 1 +everness_crystal_forest_shore = true +everness_crystal_forest_shore_y_max = 0 +everness_crystal_forest_shore_y_min = -1 +everness_crystal_forest_ocean = true +everness_crystal_forest_ocean_y_max = 2 +everness_crystal_forest_ocean_y_min = -10 +everness_crystal_forest_deep_ocean = true +everness_crystal_forest_deep_ocean_y_max = -11 +everness_crystal_forest_deep_ocean_y_min = -62 +everness_crystal_forest_under = true +everness_crystal_forest_under_y_max = -28939 +everness_crystal_forest_under_y_min = -29067 +everness_bamboo_forest = true +everness_bamboo_forest_y_max = 194 +everness_bamboo_forest_y_min = 1 +everness_bamboo_forest_under = true +everness_bamboo_forest_under_y_max = -28939 +everness_bamboo_forest_under_y_min = -29067 +everness_forsaken_desert = true +everness_forsaken_desert_y_max = 194 +everness_forsaken_desert_y_min = 4 +everness_forsaken_desert_ocean = true +everness_forsaken_desert_ocean_y_max = 3 +everness_forsaken_desert_ocean_y_min = -8 +everness_forsaken_desert_under = true +everness_forsaken_desert_under_y_max = -28939 +everness_forsaken_desert_under_y_min = -29067 +everness_baobab_savanna = true +everness_baobab_savanna_y_max = 194 +everness_baobab_savanna_y_min = 1 +everness_forsaken_tundra = true +everness_forsaken_tundra_y_max = 194 +everness_forsaken_tundra_y_min = 2 +everness_forsaken_tundra_beach = true +everness_forsaken_tundra_beach_y_max = 1 +everness_forsaken_tundra_beach_y_min = -3 +everness_forsaken_tundra_ocean = true +everness_forsaken_tundra_ocean_y_max = -4 +everness_forsaken_tundra_ocean_y_min = -15 +everness_forsaken_tundra_under = true +everness_forsaken_tundra_under_y_max = -28939 +everness_forsaken_tundra_under_y_min = -29067 +everness_mineral_waters = true +everness_mineral_waters_y_max = 194 +everness_mineral_waters_y_min = 1 +everness_mineral_waters_under = true +everness_mineral_waters_under_y_max = -28939 +everness_mineral_waters_under_y_min = -29067 +everness_feature_sneak_pickup = false +everness_feature_skybox = true diff --git a/mods/everness/mod.conf b/mods/everness/mod.conf new file mode 100644 index 0000000..04d99b6 --- /dev/null +++ b/mods/everness/mod.conf @@ -0,0 +1,6 @@ +name = everness +description = Never ending discovery in Everness mapgen. +depends = +optional_depends = default, xpanes, doors, stairs, walls, x_obsidianmese, x_tumbleweed, x_farming, x_clay, moreblocks, mcl_core, mcl_fences, mcl_walls, mcl_stairs, mcl_util, mcl_autogroup, _mcl_autogroup, mcl_doors, mcl_mapgen_core, mcl_panes, mcl_buckets, rp_default, i3, unified_inventory, sfinv +min_minetest_version = 5.9.0 +supported_games = minetest_game, voxelibre, mineclonia, mineclone2 diff --git a/mods/everness/mod_support_mcl.lua b/mods/everness/mod_support_mcl.lua new file mode 100644 index 0000000..262863f --- /dev/null +++ b/mods/everness/mod_support_mcl.lua @@ -0,0 +1,359 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + mod_support_mcl total rewrite 2025 by Gunnar Zötl + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +local function register_alias(name, convert_to) + if not core.registered_aliases[name] and rawget(core.registered_items, name) == nil then + core.register_alias(name, convert_to) + core.registered_aliases[name] = convert_to + end +end + +-- Test whether we are in VoxeLibre or Mineclonia +local isVL = core.get_modpath('vl_trusted') ~= nil + or core.get_modpath('vl_core') ~= nil + +local mod_emu = {} + +--- +-- Fences / Gates +--- + +mod_emu.default = { + register_fence = function(name, def) + local sname = string.match(name, ':(.+)$') + local fence_id, gate_id, open_gate_id = mcl_fences.register_fence_and_fence_gate( + sname, + def.description, + def.description .. ' Gate', + def.texture, + { handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20 }, + 2, + 15, + { 'group:fence_wood' }, + def.sounds + ) + if fence_id == name then + register_alias('mcl_fences:' .. sname, name) + register_alias('mcl_fences:' .. sname .. '_gate', name .. '_gate') + register_alias('mcl_fences:' .. sname .. '_gate_open', name .. '_gate_open') + else + register_alias(name, fence_id) + if gate_id then register_alias(name .. '_gate', gate_id) end + if open_gate_id then register_alias(name .. '_gate_open', open_gate_id) end + end + end, + + register_fence_rail = function(name, def) + local sname = string.match(name, ':(.+)$') + local fence_id = mcl_fences.register_fence_and_fence_gate( + sname, + def.description, + def.description .. ' Gate', + def.texture, + { handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20 }, + 2, + 15, + { 'group:fence_wood' }, + def.sounds + ) + if fence_id == name then + register_alias('mcl_fences:' .. sname, name) + else + register_alias(name, fence_id) + end + end, + + register_mesepost = function(name, def) + -- Not applicable in MCL + end, +} + +--- +-- Walls +--- + +mod_emu.walls = { + register = function(name, desc, tex, mat, snd) + mcl_walls.register_wall(name, desc, mat, tex, nil, nil, snd) + end +} + +--- +-- Stairs and Slabs +--- + +mod_emu.stairs = { + register_stair_and_slab = function(base, mat, stat, tex, stairdesc, slabdesc, snd, bool) + local groups = {} + if stat.cracky then + -- In MTG: cracky 3 is softest, 1 is hardest. + -- In MCL: pickaxey 1 is wood, 2 is stone/iron, 3 is diamond. + groups.pickaxey = stat.cracky == 1 and 2 or 1 + groups.material_stone = 1 + groups.building_block = 1 + elseif stat.choppy then + groups.axey = 1 + groups.handy = 1 + groups.wood = 1 + groups.material_wood = 1 + groups.building_block = 1 + groups.flammable = stat.flammable or 2 + groups.fire_encouragement = 5 + groups.fire_flammability = 20 + end + + mcl_stairs.register_stair_and_slab( + base, + mat, + groups, + tex, + stairdesc, + slabdesc, + snd, + 6, + 2, + 'Double ' .. slabdesc, + nil + ) + register_alias('stairs:stair_' .. base, 'mcl_stairs:stair_' .. base) + register_alias('stairs:stair_inner_' .. base, 'mcl_stairs:stair_' .. base .. '_inner') + register_alias('stairs:stair_outer_' .. base, 'mcl_stairs:stair_' .. base .. '_outer') + register_alias('stairs:slab_' .. base, 'mcl_stairs:slab_' .. base) + end +} + +--- +-- Doors & Trapdoors +--- + +mod_emu.doors = { + register = function(name, def) + local sname = string.match(name, ':(.+)$') + local modpath = core.get_modpath(core.get_current_modname()) + local utex = io.open(modpath .. '/textures/everness_mcl_doors_' .. sname .. '_lower.png', 'r') + if not utex then + core.log('warning', '[everness] mod_support_mcl not registering door type ' .. name .. ' because of missing textures') + return + end + utex:close() + + local newdef = { + description = def.description, + inventory_image = def.inventory_image, + groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, + sounds = def.sounds, + sound_open = def.sound_open, + sound_close = def.sound_close, + _mcl_hardness = 3, + _mcl_blast_resistance = 3, + } + if isVL then + newdef.tiles_bottom = 'everness_mcl_doors_' .. sname .. '_lower.png' + newdef.tiles_top = 'everness_mcl_doors_' .. sname .. '_upper.png' + else + newdef.tiles_bottom = { + 'everness_mcl_doors_' .. sname .. '_lower.png^[transformFX', + 'everness_mcl_doors_' .. sname .. '_lower_side.png' + } + newdef.tiles_top = { + 'everness_mcl_doors_' .. sname .. '_upper.png^[transformFX', + 'everness_mcl_doors_' .. sname .. '_upper_side.png' + } + end + mcl_doors:register_door(name, newdef) + + -- Register aliases for MTG door nodes (_a bottom, _b top) used in schematics + register_alias(name .. '_a', name .. '_b_1') + register_alias(name .. '_b', name .. '_t_1') + + if def.recipe then + core.register_craft({ + output = name .. ' 3', + recipe = def.recipe + }) + end + end, + + register_trapdoor = function(name, def) + mcl_doors:register_trapdoor(name, { + description = def.description, + inventory_image = def.inventory_image, + tile_front = def.tile_front, + tile_side = def.tile_side, + wield_image = def.wield_image, + groups = { handy = 1, axey = 1, material_wood = 1, flammable = -1 }, + sounds = def.sounds, + sound_open = def.sound_open, + sound_close = def.sound_close, + _mcl_hardness = 3, + _mcl_blast_resistance = 3, + }) + if def.recipe then + core.register_craft({ + output = name, + recipe = def.recipe + }) + end + end, + + register_fencegate = function(name, def) + local gate_name_map = { + ['everness:gate_bamboo'] = 'everness:fence_bamboo_wood_gate', + ['everness:gate_crystal_wood'] = 'everness:fence_crystal_wood_gate', + ['everness:gate_palm_wood'] = 'everness:fence_palm_wood_gate', + ['everness:gate_coral_wood'] = 'everness:fence_coral_wood_gate', + ['everness:gate_lava_tree_wood'] = 'everness:fence_lava_tree_wood_gate', + } + if gate_name_map[name] then + register_alias(name, gate_name_map[name]) + register_alias(name .. '_open', gate_name_map[name] .. '_open') + end + end +} + +--- +-- Buckets +--- + +if core.global_exists('mcl_buckets') and mcl_buckets.register_liquid then + mcl_buckets.register_liquid({ + source_place = 'everness:mineral_water_source', + source_take = { 'everness:mineral_water_source' }, + bucketname = 'everness:bucket_mineral_water', + inventory_image = 'everness_mcl_bucket_mineral_water.png', + name = S('Mineral') .. ' ' .. S('Water') .. ' ' .. S('Bucket'), + longdesc = S('A bucket can be used to collect and release liquids. This one is filled with mineral water.'), + usagehelp = S('Place it to empty the bucket and create a mineral water source.'), + tt_help = S('Places a mineral water source'), + groups = { water_bucket = 1 }, + }) +end + +--- +-- Panes +--- + +if not (core.global_exists('xpanes') and xpanes.register_pane) then + mod_emu.xpanes = { + register_pane = function(name, def) + if core.global_exists('mcl_panes') and mcl_panes.register_pane then + local mcl_def = table.copy(def) + if mcl_def.textures then + local t1 = mcl_def.textures[1] or '' + local t2 = (mcl_def.textures[2] and mcl_def.textures[2] ~= '') and mcl_def.textures[2] or t1 + local t3 = mcl_def.textures[3] or t1 + mcl_def.textures = { t1, t2, t3 } + end + mcl_panes.register_pane(name, mcl_def) + end + register_alias('xpanes:' .. name, 'mcl_panes:' .. name) + register_alias('xpanes:' .. name .. '_flat', 'mcl_panes:' .. name .. '_flat') + end + } +else + register_alias('mcl_panes:cursed_bar', 'xpanes:cursed_bar') + register_alias('mcl_panes:cursed_bar_flat', 'xpanes:cursed_bar_flat') + register_alias('mcl_panes:pyrite_pane', 'xpanes:pyrite_pane') + register_alias('mcl_panes:pyrite_pane_flat', 'xpanes:pyrite_pane_flat') +end + +--- +-- Scoped Execution Runner +--- + +local function load_derivative_nodes() + local prev_default = rawget(_G, 'default') + local prev_walls = rawget(_G, 'walls') + local prev_stairs = rawget(_G, 'stairs') + local prev_doors = rawget(_G, 'doors') + local prev_xpanes = rawget(_G, 'xpanes') + + rawset(_G, 'default', mod_emu.default) + rawset(_G, 'walls', mod_emu.walls) + rawset(_G, 'stairs', mod_emu.stairs) + rawset(_G, 'doors', mod_emu.doors) + if mod_emu.xpanes then + rawset(_G, 'xpanes', mod_emu.xpanes) + end + + local path = core.get_modpath('everness') + + dofile(path .. '/panes.lua') + dofile(path .. '/stairs.lua') + dofile(path .. '/walls.lua') + dofile(path .. '/fences.lua') + dofile(path .. '/doors.lua') + + rawset(_G, 'default', prev_default) + rawset(_G, 'walls', prev_walls) + rawset(_G, 'stairs', prev_stairs) + rawset(_G, 'doors', prev_doors) + if mod_emu.xpanes then + rawset(_G, 'xpanes', prev_xpanes) + end +end + +load_derivative_nodes() + +--- +-- Trees & Leafdecay Compatibility with Mineclonia +--- + +-- In Mineclonia, mcl_trees overrides on_construct and after_destruct on all nodes +-- with group:tree ~= 0 in an on_mods_loaded callback. +-- This triggers heavy VoxelManip updates (reading/writing an 8-block radius) and +-- massive 15,625-node area searches whenever an Everness tree log is dug or placed. +-- Because Everness leaves do not use Mineclonia's distance param2 leafdecay, +-- mcl_trees's callbacks do no useful work on Everness trees while causing severe lag, +-- massive Lua memory allocations (~500 KB per log), and server OOM crashes on large trees. +-- +-- Since everness is loaded after mcl_trees, this on_mods_loaded callback executes after +-- mcl_trees's on_mods_loaded, cleanly restoring Everness's own lightweight leafdecay. +core.register_on_mods_loaded(function() + if not core.get_modpath('mcl_trees') then + return + end + + if Everness.leafdecay_trunk_defs then + for trunk, def in pairs(Everness.leafdecay_trunk_defs) do + if core.registered_nodes[trunk] then + core.registered_nodes[trunk].on_construct = nil + if core.registered_items[trunk] then + core.registered_items[trunk].on_construct = nil + end + core.override_item(trunk, { + after_destruct = function(pos, oldnode) + Everness.leafdecay_after_destruct(pos, oldnode, def) + end, + }) + end + end + end + + -- Also handle other Everness trunks that do not have leafdecay (e.g. hollow_tree) + if core.registered_nodes['everness:hollow_tree'] then + core.registered_nodes['everness:hollow_tree'].on_construct = nil + core.registered_nodes['everness:hollow_tree'].after_destruct = nil + if core.registered_items['everness:hollow_tree'] then + core.registered_items['everness:hollow_tree'].on_construct = nil + core.registered_items['everness:hollow_tree'].after_destruct = nil + end + end +end) diff --git a/mods/everness/mod_support_mcl/schematics/blueberry_bush.mts b/mods/everness/mod_support_mcl/schematics/blueberry_bush.mts new file mode 100644 index 0000000..46bc21e Binary files /dev/null and b/mods/everness/mod_support_mcl/schematics/blueberry_bush.mts differ diff --git a/mods/everness/mod_support_mcl/schematics/bush.mts b/mods/everness/mod_support_mcl/schematics/bush.mts new file mode 100644 index 0000000..8162930 Binary files /dev/null and b/mods/everness/mod_support_mcl/schematics/bush.mts differ diff --git a/mods/everness/mod_support_mcl_aliases.lua b/mods/everness/mod_support_mcl_aliases.lua new file mode 100644 index 0000000..23ed01c --- /dev/null +++ b/mods/everness/mod_support_mcl_aliases.lua @@ -0,0 +1,215 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local function register_alias(name, convert_to) + if rawget(core.registered_items, name) ~= nil then + return + end + local existing = core.registered_aliases[name] + if not existing then + core.register_alias(name, convert_to) + core.registered_aliases[name] = convert_to + elseif existing ~= convert_to and rawget(core.registered_items, existing) == nil then + core.register_alias_force(name, convert_to) + core.registered_aliases[name] = convert_to + end +end + +register_alias('mapgen_water_source', 'mcl_core:water_source') +register_alias('default:water_source', 'mcl_core:water_source') +register_alias('default:water_flowing', 'mcl_core:water_flowing') +register_alias('default:dirt', 'mcl_core:dirt') +register_alias('default:dirt_with_rainforest_litter', 'mcl_core:dirt_with_grass') +register_alias('default:dirt_with_snow', 'mcl_core:dirt_with_grass_snow') +register_alias('default:dirt_with_coniferous_litter', 'mcl_core:podzol') +register_alias('default:dirt_with_grass', 'mcl_core:dirt_with_grass') +register_alias('default:permafrost_with_moss', 'mcl_core:dirt_with_grass') +register_alias('default:permafrost_with_stones', 'mcl_core:coarse_dirt') +register_alias('default:stick', 'mcl_core:stick') +register_alias('default:paper', 'mcl_core:paper') +register_alias('default:book', 'mcl_books:book') +register_alias('default:skeleton_key', 'mcl_core:gold_nugget') +register_alias('default:flint', 'mcl_core:flint') +register_alias('default:obsidian_shard', 'mcl_core:prismarine_shard') +register_alias('default:clay_brick', 'mcl_core:brick') +register_alias('default:mese_crystal_fragment', 'mcl_amethyst:amethyst_shard') + +-- Ingots +register_alias('default:gold_ingot', 'mcl_core:gold_ingot') +register_alias('default:bronze_ingot', 'mcl_copper:copper_ingot') +register_alias('default:tin_ingot', 'mcl_core:iron_ingot') +register_alias('default:copper_ingot', 'mcl_copper:copper_ingot') +register_alias('default:steel_ingot', 'mcl_core:iron_ingot') +register_alias('default:coal_lump', 'mcl_core:coal_lump') + +-- Tools +register_alias('default:pick_stone', 'mcl_tools:pick_stone') +register_alias('default:pick_bronze', 'mcl_tools:pick_gold') +register_alias('default:pick_steel', 'mcl_tools:pick_iron') +register_alias('default:shovel_stone', 'mcl_tools:shovel_stone') +register_alias('default:shovel_bronze', 'mcl_tools:shovel_gold') +register_alias('default:shovel_steel', 'mcl_tools:shovel_iron') +register_alias('default:axe_stone', 'mcl_tools:axe_stone') +register_alias('default:axe_bronze', 'mcl_tools:axe_gold') +register_alias('default:axe_steel', 'mcl_tools:axe_iron') +register_alias('default:sword_stone', 'mcl_tools:sword_stone') +register_alias('default:sword_bronze', 'mcl_tools:sword_gold') +register_alias('default:sword_steel', 'mcl_tools:sword_iron') + +-- Items / Nodes +register_alias('default:bookshelf', 'mcl_books:bookshelf') +register_alias('default:sign_wall_wood', 'mcl_signs:wall_sign') +register_alias('default:ladder_wood', 'mcl_core:ladder') +register_alias('default:ladder_steel', 'mcl_core:ladder') +register_alias('default:glass', 'mcl_core:glass') +register_alias('default:obsidian_glass', 'mcl_core:glass') + +-- Trees +register_alias('default:tree', 'mcl_core:tree') +register_alias('default:jungletree', 'mcl_core:jungletree') +register_alias('default:pine_tree', 'mcl_core:sprucetree') +register_alias('default:cactus', 'mcl_core:cactus') +register_alias('default:large_cactus_seedling', 'mcl_core:cactus') +register_alias('default:papyrus', 'mcl_core:reeds') +register_alias('default:junglegrass', 'mcl_flowers:double_grass') +register_alias('default:blueberry_bush_sapling', 'mcl_flowers:rose_bush') +register_alias('default:sapling', 'mcl_core:sapling') +register_alias('default:junglesapling', 'mcl_core:junglesapling') +register_alias('default:pine_sapling', 'mcl_core:sprucesapling') +register_alias('default:acacia_sapling', 'mcl_core:acaciasapling') +register_alias('default:aspen_sapling', 'mcl_core:birchsapling') + +register_alias('default:clay_lump', 'mcl_core:clay_lump') +register_alias('default:tin_lump', 'mcl_raw_ores:raw_gold') +register_alias('default:copper_lump', 'mcl_copper:raw_copper') +register_alias('default:iron_lump', 'mcl_raw_ores:raw_iron') +register_alias('default:coalblock', 'mcl_core:coalblock') +register_alias('default:steelblock', 'mcl_core:ironblock') +register_alias('default:copperblock', 'mcl_copper:block') +register_alias('default:tinblock', 'mcl_core:goldblock') +register_alias('default:bronzeblock', 'mcl_copper:block') +register_alias('default:mese', 'mesecons_torch:redstoneblock') +register_alias('default:meselamp', 'mesecons_lightstone:lightstone_off') +register_alias('default:obsidian', 'mcl_core:obsidian') +register_alias('default:mese_crystal', 'mcl_ocean:prismarine_crystals') +register_alias('default:diamond', 'mcl_core:diamond') +register_alias('default:pick_mese', 'mcl_tools:pick_diamond') +register_alias('default:shovel_mese', 'mcl_tools:shovel_diamond') +register_alias('default:axe_mese', 'mcl_tools:axe_diamond') +register_alias('default:sword_mese', 'mcl_tools:sword_diamond') + +register_alias('default:tnt', 'mcl_tnt:tnt') +register_alias('default:snowblock', 'mcl_core:snowblock') +register_alias('default:ice', 'mcl_core:ice') +register_alias('default:torch', 'mcl_torches:torch') +register_alias('default:cobble', 'mcl_core:cobble') +register_alias('default:chest', 'mcl_chests:chest') +register_alias('default:snow', 'mcl_core:snow') +register_alias('default:stone', 'mcl_core:stone') +register_alias('default:sand', 'mcl_core:sand') +register_alias('default:desert_sand', 'mcl_core:sand') +register_alias('default:silver_sand', 'mcl_core:sand') +register_alias('default:gravel', 'mcl_core:gravel') +register_alias('default:stone_with_coal', 'mcl_core:stone_with_coal') +register_alias('default:stone_with_iron', 'mcl_core:stone_with_iron') +register_alias('default:stone_with_copper', 'mcl_copper:stone_with_copper') +register_alias('default:stone_with_tin', 'mcl_copper:stone_with_copper') +register_alias('default:stone_with_gold', 'mcl_core:stone_with_gold') +register_alias('default:stone_with_mese', 'mcl_core:stone_with_redstone') +register_alias('default:stone_with_diamond', 'mcl_core:stone_with_diamond') +register_alias('mapgen_lava_source', 'mcl_core:lava_source') +register_alias('default:lava_source', 'mcl_core:lava_source') +register_alias('default:mossycobble', 'mcl_core:mossycobble') +register_alias('default:clay', 'mcl_colorblocks:hardened_clay') +register_alias('default:dry_dirt_with_dry_grass', 'mcl_core:dirt_with_grass') +register_alias('default:dry_dirt', 'mcl_core:coarse_dirt') +register_alias('default:coral_skeleton', 'mcl_core:bone_block') +register_alias('default:lava_flowing', 'mcl_core:lava_flowing') +register_alias('default:fence_wood', 'mcl_fences:fence') +register_alias('default:torch_wall', 'mcl_torches:torch_wall') +register_alias('default:wood', 'mcl_core:wood') +register_alias('default:junglewood', 'mcl_core:junglewood') +register_alias('default:pine_wood', 'mcl_core:sprucewood') +register_alias('default:mese_post_light_pine_wood', 'mcl_torches:torch') +if not core.registered_items['default:acacia_tree'] then + core.register_alias_force('default:acacia_tree', 'mcl_core:acaciatree') +end +register_alias('default:dry_grass_4', 'mcl_core:deadbush') +register_alias('default:dry_grass_2', 'mcl_core:deadbush') +register_alias('default:dry_shrub', 'mcl_core:deadbush') +register_alias('default:stonebrick', 'mcl_core:stonebrick') +register_alias('default:jungleleaves', 'mcl_core:jungleleaves') +register_alias('default:torch_ceiling', 'mcl_torches:torch_wall') +register_alias('default:goldblock', 'mcl_core:goldblock') + +-- Common MTG Stairs and Slabs (registered if not already handled by game) +register_alias('stairs:stair_junglewood', 'mcl_stairs:stair_junglewood') +register_alias('stairs:slab_junglewood', 'mcl_stairs:slab_junglewood') +register_alias('stairs:stair_wood', 'mcl_stairs:stair_wood') +register_alias('stairs:slab_wood', 'mcl_stairs:slab_wood') +register_alias('stairs:stair_inner_wood', 'mcl_stairs:stair_wood_inner') +register_alias('stairs:stair_outer_wood', 'mcl_stairs:stair_wood_outer') +register_alias('stairs:stair_stonebrick', 'mcl_stairs:stair_stonebrick') +register_alias('stairs:slab_stonebrick', 'mcl_stairs:slab_stonebrick') +register_alias('stairs:stair_inner_stonebrick', 'mcl_stairs:stair_stonebrick_inner') +register_alias('stairs:stair_outer_stonebrick', 'mcl_stairs:stair_stonebrick_outer') +register_alias('stairs:stair_mossycobble', 'mcl_stairs:stair_mossycobble') +register_alias('stairs:slab_mossycobble', 'mcl_stairs:slab_mossycobble') + +-- Walls backwards compatibility (old map data without underscores -> new registered wall names) +register_alias('everness:cursedbrickwall', 'everness:cursed_brick_wall') +register_alias('everness:cursedbrickwithgrowthwall', 'everness:cursed_brick_with_growth_wall') +register_alias('everness:coraldesertcobblewall', 'everness:coral_desert_cobble_wall') +register_alias('everness:coraldesertmossycobblewall', 'everness:coral_desert_mossy_cobble_wall') +register_alias('everness:forsakentundrabrickwall', 'everness:forsaken_tundra_brick_wall') +register_alias('everness:forsakentundracobblewall', 'everness:forsaken_tundra_cobble_wall') +register_alias('everness:forsakentundrastonewall', 'everness:forsaken_tundra_stone_wall') +register_alias('walls:cobble', 'mcl_walls:cobble') + +-- Doors & Trapdoors +register_alias('xpanes:trapdoor_steel_bar', 'mcl_doors:iron_trapdoor') +register_alias('doors:trapdoor_open', 'mcl_doors:trapdoor_open') +register_alias('doors:trapdoor', 'mcl_doors:trapdoor') +register_alias('doors:door_wood', 'mcl_doors:wooden_door') +register_alias('doors:door_wood_a', 'mcl_doors:wooden_door_b_1') +register_alias('doors:door_wood_b', 'mcl_doors:wooden_door_t_1') +register_alias('doors:hidden', 'air') +register_alias('everness:cobweb', 'mcl_core:cobweb') + +-- Fence Gates +register_alias('everness:gate_bamboo', 'everness:fence_bamboo_wood_gate') +register_alias('everness:gate_bamboo_open', 'everness:fence_bamboo_wood_gate_open') +register_alias('everness:gate_crystal_wood', 'everness:fence_crystal_wood_gate') +register_alias('everness:gate_crystal_wood_open', 'everness:fence_crystal_wood_gate_open') +register_alias('everness:gate_palm_wood', 'everness:fence_palm_wood_gate') +register_alias('everness:gate_palm_wood_open', 'everness:fence_palm_wood_gate_open') +register_alias('everness:gate_coral_wood', 'everness:fence_coral_wood_gate') +register_alias('everness:gate_coral_wood_open', 'everness:fence_coral_wood_gate_open') +register_alias('everness:gate_lava_tree_wood', 'everness:fence_lava_tree_wood_gate') +register_alias('everness:gate_lava_tree_wood_open', 'everness:fence_lava_tree_wood_gate_open') + +-- Legacy flowers - replaced by everness:flowers_* +register_alias('flowers:rose', 'mcl_flowers:wither_rose') +register_alias('flowers:tulip', 'mcl_flowers:tulip_orange') +register_alias('flowers:dandelion_yellow', 'mcl_flowers:dandelion') +register_alias('flowers:geranium', 'mcl_flowers:allium') +register_alias('flowers:viola', 'mcl_flowers:azure_bluet') +register_alias('flowers:tulip_black', 'mcl_flowers:tulip_white') +register_alias('flowers:dandelion_white', 'mcl_flowers:tulip_pink') +register_alias('flowers:chrysanthemum_green', 'mcl_flowers:tulip_white') + +-- Schematics compatibility +register_alias('butterflies:butterfly_violet', 'air') diff --git a/mods/everness/mod_support_moreblocks.lua b/mods/everness/mod_support_moreblocks.lua new file mode 100644 index 0000000..7fdcda1 --- /dev/null +++ b/mods/everness/mod_support_moreblocks.lua @@ -0,0 +1,228 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +--- +-- Helper: Adapt world-aligned textures for mesh nodes (slopes) +-- +-- In Luanti, solid nodes and nodeboxes support `align_style = "world"` and +-- `scale = N` natively. However, More Blocks slopes use `drawtype = "mesh"` +-- (.obj meshes), where the engine does not support world alignment and instead +-- stretches the entire multi-block texture into the 0..1 UV coordinates of the +-- mesh face. For mesh nodes, we detect world-aligned textures and crop a single +-- 1-node tile so the slope displays a properly proportioned texture. +--- + +local function adapt_tiles_for_slopes(tiles, recipeitem) + if not tiles and recipeitem and core.registered_nodes[recipeitem] then + tiles = core.registered_nodes[recipeitem].tiles + end + if not tiles then return nil end + + local new_tiles = {} + local has_world_aligned = false + + for i, t in ipairs(tiles) do + local tile_def = t + if type(tile_def) == 'string' and recipeitem and core.registered_nodes[recipeitem] then + local src_tiles = core.registered_nodes[recipeitem].tiles + if src_tiles and src_tiles[i] and type(src_tiles[i]) == 'table' then + tile_def = src_tiles[i] + end + end + + if type(tile_def) == 'table' and tile_def.align_style == 'world' and tile_def.scale and tile_def.scale > 1 then + has_world_aligned = true + local tile_name = tile_def.name + local cropped_name + + if tile_def.animation then + -- For animated multi-block textures (e.g. scale = 8 with vertical_frames), + -- crop a 16x16 tile using [combine to extract a clean 16x16 frame. + cropped_name = '[combine:16x16:0,0=' .. tile_name + else + -- For static textures (scale = 2, 4, etc.), ^[sheet:SxS:0,0 cleanly crops + -- a 1-node tile (0,0) and respects any texture pack resolution. + cropped_name = tile_name .. '^[sheet:' .. tile_def.scale .. 'x' .. tile_def.scale .. ':0,0' + end + + new_tiles[i] = { + name = cropped_name, + backface_culling = tile_def.backface_culling, + } + else + new_tiles[i] = t + end + end + + if has_world_aligned then + return new_tiles + end + return tiles +end + +--- +-- Helper: Register all Stairs+ shapes with slope-adapted textures +--- + +local function register_stairsplus(modname, subname, recipeitem, fields) + local slope_tiles = adapt_tiles_for_slopes(fields.tiles, recipeitem) + + if slope_tiles ~= fields.tiles then + -- Nodeboxes (stairs, slabs, panels, microblocks) support world-aligned textures natively + stairsplus:register_stair(modname, subname, recipeitem, fields) + stairsplus:register_slab(modname, subname, recipeitem, fields) + stairsplus:register_panel(modname, subname, recipeitem, fields) + stairsplus:register_micro(modname, subname, recipeitem, fields) + + -- Slopes are .obj meshes which do not support world-aligned textures in the engine; + -- use the cropped 16x16 tiles so textures are not squished onto the mesh + local slope_fields = table.copy(fields) + slope_fields.tiles = slope_tiles + stairsplus:register_slope(modname, subname, recipeitem, slope_fields) + else + stairsplus:register_all(modname, subname, recipeitem, fields) + end +end + +--- +-- Stairs+ / More Blocks Circular Saw Scoped Adapter +--- + +local moreblocks_emu_stairs = { + register_stair_and_slab = function(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds, worldaligntex) + -- Strip translation escape sequences (\027%b() and \027.) to avoid malformed double-translation + local clean_desc = desc_stair:gsub('\027%b()', ''):gsub('\027.', '') + local base_desc = clean_desc:gsub('%s+[Ss]tair$', '') + + register_stairsplus('everness', subname, recipeitem, { + description = S(base_desc), + tiles = images, + groups = groups, + sounds = sounds, + }) + + -- Backwards compatibility aliases for schematics, previous worlds, and crafts + core.register_alias_force('stairs:stair_' .. subname, 'everness:stair_' .. subname) + core.register_alias_force('stairs:stair_inner_' .. subname, 'everness:stair_' .. subname .. '_inner') + core.register_alias_force('stairs:stair_outer_' .. subname, 'everness:stair_' .. subname .. '_outer') + core.register_alias_force('stairs:slab_' .. subname, 'everness:slab_' .. subname) + end +} + +-- Execute stairs.lua under the Scoped Adapter +local prev_stairs = rawget(_G, 'stairs') +rawset(_G, 'stairs', moreblocks_emu_stairs) + +local path = core.get_modpath('everness') +dofile(path .. '/stairs.lua') + +rawset(_G, 'stairs', prev_stairs) + +--- +-- Additional Everness building blocks for Circular Saw +--- + +local extra_nodes = { + -- Tree Trunks + { subname = 'coral_tree', recipeitem = 'everness:coral_tree', desc = 'Coral Tree Trunk' }, + { subname = 'coral_tree_bioluminescent', recipeitem = 'everness:coral_tree_bioluminescent', desc = 'Coral Tree Bioluminescent Trunk' }, + { subname = 'baobab_tree', recipeitem = 'everness:baobab_tree', desc = 'Baobab Tree Trunk' }, + { subname = 'sequoia_tree', recipeitem = 'everness:sequoia_tree', desc = 'Sequoia Tree Trunk' }, + { subname = 'willow_tree', recipeitem = 'everness:willow_tree', desc = 'Willow Tree Trunk' }, + { subname = 'hollow_tree', recipeitem = 'everness:hollow_tree', desc = 'Hollow Tree Trunk' }, + { subname = 'crystal_tree', recipeitem = 'everness:crystal_tree', desc = 'Crystal Tree Trunk' }, + { subname = 'mese_tree', recipeitem = 'everness:mese_tree', desc = 'Mese Tree Trunk' }, + { subname = 'palm_tree', recipeitem = 'everness:palm_tree', desc = 'Palm Tree Trunk' }, + { subname = 'lava_tree', recipeitem = 'everness:lava_tree', desc = 'Lava Tree Trunk' }, + { subname = 'lava_tree_with_lava', recipeitem = 'everness:lava_tree_with_lava', desc = 'Lava Tree Trunk with Lava Veins' }, + + -- Bamboo blocks + { subname = 'bamboo_block', recipeitem = 'everness:bamboo_block', desc = 'Bamboo Block' }, + { subname = 'bamboo_dry_block', recipeitem = 'everness:bamboo_dry_block', desc = 'Dry Bamboo Block' }, + + -- Cursed blocks + { subname = 'cursed_stone', recipeitem = 'everness:cursed_stone', desc = 'Cursed Stone' }, + { subname = 'cursed_brick_mixed', recipeitem = 'everness:cursed_brick_mixed', desc = 'Cursed Brick Mixed' }, + { subname = 'cursed_brick_carved', recipeitem = 'everness:cursed_brick_carved', desc = 'Cursed Brick Carved' }, + { subname = 'cursed_dream_stone', recipeitem = 'everness:cursed_dream_stone', desc = 'Cursed Dream Stone' }, + + -- Crystal blocks + { subname = 'crystal_stone', recipeitem = 'everness:crystal_stone', desc = 'Crystal Stone' }, + { subname = 'crystal_sandstone', recipeitem = 'everness:crystal_sandstone', desc = 'Crystal Sandstone' }, + { subname = 'crystal_sandstone_brick', recipeitem = 'everness:crystal_sandstone_brick', desc = 'Crystal Sandstone Brick' }, + { subname = 'crystal_sandstone_chiseled', recipeitem = 'everness:crystal_sandstone_chiseled', desc = 'Crystal Sandstone Chiseled' }, + { subname = 'crystal_block_cyan', recipeitem = 'everness:crystal_block_cyan', desc = 'Cyan Crystal Block' }, + { subname = 'crystal_block_orange', recipeitem = 'everness:crystal_block_orange', desc = 'Orange Crystal Block' }, + { subname = 'crystal_block_purple', recipeitem = 'everness:crystal_block_purple', desc = 'Purple Crystal Block' }, + + -- Forsaken blocks + { subname = 'forsaken_desert_stone', recipeitem = 'everness:forsaken_desert_stone', desc = 'Forsaken Desert Stone' }, + { subname = 'forsaken_tundra_rocks', recipeitem = 'everness:forsaken_tundra_rocks', desc = 'Forsaken Tundra Rocks' }, + + -- Pyrite blocks + { subname = 'pyriteblock', recipeitem = 'everness:pyriteblock', desc = 'Pyrite Block' }, + { subname = 'pyriteblock_brick', recipeitem = 'everness:pyriteblock_brick', desc = 'Pyrite Brick' }, + { subname = 'pyriteblock_forged', recipeitem = 'everness:pyriteblock_forged', desc = 'Forged Pyrite Block' }, + { subname = 'pyriteblock_polished', recipeitem = 'everness:pyriteblock_polished', desc = 'Polished Pyrite Block' }, + { subname = 'pyriteblock_spiral', recipeitem = 'everness:pyriteblock_spiral', desc = 'Pyrite Spiral' }, + { subname = 'pyriteblock_slab_brick', recipeitem = 'everness:pyriteblock_slab_brick', desc = 'Pyrite Slab Brick' }, + + -- Ice & Snow blocks + { subname = 'ancient_emerald_ice', recipeitem = 'everness:ancient_emerald_ice', desc = 'Ancient Emerald Ice' }, + { subname = 'dense_emerald_ice', recipeitem = 'everness:dense_emerald_ice', desc = 'Dense Emerald Ice' }, + { subname = 'emerald_ice', recipeitem = 'everness:emerald_ice', desc = 'Emerald Ice' }, + { subname = 'frosted_ice', recipeitem = 'everness:frosted_ice', desc = 'Frosted Ice' }, + { subname = 'frosted_ice_translucent', recipeitem = 'everness:frosted_ice_translucent', desc = 'Frosted Ice Translucent' }, + { subname = 'frosted_snowblock', recipeitem = 'everness:frosted_snowblock', desc = 'Frosted Snow Block' }, + { subname = 'icecobble', recipeitem = 'everness:icecobble', desc = 'Ice Cobble' }, + { subname = 'snowcobble', recipeitem = 'everness:snowcobble', desc = 'Snow Cobble' }, + { subname = 'mold_cobble', recipeitem = 'everness:mold_cobble', desc = 'Mold Cobble' }, + + -- Obsidian & Volcanic blocks + { subname = 'weeping_obsidian', recipeitem = 'everness:weeping_obsidian', desc = 'Weeping Obsidian' }, + { subname = 'blue_crying_obsidian', recipeitem = 'everness:blue_crying_obsidian', desc = 'Blue Crying Obsidian' }, + { subname = 'blue_weeping_obsidian', recipeitem = 'everness:blue_weeping_obsidian', desc = 'Blue Weeping Obsidian' }, + { subname = 'sulfur_stone', recipeitem = 'everness:sulfur_stone', desc = 'Sulfur Stone' }, + { subname = 'volcanic_sulfur', recipeitem = 'everness:volcanic_sulfur', desc = 'Volcanic Sulfur Stone' }, + + -- Bone & Coral + { subname = 'bone', recipeitem = 'everness:bone', desc = 'Bone Block' }, + { subname = 'crystal_coral_dark', recipeitem = 'everness:crystal_coral_dark', desc = 'Crystal Coral Dark' }, + + -- Glass + { subname = 'pyrite_glass', recipeitem = 'everness:pyrite_glass', desc = 'Pyrite Glass' }, + { subname = 'tinted_glass_red', recipeitem = 'everness:tinted_glass_red', desc = 'Tinted Glass Red' }, +} + +for _, item in ipairs(extra_nodes) do + local def = core.registered_nodes[item.recipeitem] + if def then + local tiles = table.copy(def.tiles or {}) + if #tiles > 1 and def.drawtype and def.drawtype:find('glass') then + tiles = { tiles[1] } + end + register_stairsplus('everness', item.subname, item.recipeitem, { + description = S(item.desc), + tiles = tiles, + groups = table.copy(def.groups or {}), + sounds = def.sounds, + }) + end +end + +core.log('action', '[Everness] More Blocks / Circular Saw integration loaded successfully.') diff --git a/mods/everness/mod_support_mtg.lua b/mods/everness/mod_support_mtg.lua new file mode 100644 index 0000000..efdd5f6 --- /dev/null +++ b/mods/everness/mod_support_mtg.lua @@ -0,0 +1,48 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +-- +-- Buckets +-- + +if core.get_modpath('bucket') then + bucket.register_liquid( + 'everness:mineral_water_source', + 'everness:mineral_water_flowing', + 'everness:bucket_mineral_water', + 'everness_mtg_bucket_mineral_water.png', + S('Mineral') .. ' ' .. S('Water') .. ' ' .. S('Bucket'), + { tool = 1, water_bucket = 1 } + ) + + bucket.register_liquid( + 'everness:lava_source', + 'everness:lava_flowing', + 'everness:bucket_lava', + 'everness_mtg_bucket_lava.png', + S('Lava Bucket'), + { tool = 1 } + ) + + core.register_craft({ + type = 'fuel', + recipe = 'everness:bucket_lava', + burntime = 370, + replacements = {{ 'everness:bucket_lava', 'bucket:bucket_empty' }}, + }) +end diff --git a/mods/everness/mod_support_rp_aliases.lua b/mods/everness/mod_support_rp_aliases.lua new file mode 100644 index 0000000..13c4234 --- /dev/null +++ b/mods/everness/mod_support_rp_aliases.lua @@ -0,0 +1,170 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +core.register_alias('mapgen_water_source', 'rp_mapgen_water_source') +core.register_alias('default:dirt_with_rainforest_litter', 'rp_default:dirt_with_grass') +core.register_alias('default:dirt_with_snow', 'rp_default:dirt_with_grass') +core.register_alias('default:dirt_with_coniferous_litter', 'rp_default:dirt_with_grass') +core.register_alias('default:dirt_with_grass', 'rp_default:dirt_with_grass') +core.register_alias('default:stick', 'rp_default:stick') +core.register_alias('default:paper', 'rp_default:paper') +core.register_alias('default:book', 'rp_default:book') +core.register_alias('default:skeleton_key', 'rp_default:skeleton_key') +core.register_alias('default:flint', 'rp_default:flint') +core.register_alias('default:obsidian_shard', 'rp_default:obsidian_shard') +core.register_alias('default:clay_brick', 'rp_default:clay_brick') +core.register_alias('default:mese_crystal_fragment', 'rp_default:mese_crystal_fragment') +-- Ingots +core.register_alias('default:gold_ingot', 'rp_default:gold_ingot') +core.register_alias('default:bronze_ingot', 'rp_default:bronze_ingot') +core.register_alias('default:tin_ingot', 'rp_default:tin_ingot') +core.register_alias('default:copper_ingot', 'rp_default:copper_ingot') +core.register_alias('default:steel_ingot', 'rp_default:steel_ingot') +core.register_alias('default:coal_lump', 'rp_default:coal_lump') +-- Tools +core.register_alias('default:pick_stone', 'rp_default:pick_stone') +core.register_alias('default:pick_bronze', 'rp_default:pick_bronze') +core.register_alias('default:pick_steel', 'rp_default:pick_steel') +core.register_alias('default:shovel_stone', 'rp_default:shovel_stone') +core.register_alias('default:shovel_bronze', 'rp_default:shovel_bronze') +core.register_alias('default:shovel_steel', 'rp_default:shovel_steel') +core.register_alias('default:axe_stone', 'rp_default:axe_stone') +core.register_alias('default:axe_bronze', 'rp_default:axe_bronze') +core.register_alias('default:axe_steel', 'rp_default:axe_steel') +core.register_alias('default:sword_stone', 'rp_default:sword_stone') +core.register_alias('default:sword_bronze', 'rp_default:sword_bronze') +core.register_alias('default:sword_steel', 'rp_default:sword_steel') +-- Items / Nodes +core.register_alias('default:bookshelf', 'rp_default:bookshelf') +core.register_alias('default:sign_wall_wood', 'rp_default:sign_wall_wood') +core.register_alias('default:ladder_wood', 'rp_default:ladder_wood') +core.register_alias('default:ladder_steel', 'rp_default:ladder_steel') +core.register_alias('default:glass', 'rp_default:glass') +core.register_alias('default:obsidian_glass', 'rp_default:obsidian_glass') +-- Trees +core.register_alias('default:tree', 'rp_default:tree') +core.register_alias('default:jungletree', 'rp_default:jungletree') +core.register_alias('default:pine_tree', 'rp_default:pine_tree') +core.register_alias('default:cactus', 'rp_default:cactus') +core.register_alias('default:large_cactus_seedling', 'rp_default:large_cactus_seedling') +core.register_alias('default:papyrus', 'rp_default:papyrus') +core.register_alias('default:junglegrass', 'rp_default:junglegrass') +core.register_alias('default:blueberry_bush_sapling', 'rp_default:blueberry_bush_sapling') +core.register_alias('default:sapling', 'rp_default:sapling') +core.register_alias('default:junglesapling', 'rp_default:junglesapling') +core.register_alias('default:pine_sapling', 'rp_default:pine_sapling') +core.register_alias('default:acacia_sapling', 'rp_default:acacia_sapling') +core.register_alias('default:aspen_sapling', 'rp_default:aspen_sapling') + +core.register_alias('default:clay_lump', 'rp_default:clay_lump') +core.register_alias('default:tin_lump', 'rp_default:tin_lump') +core.register_alias('default:copper_lump', 'rp_default:copper_lump') +core.register_alias('default:iron_lump', 'rp_default:iron_lump') +core.register_alias('default:coalblock', 'rp_default:block_coal') +core.register_alias('default:steelblock', 'rp_default:steelblock') +core.register_alias('default:copperblock', 'rp_default:copperblock') +core.register_alias('default:tinblock', 'rp_default:tinblock') +core.register_alias('default:bronzeblock', 'rp_default:bronzeblock') +core.register_alias('default:mese', 'rp_default:mese') +core.register_alias('default:meselamp', 'rp_default:meselamp') +core.register_alias('default:obsidian', 'rp_default:obsidian') +core.register_alias('default:mese_crystal', 'rp_default:mese_crystal') +core.register_alias('default:diamond', 'rp_default:diamond') +core.register_alias('default:pick_mese', 'rp_default:pick_mese') +core.register_alias('default:shovel_mese', 'rp_default:shovel_mese') +core.register_alias('default:axe_mese', 'rp_default:axe_mese') +core.register_alias('default:sword_mese', 'rp_default:sword_mese') + +core.register_alias('default:snowblock', 'rp_default:snowblock') +core.register_alias('default:ice', 'rp_default:ice') +core.register_alias('default:torch', 'rp_default:torch') +core.register_alias('default:cobble', 'rp_default:cobble') +core.register_alias('default:chest', 'rp_default:chest') +core.register_alias('default:snow', 'rp_default:snow') +core.register_alias('default:stone', 'rp_default:stone') +core.register_alias('default:sand', 'rp_default:sand') +core.register_alias('default:gravel', 'rp_default:gravel') +core.register_alias('default:stone_with_coal', 'rp_default:stone_with_coal') +core.register_alias('default:stone_with_iron', 'rp_default:stone_with_iron') +core.register_alias('default:stone_with_copper', 'rp_default:stone_with_copper') +core.register_alias('default:stone_with_tin', 'rp_default:stone_with_tin') +core.register_alias('default:stone_with_gold', 'rp_default:stone_with_gold') +core.register_alias('default:stone_with_mese', 'rp_default:stone_with_mese') +core.register_alias('default:stone_with_diamond', 'rp_default:stone_with_diamond') +core.register_alias('mapgen_lava_source', 'rp_mapgen_water_source') +core.register_alias('default:mossycobble', 'rp_default:mossycobble') +core.register_alias('default:clay', 'rp_default:clay') +core.register_alias('default:dry_dirt_with_dry_grass', 'rp_default:dry_dirt_with_dry_grass') +core.register_alias('default:dry_dirt', 'rp_default:dry_dirt') +core.register_alias('default:coral_skeleton', 'everness:coral_skeleton') +core.register_alias('default:lava_flowing', 'rp_default:water_flowing') +core.register_alias('everness:cursed_brick_with_growth_wall', 'air') +core.register_alias('stairs:slab_cursed_brick_with_growth', 'air') +core.register_alias('default:fence_wood', 'rp_default:fence') +core.register_alias('default:torch_wall', 'rp_default:torch_wall') +core.register_alias('default:wood', 'rp_default:planks') +core.register_alias('default:junglewood', 'rp_default:junglewood') +core.register_alias('default:pine_wood', 'rp_default:pine_wood') +core.register_alias('default:mese_post_light_pine_wood', 'rp_default:mese_post_light_pine_wood') +core.register_alias_force('default:acacia_tree', 'rp_default:acacia_tree') +core.register_alias('default:dry_grass_4', 'rp_default:dry_grass_4') +core.register_alias('default:dry_grass_2', 'rp_default:dry_grass_2') +core.register_alias('default:dry_shrub', 'rp_default:dry_shrub') +core.register_alias('default:stonebrick', 'rp_default:stonebrick') +core.register_alias('default:jungleleaves', 'rp_default:jungleleaves') +core.register_alias('default:torch_ceiling', 'rp_default:torch_ceiling') +core.register_alias('default:goldblock', 'rp_default:goldblock') +core.register_alias('stairs:stair_coral_white_sandstone', 'mcl_stairs:stair_coral_white_sandstone') +core.register_alias('stairs:slab_coral_white_sandstone', 'mcl_stairs:slab_coral_white_sandstone') +core.register_alias('stairs:stair_coral_deep_ocean_sandstone_block', 'mcl_stairs:stair_coral_deep_ocean_sandstone_block') +core.register_alias('stairs:slab_coral_deep_ocean_sandstone_block', 'mcl_stairs:slab_coral_deep_ocean_sandstone_block') +core.register_alias('stairs:slab_coral_deep_ocean_sandstone_brick', 'mcl_stairs:slab_coral_deep_ocean_sandstone_brick') +core.register_alias('stairs:slab_coral_sandstone_brick', 'mcl_stairs:slab_coral_sandstone_brick') +core.register_alias('stairs:stair_coral_deep_ocean_sandstone_brick', 'mcl_stairs:stair_coral_deep_ocean_sandstone_brick') +core.register_alias('stairs:stair_crystal_forest_deep_ocean_sandstone_block', 'mcl_stairs:stair_crystal_forest_deep_ocean_sandstone_block') +core.register_alias('stairs:stair_crystal_forest_deep_ocean_sandstone_brick', 'mcl_stairs:stair_crystal_forest_deep_ocean_sandstone_brick') +core.register_alias('stairs:slab_crystal_forest_deep_ocean_sandstone_block', 'mcl_stairs:slab_crystal_forest_deep_ocean_sandstone_block') +core.register_alias('stairs:slab_crystal_forest_deep_ocean_sandstone_brick', 'mcl_stairs:slab_crystal_forest_deep_ocean_sandstone_brick') +core.register_alias('stairs:stair_forsaken_desert_brick_red', 'mcl_stairs:stair_forsaken_desert_brick_red') +core.register_alias('stairs:stair_forsaken_desert_chiseled_stone', 'mcl_stairs:stair_forsaken_desert_chiseled_stone') +core.register_alias('stairs:slab_forsaken_desert_chiseled_stone', 'mcl_stairs:slab_forsaken_desert_chiseled_stone') +core.register_alias('stairs:stair_junglewood', 'mcl_stairs:stair_junglewood') +core.register_alias('stairs:slab_junglewood', 'mcl_stairs:slab_junglewood') +core.register_alias('stairs:slab_dry_wood', 'mcl_stairs:slab_dry_wood') +core.register_alias('stairs:stair_dry_wood', 'mcl_stairs:stair_dry_wood') +core.register_alias('stairs:stair_wood', 'mcl_stairs:stair_wood') +core.register_alias('stairs:slab_stonebrick', 'mcl_stairs:slab_stonebrick') +core.register_alias('stairs:stair_inner_wood', 'mcl_stairs:stair_wood_inner') +core.register_alias('stairs:stair_outer_stonebrick', 'mcl_stairs:stair_stonebrick_outer') +core.register_alias('stairs:stair_stonebrick', 'mcl_stairs:stair_stonebrick') +-- core.register_alias('stairs:stair_cobble', 'mcl_stairs:stair_cobble') +core.register_alias('stairs:stair_mossycobble', 'mcl_stairs:stair_mossycobble') +core.register_alias('stairs:stair_outer_quartz_chiseled', 'mcl_stairs:stair_quartz_chiseled_outer') +core.register_alias('stairs:stair_quartz_chiseled', 'mcl_stairs:stair_quartz_chiseled') +core.register_alias('stairs:stair_inner_quartz_chiseled', 'mcl_stairs:stair_quartz_chiseled_inner') +core.register_alias('stairs:slab_quartz_chiseled', 'mcl_stairs:slab_quartz_chiseled') +core.register_alias('stairs:stair_coral_desert_stone_block', 'mcl_stairs:stair_coral_desert_stone_block') + +core.register_alias('everness:cursed_brick_wall', 'everness:cursedbrickwall') +core.register_alias('walls:cobble', 'mcl_walls:cobble') +core.register_alias('xpanes:trapdoor_steel_bar', 'mcl_doors:iron_trapdoor') +core.register_alias('doors:trapdoor_open', 'mcl_doors:trapdoor_open') +core.register_alias('doors:trapdoor', 'mcl_doors:trapdoor') +core.register_alias('doors:door_wood_a', 'mcl_doors:wooden_door') +core.register_alias('doors:hidden', 'air') +core.register_alias('everness:cobweb', 'mcl_core:cobweb') + +core.register_alias('fire:permanent_flame', 'air') diff --git a/mods/everness/mod_support_x_farming.lua b/mods/everness/mod_support_x_farming.lua new file mode 100644 index 0000000..b9fbda1 --- /dev/null +++ b/mods/everness/mod_support_x_farming.lua @@ -0,0 +1,257 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +-- +-- Bonemeal Trees +-- + +x_farming.x_bonemeal:register_tree_defs({ + { + -- sapling name + name = 'everness:coral_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_coral_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:coral_tree_bioluminescent_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.coral_tree_bioluminescent(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:crystal_bush_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_crystal_bush(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:cursed_bush_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_cursed_bush(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:baobab_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_baobab_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:dry_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_dry_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:willow_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_willow_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:sequoia_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_sequoia_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:crystal_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_crystal_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:crystal_tree_large_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_crystal_large_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:cursed_dream_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 3, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_cursed_dream_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:mese_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 4, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_mese_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:palm_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 4, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_sand(pos) then + return false + end + + Everness.grow_palm_tree(pos) + + return true + end + }, + { + -- sapling name + name = 'everness:lava_tree_sapling', + -- 1 out of `chance`, e.g. 2 = 50% chance + chance = 4, + -- grow tree from sapling + grow_tree = function(pos) + if not x_farming.x_bonemeal.is_on_soil(pos) then + return false + end + + Everness.grow_lava_tree(pos) + + return true + end + }, +}) + +-- +-- Recipes +-- + +core.register_craft({ + output = 'x_farming:bonemeal 4', + recipe = { + { 'everness:bone' } + } +}) diff --git a/mods/everness/mod_support_x_obsidianmese.lua b/mods/everness/mod_support_x_obsidianmese.lua new file mode 100644 index 0000000..2a6ab24 --- /dev/null +++ b/mods/everness/mod_support_x_obsidianmese.lua @@ -0,0 +1,582 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local mod_start_time = core.get_us_time() + +-- Bamboo Forest + +local path_nodes_bamboo_forest = { + ['everness:dirt_with_grass_1'] = { + name = 'dirt_with_grass_1', + mod_origin = 'everness', + descritption = 'Dirt with Grass Path', + drop = 'everness:dirt_1', + tiles = { + 'x_obsidianmese_path_dirt_base.png^(everness_grass_top.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png', + 'x_obsidianmese_dirt_path_side.png' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:dirt_with_grass_extras_1'] = { + name = 'dirt_with_grass_extras_1', + mod_origin = 'everness', + descritption = 'Dirt with Grass Path', + drop = 'everness:dirt_1', + tiles = { + 'x_obsidianmese_path_dirt_base.png^(everness_grass_top.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png', + 'x_obsidianmese_dirt_path_side.png' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:dirt_with_grass_extras_2'] = { + name = 'dirt_with_grass_extras_2', + mod_origin = 'everness', + descritption = 'Dirt with Grass Path', + drop = 'everness:dirt_1', + tiles = { + 'x_obsidianmese_path_dirt_base.png^(everness_grass_top.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png', + 'x_obsidianmese_dirt_path_side.png' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:dirt_1'] = { + name = 'dirt_1', + mod_origin = 'everness', + descritption = 'Dirt Path', + drop = 'everness:dirt_1', + tiles = { + 'x_obsidianmese_path_dirt_base.png^(everness_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png', + 'x_obsidianmese_dirt_path_side.png' + }, + sounds = Everness.node_sound_dirt_defaults() + } +} + +local path_nodes_baobab_savanna = { + ['everness:dry_dirt_with_dry_grass'] = { + name = 'dry_dirt_with_dry_grass', + mod_origin = 'everness', + descritption = 'Dry Dirt with Dry Grass Path', + drop = 'everness:dry_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#B88C5E:127^(everness_dry_grass_top.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#B88C5E:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#B88C5E:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:dry_dirt'] = { + name = 'dry_dirt', + mod_origin = 'everness', + descritption = 'Dry Dirt Path', + drop = 'everness:dry_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#B88C5E:127^(everness_dry_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#B88C5E:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#B88C5E:127' + }, + sounds = Everness.node_sound_dirt_defaults() + } +} + +-- Crystal Forest + +local path_nodes_crystal_forest = { + ['everness:dirt_with_crystal_grass'] = { + name = 'dirt_with_crystal_grass', + mod_origin = 'everness', + descritption = 'Dirt with Crystal Grass Path', + drop = 'everness:crystal_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#755069:127^(everness_crystal_grass.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#755069:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#755069:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:crystal_dirt'] = { + name = 'crystal_dirt', + mod_origin = 'everness', + descritption = 'Crystal Dirt Path', + drop = 'everness:crystal_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#755069:127^(everness_crystal_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#755069:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#755069:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, +} + +local path_nodes_crystal_forest_dunes = { + ['everness:crystal_sand'] = { + name = 'crystal_sand', + mod_origin = 'everness', + descritption = 'Crystal Sand Path', + drop = 'everness:crystal_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170^(everness_crystal_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#845D88:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +local path_nodes_crystal_forest_shore = { + ['everness:crystal_sand'] = { + name = 'crystal_sand', + mod_origin = 'everness', + descritption = 'Crystal Sand Path', + drop = 'everness:crystal_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170^(everness_crystal_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#845D88:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +local path_nodes_crystal_forest_ocean = { + ['everness:crystal_sand'] = { + name = 'crystal_sand', + mod_origin = 'everness', + descritption = 'Crystal Sand Path', + drop = 'everness:crystal_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170^(everness_crystal_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#845D88:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#845D88:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +local path_nodes_crystal_forest_under = { + ['everness:crystal_cave_dirt_with_moss'] = { + name = 'crystal_cave_dirt_with_moss', + mod_origin = 'everness', + descritption = 'Crystal Cave Dirt with Moss Path', + drop = 'everness:crystal_cave_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#EEDDB2:127^(everness_crystal_cave_dirt_top.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#EEDDB2:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#EEDDB2:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:crystal_cave_dirt'] = { + name = 'crystal_cave_dirt', + mod_origin = 'everness', + descritption = 'Crystal Cave Dirt', + drop = 'everness:crystal_cave_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#EEDDB2:127^(everness_crystal_cave_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#EEDDB2:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#EEDDB2:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, +} + +-- Forsaken Tundra + +local path_nodes_forsaken_tundra = { + ['everness:forsaken_tundra_dirt_with_grass'] = { + name = 'forsaken_tundra_dirt_with_grass', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Dirt with Grass Path', + drop = 'everness:forsaken_tundra_dirt_with_grass', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#151611:170^(everness_forsaken_tundra_grass.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#151611:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#151611:170' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:forsaken_tundra_dirt'] = { + name = 'forsaken_tundra_dirt', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Dirt Path', + drop = 'everness:forsaken_tundra_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#151611:170^(everness_forsaken_tundra_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#151611:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#151611:170' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:forsaken_tundra_beach_sand'] = { + name = 'forsaken_tundra_beach_sand', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Beach Sand Path', + drop = 'everness:forsaken_tundra_beach_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +local path_nodes_forsaken_tundra_beach = { + ['everness:forsaken_tundra_beach_sand'] = { + name = 'forsaken_tundra_beach_sand', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Beach Sand Path', + drop = 'everness:forsaken_tundra_beach_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, + ['everness:forsaken_tundra_beach_sand_with_shells'] = { + name = 'forsaken_tundra_beach_sand_with_shells', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Beach Sand with Shells', + drop = 'everness:forsaken_tundra_beach_sand_with_shells', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand_with_shells.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +local path_nodes_forsaken_tundra_ocean = { + ['everness:forsaken_tundra_beach_sand'] = { + name = 'forsaken_tundra_beach_sand', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Beach Sand Path', + drop = 'everness:forsaken_tundra_beach_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, + ['everness:forsaken_tundra_beach_sand_with_shells'] = { + name = 'forsaken_tundra_beach_sand_with_shells', + mod_origin = 'everness', + descritption = 'Forsaken Tundra Beach Sand with Shells', + drop = 'everness:forsaken_tundra_beach_sand_with_shells', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170^(everness_forsaken_tundra_beach_sand_with_shells.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#4C4341:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#4C4341:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +-- Forsaken Desert + +local path_nodes_forsaken_desert = { + ['everness:forsaken_desert_sand'] = { + name = 'forsaken_desert_sand', + mod_origin = 'everness', + descritption = 'Forsaken Desert Sand Path', + drop = 'everness:forsaken_desert_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#D1906A:170^(everness_forsaken_desert_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#D1906A:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#D1906A:170' + }, + sounds = Everness.node_sound_sand_defaults() + } +} + +local path_nodes_forsaken_desert_ocean = { + ['everness:dry_ocean_dirt'] = { + name = 'dry_ocean_dirt', + mod_origin = 'everness', + descritption = 'Dry Ocean Dirt Path', + drop = 'everness:dry_ocean_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#AB7D54:127^(everness_forsaken_desert_dry_ocean_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#AB7D54:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#AB7D54:127' + }, + sounds = Everness.node_sound_dirt_defaults() + } +} + +local path_nodes_forsaken_desert_under = { + ['everness:forsaken_desert_sand'] = { + name = 'forsaken_desert_sand', + mod_origin = 'everness', + descritption = 'Forsaken Desert Sand Path', + drop = 'everness:forsaken_desert_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#D1906A:170^(everness_forsaken_desert_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#D1906A:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#D1906A:170' + }, + sounds = Everness.node_sound_sand_defaults() + } +} + +-- Cursed Lands + +local path_nodes_cursed_lands_and_dunes_ocean = { + ['everness:dirt_with_cursed_grass'] = { + name = 'dirt_with_cursed_grass', + mod_origin = 'everness', + descritption = 'Dirt with Cursed Grass Path', + drop = 'everness:cursed_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#696151:170^(everness_cursed_grass.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#696151:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#696151:170' + }, + sounds = Everness.node_sound_mud_defaults() + }, + ['everness:cursed_dirt'] = { + name = 'cursed_dirt', + mod_origin = 'everness', + descritption = 'Cursed Dirt Path', + drop = 'everness:cursed_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#696151:170^(everness_cursed_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#696151:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#696151:170' + }, + sounds = Everness.node_sound_mud_defaults() + }, + ['everness:cursed_sand'] = { + name = 'cursed_sand', + mod_origin = 'everness', + descritption = 'Cursed Sand Path', + drop = 'everness:cursed_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#856F58:170^(everness_cursed_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#856F58:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#856F58:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +-- Coral Forest + +local path_nodes_coral_forest_and_dunes = { + ['everness:dirt_with_coral_grass'] = { + name = 'dirt_with_coral_grass', + mod_origin = 'everness', + descritption = 'Dirt with Coral Grass Path', + drop = 'everness:coral_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#AA683F:127^(everness_coral_grass.png^[mask:x_obsidianmese_path_overlay.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#AA683F:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#AA683F:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:coral_dirt'] = { + name = 'coral_dirt', + mod_origin = 'everness', + descritption = 'Coral Dirt Path', + drop = 'everness:coral_dirt', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#AA683F:127^(everness_coral_dirt.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#AA683F:127', + 'x_obsidianmese_dirt_path_side.png^[colorize:#AA683F:127' + }, + sounds = Everness.node_sound_dirt_defaults() + }, + ['everness:coral_sand'] = { + name = 'coral_sand', + mod_origin = 'everness', + descritption = 'Coral Sand Path', + drop = 'everness:coral_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#AB633D:170^(everness_coral_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#AB633D:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#AB633D:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, + ['everness:coral_white_sand'] = { + name = 'coral_white_sand', + mod_origin = 'everness', + descritption = 'Coral White Sand Path', + drop = 'everness:coral_white_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#F9F4FB:170^(everness_coral_white_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#F9F4FB:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#F9F4FB:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +local path_nodes_coral_forest_ocean = { + ['everness:coral_white_sand'] = { + name = 'coral_white_sand', + mod_origin = 'everness', + descritption = 'Coral White Sand Path', + drop = 'everness:coral_white_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#F9F4FB:170^(everness_coral_white_sand.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#F9F4FB:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#F9F4FB:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +-- Frosted Icesheet + +local path_nodes_frosted_icesheet = { + ['everness:frosted_snowblock'] = { + name = 'frosted_snowblock', + mod_origin = 'everness', + descritption = 'Frosted Snow Block Path', + drop = 'everness:frosted_snowblock', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#FCFCFC:170^(everness_frosted_snow.png^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#FCFCFC:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#FCFCFC:170' + }, + sounds = Everness.node_sound_snow_defaults() + }, +} + +-- Mineral Waters + +local path_nodes_mineral_waters = { + ['everness:mineral_sand'] = { + name = 'mineral_sand', + mod_origin = 'everness', + descritption = 'Mineral Sand Path', + drop = 'everness:mineral_sand', + tiles = { + 'x_obsidianmese_path_dirt_base.png^[colorize:#E0CEBB:170^(everness_mineral_sand.png^[sheet:2x2:1,1^[mask:x_obsidianmese_path_overlay_2.png)', + 'x_obsidianmese_path_dirt_base.png^[colorize:#E0CEBB:170', + 'x_obsidianmese_dirt_path_side.png^[colorize:#E0CEBB:170' + }, + sounds = Everness.node_sound_sand_defaults() + }, +} + +-- Bamboo Forest + +if Everness.settings.biomes.everness_bamboo_forest.enabled then + x_obsidianmese:register_path_node(path_nodes_bamboo_forest) +end + +-- Baobab Savanna + +if Everness.settings.biomes.everness_baobab_savanna.enabled then + x_obsidianmese:register_path_node(path_nodes_baobab_savanna) +end + +-- Crystal Forest + +if Everness.settings.biomes.everness_crystal_forest.enabled then + x_obsidianmese:register_path_node(path_nodes_crystal_forest) +end + +if Everness.settings.biomes.everness_crystal_forest_dunes.enabled then + x_obsidianmese:register_path_node(path_nodes_crystal_forest_dunes) +end + +if Everness.settings.biomes.everness_crystal_forest_shore.enabled then + x_obsidianmese:register_path_node(path_nodes_crystal_forest_shore) +end + +if Everness.settings.biomes.everness_crystal_forest_ocean.enabled then + x_obsidianmese:register_path_node(path_nodes_crystal_forest_ocean) +end + +if Everness.settings.biomes.everness_crystal_forest_under.enabled then + x_obsidianmese:register_path_node(path_nodes_crystal_forest_under) +end + +-- Forsaken Tundra + +if Everness.settings.biomes.everness_forsaken_tundra.enabled then + x_obsidianmese:register_path_node(path_nodes_forsaken_tundra) +end + +if Everness.settings.biomes.everness_forsaken_tundra_beach.enabled then + x_obsidianmese:register_path_node(path_nodes_forsaken_tundra_beach) +end + +if Everness.settings.biomes.everness_forsaken_tundra_ocean.enabled then + x_obsidianmese:register_path_node(path_nodes_forsaken_tundra_ocean) +end + +-- Cursed Lands + +if Everness.settings.biomes.everness_cursed_lands.enabled + or Everness.settings.biomes.everness_cursed_lands_dunes.enabled + or Everness.settings.biomes.everness_cursed_lands_ocean.enabled +then + x_obsidianmese:register_path_node(path_nodes_cursed_lands_and_dunes_ocean) +end + +-- Coral Forest + +if Everness.settings.biomes.everness_coral_forest.enabled + or Everness.settings.biomes.everness_coral_forest_dunes.enabled +then + x_obsidianmese:register_path_node(path_nodes_coral_forest_and_dunes) +end + +if Everness.settings.biomes.everness_coral_forest_ocean.enabled then + x_obsidianmese:register_path_node(path_nodes_coral_forest_ocean) +end + +-- Forsaken Desert + +if Everness.settings.biomes.everness_forsaken_desert.enabled then + x_obsidianmese:register_path_node(path_nodes_forsaken_desert) +end + +if Everness.settings.biomes.everness_forsaken_desert_ocean.enabled then + x_obsidianmese:register_path_node(path_nodes_forsaken_desert_ocean) +end + +if Everness.settings.biomes.everness_forsaken_desert_under.enabled then + x_obsidianmese:register_path_node(path_nodes_forsaken_desert_under) +end + +-- Frosted Icesheet + +if Everness.settings.biomes.everness_frosted_icesheet.enabled then + x_obsidianmese:register_path_node(path_nodes_frosted_icesheet) +end + +-- Mineral Waters + +if Everness.settings.biomes.everness_mineral_waters.enabled then + x_obsidianmese:register_path_node(path_nodes_mineral_waters) +end + +local mod_end_time = (core.get_us_time() - mod_start_time) / 1000000 + +print('[Mod] everness: x_obsidianmese support loaded.. [' .. mod_end_time .. 's]') diff --git a/mods/everness/mod_support_x_tumbleweed.lua b/mods/everness/mod_support_x_tumbleweed.lua new file mode 100644 index 0000000..afdce2f --- /dev/null +++ b/mods/everness/mod_support_x_tumbleweed.lua @@ -0,0 +1,43 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local mod_start_time = core.get_us_time() + +local allowed_biomes = {} + +if Everness.settings.biomes.everness_forsaken_desert.enabled then + table.insert(allowed_biomes, 'everness:forsaken_desert') +end + +if Everness.settings.biomes.everness_forsaken_desert_ocean.enabled then + table.insert(allowed_biomes, 'everness:forsaken_desert_ocean') +end + +if Everness.settings.biomes.everness_forsaken_desert_under.enabled then + table.insert(allowed_biomes, 'everness:forsaken_desert_under') +end + +if Everness.settings.biomes.everness_baobab_savanna.enabled then + table.insert(allowed_biomes, 'everness:baobab_savanna') +end + +if #allowed_biomes > 0 then + XTumbleweed:add_allowed_biomes(allowed_biomes) +end + +local mod_end_time = (core.get_us_time() - mod_start_time) / 1000000 + +print('[Mod] everness: x_tumbleweed support loaded.. [' .. mod_end_time .. 's]') diff --git a/mods/everness/models/everness_barrel_cactus.obj b/mods/everness/models/everness_barrel_cactus.obj new file mode 100644 index 0000000..9e39b80 --- /dev/null +++ b/mods/everness/models/everness_barrel_cactus.obj @@ -0,0 +1,555 @@ +# Blender v2.83.20 OBJ File: 'everness_barrel_cactus.blend' +# www.blender.org +mtllib everness_barrel_cactus.mtl +o barrel_cactus.vox +v -0.312500 -0.499000 0.312500 +v -0.250000 -0.374000 0.500000 +v -0.250000 -0.374000 0.375000 +v -0.375000 -0.374000 0.375000 +v -0.375000 -0.374000 -0.375000 +v -0.250000 -0.249000 0.500000 +v -0.375000 -0.249000 0.375000 +v -0.500000 -0.249000 -0.250000 +v -0.250000 -0.249000 -0.500000 +v -0.500000 -0.249000 0.250000 +v -0.375000 -0.249000 -0.500000 +v -0.375000 0.126000 0.500000 +v -0.500000 0.126000 0.375000 +v -0.500000 0.126000 0.250000 +v -0.500000 0.126000 -0.375000 +v -0.375000 0.126000 -0.375000 +v -0.500000 0.251000 -0.250000 +v -0.375000 0.251000 -0.250000 +v -0.375000 0.251000 -0.375000 +v -0.312500 0.376000 0.312500 +v 0.312500 -0.374000 -0.312500 +v 0.250000 -0.374000 0.500000 +v 0.250000 -0.374000 0.375000 +v 0.500000 -0.374000 -0.250000 +v 0.250000 -0.374000 -0.500000 +v 0.375000 -0.249000 0.250000 +v 0.375000 -0.249000 -0.250000 +v 0.250000 -0.249000 -0.500000 +v 0.375000 -0.249000 0.375000 +v 0.500000 -0.249000 -0.250000 +v 0.375000 -0.249000 -0.375000 +v 0.375000 -0.249000 -0.500000 +v 0.500000 0.126000 0.250000 +v 0.250000 0.126000 0.500000 +v 0.250000 0.126000 0.375000 +v 0.375000 0.126000 0.375000 +v 0.500000 0.126000 -0.250000 +v 0.375000 0.126000 -0.250000 +v 0.250000 0.126000 -0.375000 +v 0.250000 0.251000 0.500000 +v 0.375000 0.251000 0.375000 +v 0.375000 0.251000 0.250000 +v 0.500000 0.251000 0.250000 +v 0.500000 0.251000 -0.250000 +v 0.375000 0.251000 -0.375000 +v 0.250000 0.251000 -0.500000 +v 0.312500 0.251000 0.312500 +v 0.312500 0.376000 0.312500 +v 0.312500 0.376000 -0.312500 +v 0.312500 -0.374000 0.312500 +v 0.375000 -0.374000 0.375000 +v 0.375000 -0.374000 0.250000 +v 0.500000 -0.374000 0.250000 +v 0.250000 -0.249000 0.375000 +v -0.375000 -0.249000 0.250000 +v 0.500000 -0.249000 0.250000 +v 0.375000 -0.249000 0.500000 +v -0.500000 -0.249000 0.375000 +v -0.250000 0.126000 0.500000 +v -0.375000 0.126000 0.375000 +v 0.500000 0.126000 0.375000 +v 0.375000 0.126000 0.250000 +v -0.250000 0.251000 0.500000 +v -0.250000 0.251000 0.375000 +v -0.500000 0.251000 0.250000 +v 0.312500 -0.499000 -0.312500 +v -0.375000 -0.374000 -0.250000 +v 0.375000 -0.374000 -0.375000 +v -0.250000 -0.249000 -0.375000 +v 0.250000 -0.249000 -0.375000 +v -0.500000 -0.249000 -0.375000 +v -0.375000 0.126000 -0.500000 +v 0.250000 0.126000 -0.500000 +v 0.375000 0.126000 -0.500000 +v -0.250000 0.126000 -0.375000 +v -0.250000 0.126000 -0.500000 +v -0.312500 0.251000 -0.312500 +v 0.312500 0.251000 -0.312500 +v -0.312500 0.376000 -0.312500 +v 0.312500 -0.499000 0.312500 +v -0.312500 -0.499000 -0.312500 +v -0.312500 -0.374000 0.312500 +v -0.500000 -0.374000 0.250000 +v -0.375000 -0.374000 0.250000 +v -0.500000 -0.374000 -0.250000 +v 0.375000 -0.374000 -0.250000 +v -0.312500 -0.374000 -0.312500 +v -0.250000 -0.374000 -0.375000 +v 0.250000 -0.374000 -0.375000 +v -0.250000 -0.374000 -0.500000 +v -0.375000 -0.249000 0.500000 +v 0.250000 -0.249000 0.500000 +v -0.250000 -0.249000 0.375000 +v 0.500000 -0.249000 0.375000 +v -0.375000 -0.249000 -0.250000 +v 0.500000 -0.249000 -0.375000 +v -0.375000 -0.249000 -0.375000 +v 0.375000 0.126000 0.500000 +v -0.250000 0.126000 0.375000 +v -0.375000 0.126000 0.250000 +v -0.500000 0.126000 -0.250000 +v -0.375000 0.126000 -0.250000 +v 0.375000 0.126000 -0.375000 +v 0.500000 0.126000 -0.375000 +v 0.250000 0.251000 0.375000 +v -0.375000 0.251000 0.375000 +v -0.312500 0.251000 0.312500 +v -0.375000 0.251000 0.250000 +v 0.375000 0.251000 -0.250000 +v 0.250000 0.251000 -0.375000 +v -0.250000 0.251000 -0.375000 +v -0.250000 0.251000 -0.500000 +v 0.353553 1.375998 0.353553 +v 0.353553 0.375999 0.353553 +v -0.353553 1.375998 -0.353553 +v -0.353553 0.375998 -0.353553 +v 0.353553 1.375998 -0.353553 +v 0.353553 0.375998 -0.353553 +v -0.353553 1.375998 0.353553 +v -0.353553 0.375998 0.353553 +vt 0.000000 0.375000 +vt 0.062500 0.375000 +vt 0.062500 0.437500 +vt 0.000000 0.437500 +vt 0.093750 0.406250 +vt 0.406250 0.406250 +vt 0.437500 0.437500 +vt 0.375000 0.437500 +vt 0.375000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.437500 +vt 0.062500 0.437500 +vt 0.062500 0.375000 +vt 0.062500 0.000000 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.062500 0.062500 +vt 0.000000 0.062500 +vt 0.062500 0.125000 +vt 0.000000 0.125000 +vt 0.500000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.562500 +vt 0.500000 0.562500 +vt 0.500000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.562500 +vt 0.500000 0.562500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.625000 +vt 0.406250 0.093750 +vt 0.406250 0.406250 +vt 0.093750 0.406250 +vt 0.093750 0.093750 +vt 0.500000 0.125000 +vt 0.437500 0.125000 +vt 0.437500 0.062500 +vt 0.500000 0.062500 +vt 0.062500 0.625000 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.625000 +vt 0.125000 0.812500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 0.812500 +vt 0.500000 0.812500 +vt 0.500000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 0.812500 +vt 0.437500 0.125000 +vt 0.437500 0.062500 +vt 0.500000 0.062500 +vt 0.500000 0.125000 +vt 0.093750 0.406250 +vt 0.406250 0.406250 +vt 0.375000 0.437500 +vt 0.375000 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.437500 +vt 0.062500 0.437500 +vt 0.062500 0.375000 +vt 0.000000 0.375000 +vt 0.000000 0.125000 +vt 0.062500 0.125000 +vt 0.093750 0.093750 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.437500 0.875000 +vt 0.375000 0.875000 +vt 0.375000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.437500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.625000 +vt 0.062500 0.625000 +vt 0.062500 0.562500 +vt 0.062500 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.562500 +vt 0.062500 0.562500 +vt 0.062500 0.437500 +vt 0.125000 0.437500 +vt 0.125000 0.500000 +vt 0.062500 0.500000 +vt -0.000000 0.875000 +vt -0.000000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.062500 0.375000 +vt 0.000000 0.437500 +vt 0.000000 0.375000 +vt 0.437500 0.375000 +vt 0.500000 0.375000 +vt 0.500000 0.437500 +vt 0.437500 0.437500 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.875000 +vt 0.062500 0.562500 +vt 0.062500 0.625000 +vt -0.000000 0.625000 +vt -0.000000 0.562500 +vt 0.500000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 0.812500 +vt 0.500000 0.812500 +vt 0.375000 0.500000 +vt 0.375000 0.437500 +vt 0.437500 0.500000 +vt 0.125000 0.812500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 0.812500 +vt 0.375000 0.812500 +vt 0.437500 0.875000 +vt 0.375000 0.875000 +vt 0.406250 0.562500 +vt 0.093750 0.562500 +vt 0.093750 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.937500 +vt 0.093750 0.937500 +vt 0.093750 0.875000 +vt 0.406250 0.875000 +vt 0.062500 0.625000 +vt 0.125000 0.625000 +vt 0.125000 0.562500 +vt 0.375000 0.562500 +vt 0.375000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.812500 +vt 0.375000 0.812500 +vt 0.375000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.062500 0.812500 +vt 0.375000 0.875000 +vt 0.375000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.125000 0.062500 +vt 0.125000 0.000000 +vt 0.375000 0.000000 +vt 0.375000 0.062500 +vt 0.437500 0.062500 +vt 0.437500 0.125000 +vt 0.500000 0.125000 +vt 0.500000 0.375000 +vt 0.437500 0.375000 +vt 0.437500 0.437500 +vt 0.406250 0.093750 +vt 0.062500 0.062500 +vt 0.125000 0.000000 +vt 0.125000 0.062500 +vt 0.062500 0.062500 +vt 0.062500 0.000000 +vt 0.062500 0.500000 +vt 0.125000 0.437500 +vt 0.125000 0.500000 +vt 0.093750 0.562500 +vt 0.093750 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.562500 +vt 0.125000 0.812500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 0.812500 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.437500 0.562500 +vt 0.500000 0.812500 +vt 0.500000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 0.812500 +vt 0.000000 0.812500 +vt 0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.125000 0.625000 +vt 0.062500 0.625000 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.437500 0.437500 +vt 0.437500 0.375000 +vt 0.500000 0.375000 +vt 0.500000 0.437500 +vt 0.093750 0.875000 +vt 0.406250 0.875000 +vt 0.406250 0.937500 +vt 0.093750 0.937500 +vt 0.062500 0.125000 +vt 0.000000 0.125000 +vt 0.000000 0.062500 +vt 0.406250 0.500000 +vt 0.406250 0.562500 +vt 0.093750 0.562500 +vt 0.093750 0.500000 +vt 0.375000 0.000000 +vt 0.437500 0.000000 +vt 0.375000 0.062500 +vt 0.500000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.562500 +vt 0.500000 0.562500 +vt 0.500000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.562500 +vt 0.500000 0.562500 +vt 0.000000 0.812500 +vt 0.000000 0.625000 +vt 0.437500 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.437500 +vt 0.125000 0.812500 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 0.812500 +vt 0.375000 0.062500 +vt 0.375000 0.000000 +vt 0.437500 0.000000 +vt 0.437500 0.875000 +vt 0.437500 0.812500 +vt 0.500000 0.812500 +vt 0.500000 0.875000 +vt 0.062500 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.562500 +vt 0.062500 0.562500 +vt 0.000000 0.812500 +vt 0.000000 0.625000 +vt 0.375000 0.562500 +vt 0.375000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.812500 +vt 0.375000 0.812500 +vt 0.375000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.625000 +vt 0.125000 0.625000 +vt 0.125000 0.562500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.625000 +vt 0.375000 0.812500 +vt 0.375000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.625000 +vt 0.125000 0.625000 +vt 0.125000 0.562500 +vt 0.375000 0.562500 +vt 0.375000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.812500 +vt 0.406250 0.093750 +vt 0.406250 0.406250 +vt 0.093750 0.406250 +vt 0.093750 0.093750 +vt 0.406250 0.875000 +vt 0.406250 0.937500 +vt 0.093750 0.937500 +vt 0.093750 0.875000 +vt 0.125000 0.625000 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.437500 0.125000 +vt 0.500000 0.125000 +vt 0.500000 0.375000 +vt 0.437500 0.375000 +vt 0.406250 0.093750 +vt 0.093750 0.093750 +vt 0.000000 0.375000 +vt 0.000000 0.125000 +vt 0.062500 0.125000 +vt 0.062500 0.062500 +vt 0.125000 0.062500 +vt 0.125000 0.000000 +vt 0.375000 0.000000 +vt 0.375000 0.062500 +vt 0.437500 0.062500 +vt 0.437500 0.625000 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.437500 0.562500 +vt 0.437500 0.875000 +vt 0.375000 0.875000 +vt 0.375000 0.812500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt -0.000000 0.812500 +vt -0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.562500 +vt 0.062500 0.562500 +vt 0.375000 0.625000 +vt 0.375000 0.562500 +vt 0.437500 0.562500 +vt 0.406250 0.937500 +vt 0.093750 0.937500 +vt 0.093750 0.875000 +vt 0.406250 0.875000 +vt 0.375000 0.812500 +vt 0.375000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.062500 0.812500 +vt 0.062500 0.625000 +vt 0.125000 0.625000 +vt 0.125000 0.562500 +vt 0.375000 0.562500 +vt 0.375000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.812500 +vt 0.093750 0.562500 +vt 0.093750 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.562500 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.7071 0.0000 -0.7071 +vn -0.7071 -0.0000 -0.7071 +g barrel_cactus.vox_barrel_cactus.vox_cactus +usemtl cactus +s off +f 101/1/1 102/2/1 16/3/1 15/4/1 +f 77/5/1 78/6/1 45/7/1 110/8/1 46/9/1 112/10/1 111/11/1 19/12/1 18/13/1 +f 11/14/2 9/15/2 69/16/2 97/17/2 +f 71/18/2 97/17/2 95/19/2 8/20/2 +f 6/21/3 93/22/3 3/23/3 2/24/3 +f 28/25/4 70/26/4 89/27/4 25/28/4 +f 94/29/5 61/30/5 36/31/5 29/32/5 +f 66/33/2 80/34/2 1/35/2 81/36/2 +f 30/37/2 27/38/2 31/39/2 96/40/2 +f 31/41/6 68/42/6 89/43/6 70/44/6 +f 102/45/3 18/46/3 19/47/3 16/48/3 +f 33/49/5 43/50/5 42/51/5 62/52/5 +f 62/53/1 36/54/1 61/55/1 33/56/1 +f 82/57/2 50/58/2 23/59/2 22/60/2 2/61/2 3/62/2 4/63/2 84/64/2 83/65/2 85/66/2 67/67/2 87/68/2 +f 38/69/6 109/70/6 44/71/6 37/72/6 +f 100/73/5 108/74/5 65/75/5 14/76/5 +f 106/77/3 108/78/3 100/79/3 60/80/3 +f 31/81/4 27/82/4 86/83/4 68/84/4 +f 52/85/4 26/86/4 29/87/4 51/88/4 +f 55/89/5 10/90/5 83/91/5 84/92/5 +f 7/93/2 93/94/2 6/95/2 91/96/2 +f 40/97/4 34/98/4 35/99/4 105/100/4 +f 55/101/2 7/93/2 58/102/2 10/103/2 +f 26/104/2 56/105/2 94/106/2 29/107/2 +f 112/108/3 76/109/3 75/110/3 111/111/3 +f 23/112/4 54/113/4 92/114/4 22/115/4 +f 63/116/3 64/117/3 99/118/3 59/119/3 +f 92/120/2 54/121/2 29/107/2 57/122/2 +f 39/123/6 110/124/6 45/125/6 103/126/6 +f 35/127/5 36/31/5 41/128/5 105/129/5 +f 87/130/6 21/131/6 66/132/6 81/133/6 +f 48/134/5 20/135/5 107/136/5 47/137/5 +f 91/138/5 6/139/5 2/140/5 22/141/5 92/142/5 57/143/5 98/144/5 34/145/5 40/146/5 63/147/5 59/148/5 12/149/5 +f 109/150/4 38/151/4 103/152/4 45/153/4 +f 103/152/4 31/81/4 32/154/4 74/155/4 +f 88/156/2 90/157/2 25/158/2 89/159/2 68/160/2 86/161/2 24/162/2 53/163/2 52/164/2 51/165/2 23/59/2 50/58/2 21/166/2 87/68/2 67/67/2 5/167/2 +f 59/168/1 99/169/1 60/170/1 12/171/1 +f 72/172/1 16/3/1 75/173/1 76/174/1 +f 82/175/5 1/176/5 80/177/5 50/178/5 +f 99/179/5 64/180/5 106/181/5 60/182/5 +f 54/183/5 23/184/5 51/185/5 29/32/5 +f 101/186/6 17/187/6 18/188/6 102/189/6 +f 16/48/3 72/190/3 11/191/3 97/192/3 +f 93/193/5 7/194/5 4/195/5 3/196/5 +f 103/197/1 38/198/1 37/199/1 104/200/1 +f 78/201/6 77/202/6 79/203/6 49/204/6 +f 100/205/1 14/206/1 13/207/1 60/170/1 +f 66/208/4 21/209/4 50/210/4 80/211/4 +f 28/212/2 32/213/2 31/39/2 70/214/2 +f 56/215/5 26/216/5 52/217/5 53/218/5 +f 8/219/6 95/220/6 67/221/6 85/222/6 +f 13/223/5 58/224/5 7/194/5 60/182/5 +f 103/197/1 74/225/1 73/226/1 39/227/1 +f 62/228/4 42/229/4 41/230/4 36/231/4 +f 35/232/1 34/233/1 98/234/1 36/54/1 +f 110/235/4 39/236/4 73/237/4 46/238/4 +f 27/239/6 30/240/6 24/241/6 86/242/6 +f 103/126/6 104/243/6 96/244/6 31/41/6 +f 83/245/3 10/246/3 58/247/3 13/248/3 14/249/3 65/250/3 17/251/3 101/252/3 15/253/3 71/254/3 8/255/3 85/256/3 +f 71/257/6 15/258/6 16/259/6 97/260/6 +f 76/261/6 112/262/6 46/263/6 73/264/6 74/265/6 32/266/6 28/267/6 25/268/6 90/269/6 9/270/6 11/271/6 72/272/6 +f 48/273/1 49/274/1 79/275/1 20/276/1 +f 78/277/4 49/278/4 48/279/4 47/280/4 +f 95/281/3 97/192/3 5/282/3 67/283/3 +f 42/284/1 43/285/1 44/286/1 109/287/1 45/7/1 78/6/1 47/288/1 107/289/1 77/5/1 18/13/1 17/290/1 65/291/1 108/292/1 106/293/1 64/294/1 63/295/1 40/296/1 105/297/1 41/298/1 +f 7/299/3 55/300/3 84/301/3 4/302/3 +f 16/259/6 19/303/6 111/304/6 75/305/6 +f 91/306/3 12/307/3 60/80/3 7/299/3 +f 98/308/4 57/309/4 29/87/4 36/231/4 +f 69/310/3 9/311/3 90/312/3 88/313/3 +f 97/260/6 69/314/6 88/315/6 5/316/6 +f 20/317/3 79/318/3 77/319/3 107/320/3 +f 37/321/4 44/322/4 43/323/4 33/324/4 61/325/4 94/326/4 56/327/4 53/328/4 24/329/4 30/330/4 96/331/4 104/332/4 +f 87/333/3 81/334/3 1/335/3 82/336/3 +f 113/337/7 114/338/7 116/339/7 115/340/7 +f 117/341/8 118/342/8 120/343/8 119/344/8 diff --git a/mods/everness/models/everness_cave_flower.obj b/mods/everness/models/everness_cave_flower.obj new file mode 100644 index 0000000..814a099 --- /dev/null +++ b/mods/everness/models/everness_cave_flower.obj @@ -0,0 +1,38 @@ +# Blender 3.3.1 +# www.blender.org +mtllib everness_cave_flower.mtl +o Cube +v 0.000000 -0.499000 0.000000 +v -0.500000 -0.499000 0.500000 +v 0.500000 -0.229136 -0.500000 +v 0.500000 -0.499000 0.500000 +v -0.500000 -0.229136 -0.500000 +v -0.500000 -0.499000 -0.500000 +v 0.500000 -0.229136 0.500000 +v 0.500000 -0.499000 -0.500000 +v -0.500000 -0.229136 0.500000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 0.8800 -0.4750 +vn 0.4750 0.8800 -0.0000 +vn -0.0000 0.8800 0.4750 +vn -0.4750 0.8800 -0.0000 +vt 0.250000 1.000000 +vt 1.000000 1.000000 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +vt 0.500000 1.000000 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +vt 1.000000 -0.000000 +vt 0.500000 0.187500 +vt -0.000000 0.187500 +vt 0.500000 -0.000000 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +s 0 +usemtl flower +f 8/11/1 6/8/1 2/2/1 4/5/1 +f 9/12/2 7/9/2 1/1/2 +f 5/6/3 9/13/3 1/1/3 +f 3/3/4 5/7/4 1/1/4 +f 7/10/5 3/4/5 1/1/5 diff --git a/mods/everness/models/everness_cave_flower_with_particles.obj b/mods/everness/models/everness_cave_flower_with_particles.obj new file mode 100644 index 0000000..1dc8c8b --- /dev/null +++ b/mods/everness/models/everness_cave_flower_with_particles.obj @@ -0,0 +1,61 @@ +# Blender v2.83.20 OBJ File: 'everness_cave_flower_with_particles.blend' +# www.blender.org +mtllib everness_cave_flower_with_particles.mtl +o Cube +v 0.000000 -0.499000 0.000000 +v -0.500000 -0.499000 0.500000 +v 0.500000 -0.229136 -0.500000 +v 0.500000 -0.499000 0.500000 +v -0.500000 -0.229136 -0.500000 +v -0.500000 -0.499000 -0.500000 +v 0.500000 -0.229136 0.500000 +v 0.500000 -0.499000 -0.500000 +v -0.500000 -0.229136 0.500000 +v 0.353553 -0.499000 0.353553 +v -0.353553 -0.499000 -0.353553 +v 0.353553 1.501000 0.353553 +v -0.353553 1.501000 -0.353553 +v -0.353553 -0.499000 0.353553 +v 0.353553 -0.499000 -0.353553 +v -0.353553 1.501000 0.353553 +v 0.353553 1.501000 -0.353553 +vt 0.500000 1.000000 +vt 0.500000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +vt 0.250000 1.000000 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +vt -0.000000 0.187500 +vt 0.500000 0.187500 +vt 1.000000 1.000000 +vt 0.000000 1.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 1.000000 0.000000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.8800 -0.4750 +vn 0.4750 0.8800 0.0000 +vn 0.0000 0.8800 0.4750 +vn -0.4750 0.8800 0.0000 +vn 0.7071 -0.0000 -0.7071 +vn 0.7071 -0.0000 0.7071 +g Cube_Cube_flower +usemtl flower +s off +f 8/1/1 6/2/1 2/3/1 4/4/1 +f 9/5/2 7/6/2 1/7/2 +f 5/8/3 9/9/3 1/7/3 +f 3/10/4 5/11/4 1/7/4 +f 7/12/5 3/13/5 1/7/5 +g Cube_Cube_particles +usemtl particles +f 13/14/6 12/15/6 10/16/6 11/17/6 +f 17/18/7 16/19/7 14/20/7 15/21/7 diff --git a/mods/everness/models/everness_ceramic_pot.obj b/mods/everness/models/everness_ceramic_pot.obj new file mode 100644 index 0000000..6755b36 --- /dev/null +++ b/mods/everness/models/everness_ceramic_pot.obj @@ -0,0 +1,375 @@ +# Blender v2.83.20 OBJ File: 'everness_ceramic_pot.blend' +# www.blender.org +mtllib everness_ceramic_pot.mtl +o everness_ceramic_pot.vox +v -0.375000 -0.499000 0.375000 +v -0.437500 -0.436500 0.437500 +v -0.437500 0.501000 0.125000 +v -0.250000 0.501000 0.125000 +v -0.250000 0.501000 -0.250000 +v -0.312500 0.563500 0.312500 +v -0.312500 0.751000 -0.312500 +v 0.375000 -0.499000 0.375000 +v 0.437500 -0.436500 0.437500 +v 0.437500 0.501000 0.437500 +v 0.312500 0.563500 0.312500 +v -0.375000 -0.436500 0.375000 +v 0.375000 -0.436500 0.375000 +v -0.250000 0.501000 0.437500 +v -0.250000 0.501000 0.250000 +v -0.250000 0.563500 0.250000 +v 0.250000 0.563500 0.250000 +v -0.312500 0.751000 0.312500 +v -0.187500 0.751000 0.312500 +v 0.312500 0.751000 0.312500 +v -0.187500 0.751000 -0.187500 +v 0.187500 0.751000 -0.187500 +v -0.375000 -0.436500 -0.375000 +v -0.250000 -0.436500 -0.375000 +v 0.375000 -0.499000 -0.375000 +v -0.437500 -0.436500 -0.437500 +v 0.437500 0.501000 -0.437500 +v -0.312500 0.563500 -0.312500 +v 0.062500 0.563500 -0.312500 +v -0.062500 0.751000 0.187500 +v 0.312500 0.751000 -0.312500 +v -0.375000 -0.499000 -0.375000 +v -0.437500 -0.436500 -0.375000 +v -0.250000 -0.436500 -0.437500 +v 0.375000 -0.436500 -0.375000 +v 0.437500 -0.436500 -0.437500 +v -0.312500 0.563500 -0.250000 +v -0.250000 0.563500 -0.250000 +v 0.062500 0.563500 -0.250000 +v 0.250000 0.563500 -0.250000 +v 0.312500 0.563500 -0.312500 +v -0.437500 0.501000 0.437500 +v 0.250000 0.501000 0.250000 +v 0.250000 0.501000 -0.250000 +v -0.437500 0.501000 -0.437500 +v -0.062500 0.751000 0.312500 +v -0.187500 0.751000 0.187500 +v 0.187500 0.751000 0.187500 +v 0.437500 -0.436500 0.437500 +v 0.437500 -0.436500 -0.437500 +v 0.437500 0.501000 0.437500 +v 0.437500 0.501000 -0.437500 +v -0.375000 -0.499000 0.375000 +v -0.437500 -0.436500 0.437500 +v -0.437500 0.501000 0.125000 +v -0.250000 0.501000 0.125000 +v -0.250000 0.501000 -0.250000 +v -0.312500 0.563500 0.312500 +v -0.312500 0.751000 -0.312500 +v 0.375000 -0.499000 0.375000 +v 0.437500 -0.436500 0.437500 +v 0.437500 0.501000 0.437500 +v 0.312500 0.563500 0.312500 +v -0.187500 0.626000 -0.187500 +v -0.375000 -0.436500 0.375000 +v 0.375000 -0.436500 0.375000 +v -0.250000 0.501000 0.437500 +v -0.250000 0.501000 0.250000 +v -0.250000 0.563500 0.250000 +v 0.250000 0.563500 0.250000 +v 0.187500 0.626000 -0.187500 +v -0.312500 0.751000 0.312500 +v -0.187500 0.751000 0.312500 +v 0.312500 0.751000 0.312500 +v -0.187500 0.751000 -0.187500 +v 0.187500 0.751000 -0.187500 +v -0.375000 -0.436500 -0.375000 +v -0.250000 -0.436500 -0.375000 +v 0.375000 -0.499000 -0.375000 +v -0.437500 -0.436500 -0.437500 +v 0.437500 0.501000 -0.437500 +v -0.312500 0.563500 -0.312500 +v 0.062500 0.563500 -0.312500 +v -0.187500 0.626000 0.187500 +v -0.062500 0.751000 0.187500 +v 0.312500 0.751000 -0.312500 +v -0.375000 -0.499000 -0.375000 +v -0.437500 -0.436500 -0.375000 +v -0.250000 -0.436500 -0.437500 +v 0.375000 -0.436500 -0.375000 +v 0.437500 -0.436500 -0.437500 +v -0.312500 0.563500 -0.250000 +v -0.250000 0.563500 -0.250000 +v 0.062500 0.563500 -0.250000 +v 0.250000 0.563500 -0.250000 +v 0.312500 0.563500 -0.312500 +v -0.437500 0.501000 0.437500 +v 0.250000 0.501000 0.250000 +v 0.250000 0.501000 -0.250000 +v -0.437500 0.501000 -0.437500 +v 0.187500 0.626000 0.187500 +v -0.062500 0.751000 0.312500 +v -0.187500 0.751000 0.187500 +v 0.187500 0.751000 0.187500 +v 0.437500 -0.436500 0.437500 +v 0.437500 -0.436500 -0.437500 +v 0.437500 0.501000 0.437500 +v 0.437500 0.501000 -0.437500 +vt 0.437500 0.250000 +vt 0.375000 0.218750 +vt 0.437500 0.218750 +vt 0.000000 0.000000 +vt 0.093750 0.000000 +vt 0.093750 0.046875 +vt 0.437500 0.000000 +vt 0.437500 0.218750 +vt 0.343750 0.171875 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.843750 0.218750 +vt 0.843750 0.015625 +vt 0.812500 0.031250 +vt 0.625000 0.375000 +vt 0.312500 0.375000 +vt 0.562500 0.343750 +vt 0.468750 0.203125 +vt 0.812500 0.031250 +vt 0.468750 0.031250 +vt 0.531250 0.218750 +vt 0.531250 0.203125 +vt 0.468750 0.203125 +vt 0.906250 0.234375 +vt 0.937500 0.375000 +vt 0.937500 0.218750 +vt 0.812500 0.375000 +vt 0.812500 0.359375 +vt 0.656250 0.359375 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.031250 0.390625 +vt 0.437500 0.390625 +vt 0.281250 0.625000 +vt 0.093750 0.640625 +vt 0.093750 0.625000 +vt 0.281250 0.625000 +vt 0.062500 0.687500 +vt 0.062500 0.640625 +vt 0.093750 0.640625 +vt 0.062500 0.218750 +vt 0.250000 0.250000 +vt 0.250000 0.218750 +vt 0.843750 0.687500 +vt 0.781250 0.703125 +vt 0.468750 0.687500 +vt 0.343750 0.937500 +vt 0.093750 0.953125 +vt 0.093750 0.937500 +vt 0.062500 0.343750 +vt 0.250000 0.375000 +vt 0.062500 0.375000 +vt 0.875000 0.390625 +vt 0.531250 0.625000 +vt 0.031250 0.375000 +vt 0.406250 0.390625 +vt 0.031250 0.390625 +vt 0.781250 0.625000 +vt 0.531250 0.640625 +vt 0.531250 0.625000 +vt 0.406250 0.687500 +vt 0.031250 0.703125 +vt 0.031250 0.687500 +vt 0.312500 0.343750 +vt 0.250000 0.250000 +vt 0.312500 0.250000 +vt 0.812500 0.640625 +vt 0.812500 0.687500 +vt 0.625000 0.687500 +vt 0.437500 0.937500 +vt 0.437500 0.703125 +vt 0.781250 0.703125 +vt 0.625000 0.953125 +vt 0.531250 0.937500 +vt 0.781250 0.937500 +vt 0.500000 1.000000 +vt 0.500000 0.953125 +vt 0.625000 0.953125 +vt 0.062500 0.250000 +vt 0.000000 0.281250 +vt 0.062500 0.343750 +vt 0.375000 0.953125 +vt 0.062500 1.000000 +vt 0.062500 0.953125 +vt 0.250000 0.343750 +vt 0.062500 0.343750 +vt 0.843750 0.375000 +vt 0.468750 0.390625 +vt 0.468750 0.375000 +vt 0.437500 0.937500 +vt 0.000000 0.703125 +vt 0.437500 0.703125 +vt 0.375000 0.250000 +vt 0.093750 0.078125 +vt 0.000000 0.078125 +vt 0.343750 0.046875 +vt 0.000000 0.218750 +vt 0.093750 0.171875 +vt 0.812500 0.203125 +vt 0.437500 0.015625 +vt 0.437500 0.203125 +vt 0.468750 0.031250 +vt 0.312500 0.218750 +vt 0.375000 0.343750 +vt 0.562500 0.250000 +vt 0.625000 0.218750 +vt 0.812500 0.203125 +vt 0.437500 0.218750 +vt 0.625000 0.218750 +vt 0.625000 0.359375 +vt 0.656250 0.234375 +vt 0.906250 0.359375 +vt 0.625000 0.375000 +vt 0.437500 0.625000 +vt 0.000000 0.625000 +vt 0.000000 0.390625 +vt 0.343750 0.625000 +vt 0.343750 0.640625 +vt 0.375000 0.640625 +vt 0.375000 0.687500 +vt 0.062500 0.250000 +vt 0.843750 0.703125 +vt 0.468750 0.703125 +vt 0.343750 0.953125 +vt 0.250000 0.343750 +vt 0.875000 0.625000 +vt 0.406250 0.375000 +vt 0.781250 0.640625 +vt 0.406250 0.703125 +vt 0.562500 0.687500 +vt 0.500000 0.640625 +vt 0.500000 0.687500 +vt 0.875000 0.703125 +vt 0.875000 0.937500 +vt 0.781250 0.953125 +vt 0.531250 0.953125 +vt 0.812500 0.953125 +vt 0.812500 1.000000 +vt -0.000000 0.250000 +vt 0.000000 0.343750 +vt 0.375000 1.000000 +vt 0.843750 0.390625 +vt 0.000000 0.937500 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +usemtl pot +s off +f 30/1/1 19/2/1 46/3/1 +f 42/4/1 14/5/1 15/6/1 +f 10/7/1 27/8/1 44/9/1 +f 27/10/2 51/11/2 52/12/2 +f 36/13/3 9/14/3 13/15/3 +f 31/16/1 7/17/1 22/18/1 +f 32/19/3 8/20/3 1/21/3 +f 34/22/3 24/23/3 23/24/3 +f 17/25/3 41/26/3 11/27/3 +f 29/28/3 39/29/3 38/30/3 +f 10/31/2 49/32/2 51/11/2 +f 36/33/2 52/12/2 50/34/2 +f 9/35/2 50/34/2 49/32/2 +f 88/36/4 54/37/4 55/38/4 +f 93/39/4 57/40/4 56/41/4 +f 59/42/4 82/43/4 92/44/4 +f 76/45/4 101/46/4 104/47/4 +f 87/48/5 78/49/5 79/50/5 +f 99/51/6 70/52/6 98/53/6 +f 84/54/6 75/55/6 103/56/6 +f 61/57/2 67/58/2 54/37/2 +f 87/59/4 65/60/4 77/61/4 +f 98/62/2 69/63/2 68/64/2 +f 79/65/6 66/66/6 60/67/6 +f 75/68/2 71/69/2 76/70/2 +f 63/71/2 74/72/2 102/73/2 +f 81/74/5 91/75/5 89/76/5 +f 94/77/5 99/78/5 57/79/5 +f 86/80/5 96/81/5 83/82/5 +f 84/83/5 85/84/5 101/85/5 +f 96/86/6 74/87/6 63/88/6 +f 84/83/1 71/89/1 64/90/1 +f 60/91/2 65/92/2 53/93/2 +f 108/94/6 105/95/6 106/96/6 +f 30/1/1 47/97/1 19/2/1 +f 4/98/1 3/99/1 15/6/1 +f 3/99/1 42/4/1 15/6/1 +f 43/100/1 15/6/1 14/5/1 +f 45/101/1 3/99/1 5/102/1 +f 3/99/1 4/98/1 5/102/1 +f 43/100/1 14/5/1 10/7/1 +f 45/101/1 5/102/1 44/9/1 +f 44/9/1 43/100/1 10/7/1 +f 27/8/1 45/101/1 44/9/1 +f 27/10/2 10/31/2 51/11/2 +f 24/23/3 34/22/3 35/103/3 +f 34/22/3 36/13/3 35/103/3 +f 2/104/3 33/105/3 12/106/3 +f 33/105/3 23/24/3 12/106/3 +f 2/104/3 12/106/3 13/15/3 +f 13/15/3 35/103/3 36/13/3 +f 9/14/3 2/104/3 13/15/3 +f 7/17/1 18/107/1 47/97/1 +f 18/107/1 19/2/1 47/97/1 +f 47/97/1 21/108/1 7/17/1 +f 30/1/1 46/3/1 48/109/1 +f 46/3/1 20/110/1 48/109/1 +f 22/18/1 48/109/1 20/110/1 +f 7/17/1 21/108/1 22/18/1 +f 22/18/1 20/110/1 31/16/1 +f 32/19/3 25/111/3 8/20/3 +f 33/105/3 26/112/3 23/24/3 +f 26/112/3 34/22/3 23/24/3 +f 6/113/3 37/114/3 16/115/3 +f 37/114/3 38/30/3 16/115/3 +f 39/29/3 29/28/3 40/116/3 +f 29/28/3 41/26/3 40/116/3 +f 11/27/3 6/113/3 16/115/3 +f 17/25/3 40/116/3 41/26/3 +f 11/27/3 16/115/3 17/25/3 +f 37/114/3 28/117/3 38/30/3 +f 28/117/3 29/28/3 38/30/3 +f 10/31/2 9/35/2 49/32/2 +f 36/33/2 27/10/2 52/12/2 +f 9/35/2 36/33/2 50/34/2 +f 97/118/4 55/38/4 54/37/4 +f 55/38/4 100/119/4 88/36/4 +f 100/119/4 80/120/4 88/36/4 +f 68/121/4 69/122/4 56/41/4 +f 69/122/4 93/39/4 56/41/4 +f 58/123/4 72/124/4 92/44/4 +f 72/124/4 59/42/4 92/44/4 +f 76/45/4 71/125/4 101/46/4 +f 77/126/5 78/49/5 87/48/5 +f 78/49/5 90/127/5 79/50/5 +f 99/51/6 95/128/6 70/52/6 +f 84/54/6 64/129/6 75/55/6 +f 62/130/2 67/58/2 61/57/2 +f 67/58/2 97/118/2 54/37/2 +f 87/59/4 53/131/4 65/60/4 +f 98/62/2 70/132/2 69/63/2 +f 79/65/6 90/133/6 66/66/6 +f 75/68/2 64/129/2 71/69/2 +f 102/73/2 73/134/2 58/135/2 +f 73/134/2 72/136/2 58/135/2 +f 102/73/2 58/135/2 63/71/2 +f 89/76/5 80/137/5 100/138/5 +f 100/138/5 81/74/5 89/76/5 +f 57/79/5 93/139/5 94/77/5 +f 94/77/5 95/140/5 99/78/5 +f 82/141/5 59/142/5 83/82/5 +f 59/142/5 86/80/5 83/82/5 +f 103/143/5 85/84/5 84/83/5 +f 85/84/5 104/144/5 101/85/5 +f 96/86/6 86/145/6 74/87/6 +f 84/83/1 101/46/1 71/89/1 +f 60/91/2 66/146/2 65/92/2 +f 108/94/6 107/147/6 105/95/6 diff --git a/mods/everness/models/everness_chest_closed.obj b/mods/everness/models/everness_chest_closed.obj new file mode 100644 index 0000000..ee89188 --- /dev/null +++ b/mods/everness/models/everness_chest_closed.obj @@ -0,0 +1,467 @@ +# Blender 4.4.3 +# www.blender.org +mtllib everness_chest_closed.mtl +o Chest +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.062500 0.000000 -0.437500 +v -0.125000 0.250000 -0.500000 +v 0.062500 0.250000 -0.437500 +v 0.125000 0.250000 -0.437500 +v 0.125000 0.250000 -0.500000 +v 0.125000 0.125000 -0.500000 +v 0.062500 -0.125000 -0.437500 +v -0.125000 0.125000 -0.500000 +v -0.125000 0.125000 -0.437500 +v -0.125000 0.250000 -0.437500 +v 0.500000 -0.500000 -0.437500 +v 0.437500 -0.500000 0.500000 +v -0.437500 -0.500000 -0.500000 +v -0.437500 0.500000 0.500000 +v -0.062500 0.000000 -0.500000 +v -0.062500 0.250000 -0.500000 +v 0.062500 0.062500 -0.437500 +v 0.062500 -0.062500 -0.437500 +v 0.125000 0.125000 -0.437500 +v -0.437500 0.500000 -0.500000 +v -0.500000 0.500000 0.437500 +v 0.437500 -0.500000 -0.500000 +v 0.500000 0.500000 -0.437500 +v 0.437500 0.500000 0.500000 +v -0.500000 -0.500000 -0.437500 +v 0.062500 0.000000 -0.500000 +v -0.125000 -0.062500 -0.437500 +v 0.062500 0.250000 -0.500000 +v 0.125000 0.187500 -0.437500 +v 0.125000 0.187500 -0.500000 +v 0.437500 0.125000 -0.500000 +v 0.500000 0.125000 0.437500 +v -0.500000 0.125000 -0.437500 +v -0.437500 0.125000 0.500000 +v -0.437500 0.125000 -0.437500 +v 0.437500 0.125000 0.500000 +v -0.500000 0.125000 0.437500 +v 0.500000 0.125000 -0.437500 +v 0.062500 -0.125000 -0.500000 +v 0.125000 -0.062500 -0.500000 +v 0.125000 -0.062500 -0.437500 +v -0.437500 0.125000 -0.500000 +v -0.125000 0.062500 -0.500000 +v -0.125000 0.187500 -0.500000 +v 0.062500 0.187500 -0.437500 +v -0.062500 -0.125000 -0.500000 +v -0.125000 -0.062500 -0.500000 +v 0.062500 0.000000 -0.437500 +v 0.437500 -0.437500 -0.437500 +v 0.437500 -0.500000 0.437500 +v -0.062500 0.250000 -0.437500 +v -0.062500 0.062500 -0.437500 +v -0.437500 0.437500 -0.437500 +v -0.437500 0.437500 0.437500 +v 0.437500 0.500000 0.437500 +v -0.437500 0.500000 0.437500 +v -0.437500 0.500000 -0.437500 +v -0.062500 0.062500 -0.500000 +v -0.437500 0.187500 -0.500000 +v -0.437500 0.437500 -0.500000 +v -0.437500 -0.437500 -0.500000 +v -0.062500 -0.125000 -0.437500 +v 0.437500 -0.437500 -0.500000 +v 0.062500 -0.062500 -0.500000 +v 0.500000 0.187500 -0.437500 +v 0.500000 0.437500 -0.437500 +v 0.500000 -0.437500 -0.437500 +v 0.500000 -0.437500 0.437500 +v -0.437500 -0.500000 -0.437500 +v -0.437500 -0.500000 0.437500 +v 0.437500 -0.500000 -0.437500 +v -0.500000 0.187500 0.437500 +v -0.500000 0.437500 0.437500 +v -0.500000 -0.437500 0.437500 +v -0.500000 -0.437500 -0.437500 +v 0.437500 0.187500 0.500000 +v 0.437500 0.437500 0.500000 +v -0.437500 0.125000 0.437500 +v 0.437500 -0.437500 0.500000 +v 0.437500 0.125000 -0.437500 +v 0.437500 0.125000 0.437500 +v -0.437500 -0.437500 0.500000 +v -0.437500 -0.437500 0.437500 +v 0.062500 0.187500 -0.500000 +v 0.062500 0.062500 -0.500000 +v -0.125000 0.187500 -0.437500 +v 0.437500 0.500000 -0.437500 +v 0.437500 0.187500 -0.500000 +v 0.500000 0.187500 0.437500 +v -0.500000 0.187500 -0.437500 +v -0.437500 0.187500 0.500000 +v -0.437500 -0.437500 -0.437500 +v -0.062500 -0.062500 -0.437500 +v -0.062500 0.187500 -0.500000 +v -0.062500 -0.062500 -0.500000 +v -0.437500 0.437500 0.500000 +v -0.500000 0.437500 -0.437500 +v 0.500000 0.437500 0.437500 +v 0.437500 0.437500 -0.500000 +v 0.437500 0.437500 0.437500 +v -0.062500 0.187500 -0.437500 +v 0.437500 0.437500 -0.437500 +v 0.437500 -0.437455 0.437505 +v 0.437500 0.187500 -0.437500 +v 0.437500 0.187500 0.437500 +v -0.437500 0.187500 0.437500 +v -0.437500 0.187500 -0.437500 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn 0.0007 1.0000 -0.0001 +vn -0.0000 1.0000 0.0007 +vn -0.0000 0.0001 -1.0000 +vn 0.0001 -1.0000 0.0001 +vn -0.0001 -0.0000 -1.0000 +vn -0.0001 1.0000 -0.0000 +vt 0.625000 0.687500 +vt 0.562500 0.625000 +vt 0.625000 0.625000 +vt 0.937500 1.000000 +vt 0.062500 0.937500 +vt 0.937500 0.937500 +vt -0.000000 0.062500 +vt -0.000000 0.937500 +vt 0.937500 0.062500 +vt 1.000000 0.937500 +vt 0.562500 0.562500 +vt 0.437500 0.500000 +vt 0.562500 0.500000 +vt 0.437500 0.437500 +vt 0.562500 0.437500 +vt 0.562500 0.750000 +vt 0.562500 0.687500 +vt 1.000000 1.000000 +vt 0.937500 0.687500 +vt 0.937500 0.625000 +vt 0.062500 0.687500 +vt -0.000000 1.000000 +vt 0.062500 0.625000 +vt 1.000000 0.687500 +vt 1.000000 0.625000 +vt 1.000000 0.062500 +vt 0.062500 0.062500 +vt 0.562500 0.375000 +vt 0.375000 0.750000 +vt 0.437500 0.750000 +vt 1.000000 0.000000 +vt 0.062500 1.000000 +vt 0.062500 0.000000 +vt 0.937500 0.000000 +vt 0.500000 0.625000 +vt 0.500000 0.687500 +vt 0.437500 0.625000 +vt 0.437500 0.687500 +vt 0.375000 0.687500 +vt 0.375000 0.625000 +vt -0.000000 0.687500 +vt 0.375000 0.437500 +vt 0.375000 0.500000 +vt 0.437500 0.375000 +vt 0.500000 0.437500 +vt 0.500000 0.375000 +vt 0.625000 0.500000 +vt 0.437500 0.562500 +vt -0.000000 0.625000 +vt 0.000000 0.625000 +vt -0.000000 0.000000 +vt 0.625000 0.437500 +vt 0.625000 0.562500 +vt 0.625000 0.750000 +vt 0.375000 0.562500 +s 0 +g Chest_chest-front +usemtl chest-front +f 18/1/1 52/2/1 94/3/1 +f 60/11/2 56/12/2 9/13/2 +f 23/13/2 72/14/2 103/15/2 +f 10/1/3 59/16/3 24/17/3 +f 3/18/2 67/19/2 50/20/2 +f 16/3/2 52/1/2 102/17/2 +f 57/27/2 100/9/2 70/28/2 +f 110/5/2 12/29/2 11/30/2 +f 52/3/3 115/19/3 94/1/3 +f 67/19/5 61/10/5 115/24/5 +f 59/17/5 102/35/5 24/36/5 +f 92/37/3 109/17/3 53/38/3 +f 11/36/1 92/37/1 53/35/1 +f 36/38/3 12/29/3 13/39/3 +f 13/39/5 37/37/5 38/40/5 +f 38/40/3 112/21/3 96/23/3 +f 110/5/1 96/41/1 112/21/1 +f 61/4/6 107/5/6 110/32/6 +f 88/21/6 14/40/6 39/23/6 +f 14/40/5 49/14/5 48/42/5 +f 26/12/6 48/42/6 49/43/6 +f 47/44/5 26/45/5 15/46/5 +f 15/14/6 54/28/6 47/44/6 +f 101/15/1 54/46/1 70/28/1 +f 35/47/6 103/15/6 101/13/6 +f 17/3/1 16/2/1 51/11/1 +f 17/1/6 50/20/6 16/3/6 +f 56/12/3 23/15/3 9/13/3 +f 66/11/5 9/47/5 23/13/5 +f 93/48/6 60/2/6 66/11/6 +f 25/48/1 34/43/1 56/12/1 +f 71/33/3 100/9/3 57/27/3 +f 57/27/1 39/49/1 71/7/1 +f 50/20/5 100/26/5 69/9/5 +f 18/1/1 10/17/1 52/2/1 +f 60/11/2 25/48/2 56/12/2 +f 23/13/2 34/12/2 72/14/2 +f 72/14/2 47/44/2 54/28/2 +f 103/15/2 55/52/2 23/13/2 +f 55/52/2 51/53/2 23/13/2 +f 72/14/2 54/28/2 103/15/2 +f 51/53/2 66/11/2 23/13/2 +f 10/1/3 18/54/3 59/16/3 +f 4/31/2 3/18/2 50/20/2 +f 3/18/2 28/4/2 68/6/2 +f 3/18/2 68/6/2 67/19/2 +f 69/9/2 21/34/2 4/31/2 +f 50/20/2 69/9/2 4/31/2 +f 68/6/2 28/4/2 107/5/2 +f 28/4/2 7/22/2 107/5/2 +f 7/22/2 8/51/2 39/23/2 +f 8/51/2 30/33/2 71/27/2 +f 30/33/2 21/34/2 69/9/2 +f 30/33/2 69/9/2 71/27/2 +f 96/21/2 107/5/2 7/22/2 +f 8/51/2 71/27/2 39/23/2 +f 96/21/2 7/22/2 39/23/2 +f 14/40/2 48/42/2 34/12/2 +f 48/42/2 72/14/2 34/12/2 +f 96/21/2 39/23/2 14/40/2 +f 36/30/2 13/29/2 38/39/2 +f 38/39/2 96/21/2 14/40/2 +f 14/40/2 34/12/2 93/48/2 +f 36/30/2 38/39/2 92/38/2 +f 38/39/2 14/40/2 92/38/2 +f 14/40/2 93/48/2 92/38/2 +f 93/48/2 66/11/2 102/17/2 +f 66/11/2 51/53/2 16/3/2 +f 16/3/2 50/20/2 67/19/2 +f 52/1/2 10/54/2 24/16/2 +f 16/3/2 67/19/2 52/1/2 +f 93/48/2 102/17/2 92/38/2 +f 66/11/2 16/3/2 102/17/2 +f 52/1/2 24/16/2 102/17/2 +f 15/44/2 26/14/2 49/42/2 +f 49/42/2 27/40/2 88/23/2 +f 100/9/2 43/20/2 35/52/2 +f 43/20/2 17/3/2 35/52/2 +f 35/52/2 101/15/2 70/28/2 +f 49/42/2 88/23/2 57/27/2 +f 15/44/2 49/42/2 57/27/2 +f 100/9/2 35/52/2 70/28/2 +f 70/28/2 15/44/2 57/27/2 +f 53/38/2 109/17/2 59/16/2 +f 18/54/2 94/1/2 115/19/2 +f 11/30/2 53/38/2 59/16/2 +f 18/54/2 115/19/2 61/6/2 +f 59/16/2 18/54/2 61/6/2 +f 61/6/2 110/5/2 11/30/2 +f 110/5/2 112/21/2 12/29/2 +f 112/21/2 37/39/2 12/29/2 +f 11/30/2 59/16/2 61/6/2 +f 52/3/3 67/20/3 115/19/3 +f 67/19/5 68/6/5 61/10/5 +f 59/17/5 109/2/5 102/35/5 +f 92/37/3 102/2/3 109/17/3 +f 11/36/1 36/38/1 92/37/1 +f 36/38/3 11/30/3 12/29/3 +f 13/39/5 12/38/5 37/37/5 +f 38/40/3 37/39/3 112/21/3 +f 110/5/1 107/8/1 96/41/1 +f 61/4/6 68/6/6 107/5/6 +f 88/21/6 27/39/6 14/40/6 +f 14/40/5 27/37/5 49/14/5 +f 26/12/6 72/14/6 48/42/6 +f 47/44/5 72/14/5 26/45/5 +f 15/14/6 70/15/6 54/28/6 +f 101/15/1 103/45/1 54/46/1 +f 35/47/6 55/52/6 103/15/6 +f 51/11/1 55/15/1 35/52/1 +f 35/52/1 17/3/1 51/11/1 +f 17/1/6 43/19/6 50/20/6 +f 56/12/3 34/14/3 23/15/3 +f 66/11/5 60/53/5 9/47/5 +f 93/48/6 25/37/6 60/2/6 +f 25/48/1 93/55/1 34/43/1 +f 71/33/3 69/34/3 100/9/3 +f 57/27/1 88/23/1 39/49/1 +f 50/20/5 43/25/5 100/26/5 +g Chest_chest-top +usemtl chest-top +f 91/4/2 58/5/2 78/6/2 +f 57/7/1 58/5/1 111/8/1 +f 64/6/3 65/9/3 29/10/3 +f 91/6/5 77/26/5 100/9/5 +f 58/5/6 79/27/6 19/7/6 +f 57/27/6 91/6/6 100/9/6 +f 110/27/3 62/6/3 108/5/3 +f 62/6/2 63/32/2 108/5/2 +f 61/26/5 64/6/5 62/10/5 +f 108/5/1 95/7/1 110/27/1 +f 110/33/4 65/9/4 61/34/4 +f 100/9/4 79/33/4 57/27/4 +f 33/26/6 77/9/6 78/6/6 +f 32/32/3 64/6/3 22/4/3 +f 91/4/9 111/32/9 58/5/9 +f 57/7/1 79/27/1 58/5/1 +f 63/5/3 32/32/3 5/22/3 +f 31/7/3 7/51/3 95/27/3 +f 7/51/3 28/34/3 95/27/3 +f 63/5/3 5/22/3 31/7/3 +f 95/27/3 63/5/3 31/7/3 +f 28/34/3 3/31/3 65/9/3 +f 95/27/3 28/34/3 65/9/3 +f 29/10/3 1/18/3 22/4/3 +f 3/31/3 29/10/3 65/9/3 +f 29/10/3 22/4/3 64/6/3 +f 91/6/5 78/10/5 77/26/5 +f 79/27/6 30/33/6 8/51/6 +f 19/7/6 6/22/6 58/5/6 +f 6/22/6 20/32/6 58/5/6 +f 79/27/6 8/51/6 19/7/6 +f 57/27/10 111/5/10 91/6/10 +f 110/27/3 61/9/3 62/6/3 +f 62/6/2 64/4/2 63/32/2 +f 61/26/5 65/9/5 64/6/5 +f 108/5/1 63/8/1 95/7/1 +f 110/33/4 95/27/4 65/9/4 +f 100/9/4 77/34/4 79/33/4 +f 33/26/6 4/31/6 21/34/6 +f 21/34/6 30/33/6 79/27/6 +f 21/34/6 79/27/6 77/9/6 +f 2/18/6 33/26/6 78/6/6 +f 33/26/6 21/34/6 77/9/6 +f 58/5/6 20/32/6 78/6/6 +f 20/32/6 2/18/6 78/6/6 +f 32/32/3 63/5/3 64/6/3 +g Chest_chest-side +usemtl chest-side +f 99/21/4 1/22/4 42/23/4 +f 7/4/5 73/24/5 46/25/5 +f 98/21/1 3/22/1 41/23/1 +f 45/20/1 82/9/1 2/31/1 +f 5/4/4 84/24/4 44/25/4 +f 106/5/6 110/4/6 74/6/6 +f 76/33/7 57/9/7 111/27/7 +f 73/19/4 110/10/4 112/24/4 +f 57/26/4 46/20/4 88/25/4 +f 5/22/5 40/23/5 97/21/5 +f 73/20/3 113/21/3 97/23/3 +f 84/20/3 114/21/3 99/23/3 +f 80/20/3 115/21/3 98/23/3 +f 40/23/6 88/19/6 46/20/6 +f 42/23/6 89/19/6 44/20/6 +f 41/23/6 86/19/6 45/20/6 +f 40/50/2 111/27/2 89/23/2 +f 97/41/2 108/5/2 106/8/2 +f 113/19/5 110/5/5 108/6/5 +f 85/10/1 113/19/1 84/24/1 +f 44/25/1 111/9/1 87/26/1 +f 111/33/8 90/9/8 87/27/8 +f 42/23/5 91/7/5 86/49/5 +f 111/27/4 86/20/4 91/9/4 +f 114/41/5 104/5/5 99/21/5 +f 62/32/6 85/6/6 104/5/6 +f 108/5/4 114/19/4 113/21/4 +f 82/34/3 100/27/3 83/33/3 +f 45/25/2 91/9/2 82/26/2 +f 43/49/4 83/27/4 100/7/4 +f 100/27/1 86/20/1 43/23/1 +f 62/6/2 80/24/2 81/10/2 +f 62/4/6 105/5/6 61/32/6 +f 105/5/4 115/41/4 61/8/4 +f 62/6/1 115/21/1 114/19/1 +f 111/9/5 88/23/5 89/20/5 +f 22/32/4 1/22/4 104/5/4 +f 1/22/4 2/51/4 42/23/4 +f 104/5/4 1/22/4 99/21/4 +f 2/51/4 20/34/4 90/27/4 +f 20/34/4 87/9/4 90/27/4 +f 85/6/4 32/4/4 22/32/4 +f 104/5/4 85/6/4 22/32/4 +f 2/51/4 90/27/4 42/23/4 +f 42/23/4 44/20/4 84/19/4 +f 42/23/4 84/19/4 99/21/4 +f 8/34/5 7/4/5 46/25/5 +f 7/4/5 31/18/5 74/10/5 +f 7/4/5 74/10/5 73/24/5 +f 75/26/5 19/31/5 8/34/5 +f 46/25/5 75/26/5 8/34/5 +f 41/23/1 45/20/1 80/19/1 +f 41/23/1 80/19/1 98/21/1 +f 4/51/1 33/33/1 83/27/1 +f 4/51/1 83/27/1 41/23/1 +f 81/6/1 29/4/1 105/5/1 +f 29/4/1 3/22/1 105/5/1 +f 3/22/1 4/51/1 41/23/1 +f 98/21/1 105/5/1 3/22/1 +f 2/31/1 1/18/1 45/20/1 +f 1/18/1 29/4/1 81/6/1 +f 1/18/1 81/6/1 80/19/1 +f 83/27/1 33/33/1 82/9/1 +f 33/33/1 2/31/1 82/9/1 +f 1/18/1 80/19/1 45/20/1 +f 6/34/4 5/4/4 44/25/4 +f 5/4/4 32/18/4 85/10/4 +f 5/4/4 85/10/4 84/24/4 +f 87/26/4 20/31/4 6/34/4 +f 44/25/4 87/26/4 6/34/4 +f 106/5/6 108/32/6 110/4/6 +f 76/33/3 75/34/3 57/9/3 +f 73/19/4 74/6/4 110/10/4 +f 57/26/4 75/9/4 46/20/4 +f 6/51/5 19/34/5 76/27/5 +f 19/34/5 75/9/5 76/27/5 +f 74/6/5 31/4/5 106/5/5 +f 31/4/5 5/22/5 106/5/5 +f 5/22/5 6/51/5 40/23/5 +f 6/51/5 76/27/5 40/23/5 +f 40/23/5 46/20/5 73/19/5 +f 97/21/5 106/5/5 5/22/5 +f 40/23/5 73/19/5 97/21/5 +f 73/20/3 112/19/3 113/21/3 +f 84/20/3 113/19/3 114/21/3 +f 80/20/3 114/19/3 115/21/3 +f 40/23/6 89/21/6 88/19/6 +f 42/23/6 86/21/6 89/19/6 +f 41/23/6 43/21/6 86/19/6 +f 40/50/11 76/7/11 111/27/11 +f 97/41/2 113/21/2 108/5/2 +f 113/19/5 112/21/5 110/5/5 +f 85/10/1 108/6/1 113/19/1 +f 44/25/1 89/20/1 111/9/1 +f 111/33/12 91/34/12 90/9/12 +f 42/23/5 90/27/5 91/7/5 +f 111/27/4 89/23/4 86/20/4 +f 114/41/5 62/8/5 104/5/5 +f 62/32/6 108/4/6 85/6/6 +f 108/5/4 62/6/4 114/19/4 +f 82/34/3 91/9/3 100/27/3 +f 45/25/2 86/20/2 91/9/2 +f 43/49/4 41/23/4 83/27/4 +f 100/27/1 91/9/1 86/20/1 +f 62/6/2 114/19/2 80/24/2 +f 62/4/6 81/6/6 105/5/6 +f 105/5/4 98/21/4 115/41/4 +f 62/6/1 61/5/1 115/21/1 +f 111/9/5 57/27/5 88/23/5 diff --git a/mods/everness/models/everness_chest_opened.obj b/mods/everness/models/everness_chest_opened.obj new file mode 100644 index 0000000..2740d04 --- /dev/null +++ b/mods/everness/models/everness_chest_opened.obj @@ -0,0 +1,608 @@ +# Blender 4.4.3 +# www.blender.org +mtllib everness_chest_opened.mtl +o Chest +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.062500 0.000000 -0.437500 +v 0.125000 0.125000 -0.500000 +v 0.062500 -0.125000 -0.437500 +v -0.125000 0.125000 -0.500000 +v -0.125000 0.125000 -0.437500 +v 0.437500 -0.500000 0.500000 +v -0.062500 0.000000 -0.500000 +v 0.062500 0.062500 -0.437500 +v 0.062500 -0.062500 -0.437500 +v 0.125000 0.125000 -0.437500 +v 0.437500 -0.500000 -0.500000 +v 0.062500 0.000000 -0.500000 +v -0.125000 -0.062500 -0.437500 +v 0.437500 0.125000 -0.500000 +v 0.500000 0.125000 0.437500 +v -0.500000 0.125000 -0.437500 +v -0.437500 0.125000 -0.437500 +v 0.437500 0.125000 0.500000 +v -0.500000 0.125000 0.437500 +v 0.500000 0.125000 -0.437500 +v 0.062500 -0.125000 -0.500000 +v 0.125000 -0.062500 -0.500000 +v 0.125000 -0.062500 -0.437500 +v -0.437500 0.125000 -0.500000 +v -0.125000 0.062500 -0.500000 +v -0.062500 -0.125000 -0.500000 +v -0.125000 -0.062500 -0.500000 +v 0.062500 0.000000 -0.437500 +v 0.437500 -0.437500 -0.437500 +v 0.437500 -0.500000 0.437500 +v -0.062500 0.062500 -0.437500 +v -0.062500 0.062500 -0.500000 +v -0.437500 -0.437500 -0.500000 +v -0.062500 -0.125000 -0.437500 +v 0.437500 -0.437500 -0.500000 +v 0.062500 -0.062500 -0.500000 +v 0.500000 -0.437500 -0.437500 +v 0.500000 -0.437500 0.437500 +v -0.437500 -0.500000 -0.437500 +v -0.437500 -0.500000 0.437500 +v 0.437500 -0.500000 -0.437500 +v -0.500000 -0.437500 0.437500 +v -0.500000 -0.437500 -0.437500 +v -0.437500 0.125000 0.437500 +v 0.437500 -0.437500 0.500000 +v 0.437500 0.125000 -0.437500 +v 0.437500 0.125000 0.437500 +v -0.437500 -0.437500 0.500000 +v -0.437500 -0.437500 0.437500 +v 0.062500 0.062500 -0.500000 +v -0.437500 -0.437500 -0.437500 +v -0.062500 -0.062500 -0.437500 +v -0.062500 -0.062500 -0.500000 +v 0.437500 -0.437455 0.437505 +v -0.500000 0.125000 -0.500000 +v 0.500000 0.125000 -0.500000 +v -0.500000 0.125000 0.500000 +v -0.500000 0.390165 0.765165 +v -0.500000 1.097272 0.058058 +v 0.500000 0.390165 0.765165 +v 0.500000 1.097272 0.058058 +v -0.125000 0.920495 -0.118718 +v 0.062500 0.876301 -0.074524 +v 0.125000 0.876301 -0.074524 +v 0.125000 0.920495 -0.118719 +v -0.374993 0.787913 -0.162913 +v -0.125000 0.876301 -0.074524 +v -0.437500 0.390165 0.765165 +v -0.062500 0.920495 -0.118718 +v -0.437500 1.097272 0.058058 +v -0.500000 0.434359 0.720971 +v 0.500000 1.053078 0.102252 +v 0.437500 0.390165 0.765165 +v 0.062500 0.920495 -0.118719 +v 0.125000 0.832107 -0.118719 +v 0.125000 0.876301 -0.162913 +v -0.437500 0.125000 0.500000 +v -0.437500 0.787913 -0.162913 +v -0.500000 0.169194 0.455806 +v 0.500000 0.787913 -0.162913 +v -0.437500 0.832107 -0.207107 +v -0.125000 0.876301 -0.162913 +v 0.062500 0.832107 -0.118719 +v -0.062500 0.876301 -0.074524 +v -0.437500 1.008884 0.058058 +v -0.437500 0.390165 0.676777 +v 0.437500 0.434359 0.720971 +v -0.437500 0.434359 0.720971 +v -0.437500 1.053078 0.102253 +v -0.437500 0.876301 -0.162912 +v -0.437500 1.053078 0.013864 +v 0.500000 0.832107 -0.118719 +v 0.500000 1.008883 0.058058 +v -0.500000 0.213388 0.500000 +v -0.500000 0.390165 0.676777 +v 0.437500 0.169194 0.544194 +v 0.437500 0.345971 0.720971 +v -0.437500 0.169194 0.455806 +v 0.437500 0.787913 -0.162913 +v 0.437500 0.169194 0.455806 +v 0.062500 0.876301 -0.162913 +v -0.125000 0.832107 -0.118718 +v 0.437500 1.053078 0.102252 +v 0.437500 0.876301 -0.162913 +v 0.500000 0.213388 0.500000 +v -0.500000 0.832107 -0.118718 +v -0.437500 0.169194 0.544194 +v -0.062500 0.876301 -0.162913 +v -0.437500 0.345971 0.720971 +v -0.500000 1.008884 0.058058 +v 0.500000 0.390165 0.676776 +v 0.437500 1.053078 0.013864 +v 0.437500 0.390165 0.676776 +v -0.062500 0.832107 -0.118718 +v 0.437500 1.008883 0.058058 +v 0.437500 0.832107 -0.118719 +v 0.437500 0.213388 0.500000 +v -0.437500 0.213388 0.500000 +v -0.437500 0.832107 -0.118718 +v -0.500000 0.832107 -0.207107 +v 0.500000 0.832107 -0.207107 +v 0.500000 0.125000 0.500000 +v -0.374993 0.125000 -0.374993 +v 0.374993 -0.437500 -0.374993 +v -0.374993 0.125000 0.374994 +v 0.374993 0.125000 -0.374993 +v 0.374993 0.125000 0.374993 +v -0.374993 -0.437500 0.374994 +v -0.374993 -0.437500 -0.374993 +v 0.374994 -0.437455 0.374998 +v 0.374993 0.125000 0.437500 +v -0.374993 0.125000 0.437500 +v 0.374568 -0.374869 -0.374568 +v -0.374568 -0.374869 0.374569 +v -0.374568 -0.374869 -0.374568 +v 0.374568 -0.374816 0.374573 +v -0.374993 0.898590 0.031891 +v -0.374993 0.363998 0.566483 +v 0.374993 0.363998 0.566483 +v 0.374993 0.898590 0.031891 +v 0.374993 0.745849 -0.120850 +v 0.374993 0.211257 0.413742 +v -0.374993 0.211257 0.413743 +v -0.374993 0.745849 -0.120849 +v 0.374993 0.787913 -0.162913 +vn -0.0000 -0.0000 -1.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0007 1.0000 -0.0001 +vn -0.0000 1.0000 0.0007 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 0.7071 0.7071 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 -0.7071 0.7071 +vn -0.0001 1.0000 -0.0001 +vn -0.0000 0.0001 -1.0000 +vn 0.0001 -1.0000 0.0001 +vn -0.0001 -0.0000 -1.0000 +vn -0.0001 1.0000 -0.0000 +vt 0.937500 1.000000 +vt 0.062500 0.937500 +vt 0.937500 0.937500 +vt -0.000000 0.062500 +vt -0.000000 0.937500 +vt 0.562500 0.500000 +vt 0.437500 0.562500 +vt 0.437500 0.500000 +vt 0.437500 0.437500 +vt 0.562500 0.437500 +vt 0.937500 0.062500 +vt 1.000000 0.937500 +vt 1.000000 0.062500 +vt 0.062500 0.062500 +vt 0.562500 0.375000 +vt 0.000000 1.000000 +vt 0.062500 1.000000 +vt 0.937500 0.000000 +vt 0.062500 0.000000 +vt 0.375000 0.437500 +vt 0.437500 0.625000 +vt 0.375000 0.500000 +vt 0.437500 0.375000 +vt 0.500000 0.437500 +vt 0.500000 0.375000 +vt 0.625000 0.500000 +vt 0.625000 0.625000 +vt 0.562500 0.625000 +vt 0.562500 0.562500 +vt 0.375000 0.562500 +vt 0.062500 0.625000 +vt -0.000000 0.625000 +vt 1.000000 0.625000 +vt 0.937500 0.625000 +vt 0.000000 0.625000 +vt 0.875000 0.625000 +vt 1.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.375000 0.625000 +vt -0.000000 0.000000 +vt 0.062500 0.000000 +vt 0.062500 0.062500 +vt 0.625000 0.687500 +vt 0.562500 0.687500 +vt 0.625000 0.750000 +vt 0.562500 0.750000 +vt 0.937500 0.687500 +vt 0.062500 0.687500 +vt 1.000000 0.687500 +vt 0.437500 0.687500 +vt 0.375000 0.687500 +vt 0.375000 0.750000 +vt 0.500000 0.687500 +vt 0.500000 0.625000 +vt -0.000000 0.687500 +vt -0.000000 0.562500 +vt 0.062500 0.562500 +vt 0.937500 0.562500 +vt 0.875000 0.125000 +vt 0.125000 0.062500 +vt 0.125000 0.937500 +vt 0.625000 0.437500 +vt 0.625000 0.562500 +vt 0.125000 0.625000 +vt 1.000000 -0.000000 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.437500 0.750000 +vt 0.875000 0.937500 +vt 0.125000 1.000000 +vt 0.875000 1.000000 +vt 1.000000 0.562500 +vt 0.875000 0.875000 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.125000 +vt 0.062500 0.125000 +vt 0.937500 0.375000 +s 0 +g Chest_chest-front +usemtl chest-front +f 5/6/1 12/7/1 32/8/1 +f 11/6/1 40/9/1 57/10/1 +f 33/14/1 55/11/1 38/15/1 +f 26/20/3 14/21/3 27/9/3 +f 13/8/4 26/20/4 27/22/4 +f 25/23/3 13/24/3 7/25/3 +f 25/23/4 38/10/4 30/15/4 +f 38/15/2 57/24/2 30/25/2 +f 17/26/4 57/10/4 56/6/4 +f 9/27/2 8/28/2 29/29/2 +f 5/6/6 16/9/6 11/10/6 +f 36/29/3 5/26/3 11/6/3 +f 54/7/4 35/28/4 36/29/4 +f 32/8/2 54/30/2 16/22/2 +f 33/14/6 37/18/6 55/11/6 +f 39/4/2 50/31/2 18/32/2 +f 37/11/3 21/33/3 55/13/3 +f 6/40/1 54/7/1 36/29/1 +f 126/41/9 22/42/9 104/43/9 +f 71/44/2 86/28/2 106/27/2 +f 73/45/10 71/46/10 88/47/10 +f 94/48/11 85/34/11 124/33/11 +f 125/35/11 105/51/11 80/52/11 +f 119/2/11 120/49/11 68/53/11 +f 106/44/10 94/34/10 123/48/10 +f 94/48/3 89/12/3 123/50/3 +f 73/54/3 118/28/3 112/55/3 +f 105/21/10 118/45/10 87/51/10 +f 67/54/2 105/21/2 87/55/2 +f 78/51/10 68/53/10 69/52/10 +f 69/52/3 79/21/3 80/40/3 +f 80/40/10 120/49/10 108/31/10 +f 119/2/2 108/56/2 120/49/2 +f 89/1/9 116/2/9 119/17/9 +f 83/13/9 82/3/9 102/11/9 +f 37/11/1 39/14/1 15/19/1 +f 48/1/6 23/37/6 81/3/6 +f 50/57/6 60/31/6 18/58/6 +f 28/33/6 20/59/6 21/34/6 +f 123/38/3 102/38/3 82/38/3 +f 118/38/12 106/38/12 70/38/12 +f 104/38/2 120/38/2 103/38/2 +f 121/38/11 102/38/11 122/38/11 +f 127/34/5 128/14/5 130/31/5 +f 145/49/12 141/3/12 148/48/12 +f 14/40/6 8/44/6 9/27/6 +f 5/6/1 35/29/1 12/7/1 +f 11/6/1 16/8/1 40/9/1 +f 40/9/1 25/23/1 30/15/1 +f 57/10/1 31/63/1 11/6/1 +f 31/63/1 29/64/1 11/6/1 +f 40/9/1 30/15/1 57/10/1 +f 29/64/1 36/29/1 11/6/1 +f 7/23/1 13/9/1 27/20/1 +f 27/20/1 14/40/1 50/31/1 +f 55/11/1 21/34/1 17/63/1 +f 21/34/1 9/27/1 17/63/1 +f 17/63/1 56/10/1 38/15/1 +f 27/20/1 50/31/1 33/14/1 +f 7/23/1 27/20/1 33/14/1 +f 55/11/1 17/63/1 38/15/1 +f 38/15/1 7/23/1 33/14/1 +f 26/20/3 6/40/3 14/21/3 +f 13/8/4 40/9/4 26/20/4 +f 25/23/3 40/9/3 13/24/3 +f 25/23/4 7/9/4 38/10/4 +f 38/15/2 56/10/2 57/24/2 +f 17/26/4 31/63/4 57/10/4 +f 29/29/2 31/10/2 17/63/2 +f 17/63/2 9/27/2 29/29/2 +f 5/6/6 32/8/6 16/9/6 +f 36/29/3 35/64/3 5/26/3 +f 54/7/4 12/21/4 35/28/4 +f 32/8/2 12/7/2 54/30/2 +f 33/14/6 39/19/6 37/18/6 +f 39/4/2 33/14/2 50/31/2 +f 37/11/3 28/34/3 21/33/3 +f 29/64/1 8/27/1 36/29/1 +f 8/27/1 6/40/1 36/29/1 +f 6/40/1 26/20/1 16/8/1 +f 26/20/1 40/9/1 16/8/1 +f 6/40/1 16/8/1 54/7/1 +f 103/67/9 84/68/9 104/43/9 +f 84/68/9 126/41/9 104/43/9 +f 71/44/2 66/45/2 86/28/2 +f 73/45/10 66/44/10 71/46/10 +f 124/33/11 63/37/11 95/3/11 +f 63/37/11 74/1/11 95/3/11 +f 95/3/11 94/48/11 124/33/11 +f 95/3/11 74/1/11 116/2/11 +f 74/1/11 65/16/11 116/2/11 +f 125/35/11 85/34/11 105/51/11 +f 85/34/11 94/48/11 86/44/11 +f 86/44/11 66/46/11 112/45/11 +f 66/46/11 73/47/11 112/45/11 +f 85/34/11 86/44/11 112/45/11 +f 105/51/11 85/34/11 112/45/11 +f 108/49/11 116/2/11 125/35/11 +f 116/2/11 65/16/11 125/35/11 +f 105/51/11 78/69/11 69/53/11 +f 105/51/11 69/53/11 80/52/11 +f 80/52/11 108/49/11 125/35/11 +f 87/51/11 118/45/11 88/47/11 +f 71/46/11 106/44/11 123/48/11 +f 67/69/11 87/51/11 88/47/11 +f 71/46/11 123/48/11 89/3/11 +f 67/69/11 88/47/11 89/3/11 +f 88/47/11 71/46/11 89/3/11 +f 120/49/11 79/52/11 68/53/11 +f 68/53/11 67/69/11 119/2/11 +f 119/2/11 67/69/11 89/3/11 +f 106/44/10 86/27/10 94/34/10 +f 94/48/3 95/3/3 89/12/3 +f 73/54/3 88/45/3 118/28/3 +f 105/21/10 112/28/10 118/45/10 +f 67/54/2 78/51/2 105/21/2 +f 78/51/10 67/69/10 68/53/10 +f 69/52/3 68/51/3 79/21/3 +f 80/40/10 79/52/10 120/49/10 +f 119/2/2 116/5/2 108/56/2 +f 89/1/9 95/3/9 116/2/9 +f 84/5/9 103/2/9 125/16/9 +f 103/2/9 149/62/9 125/16/9 +f 83/13/9 124/37/9 82/3/9 +f 124/37/9 85/1/9 82/3/9 +f 85/1/9 125/16/9 149/62/9 +f 85/1/9 149/62/9 70/70/9 +f 61/66/9 83/13/9 102/11/9 +f 22/19/9 81/18/9 102/11/9 +f 81/18/9 61/66/9 102/11/9 +f 102/11/9 104/14/9 22/19/9 +f 85/1/9 70/70/9 82/3/9 +f 39/14/1 18/31/1 60/35/1 +f 60/35/1 4/38/1 39/14/1 +f 4/38/1 15/19/1 39/14/1 +f 2/39/1 59/33/1 37/11/1 +f 59/33/1 28/34/1 37/11/1 +f 2/39/1 37/11/1 15/19/1 +f 22/2/6 126/5/6 51/17/6 +f 126/5/6 19/16/6 51/17/6 +f 51/17/6 135/71/6 22/2/6 +f 135/71/6 136/72/6 22/2/6 +f 23/37/6 61/12/6 81/3/6 +f 81/3/6 22/2/6 136/72/6 +f 136/72/6 48/1/6 81/3/6 +f 50/57/6 24/32/6 60/31/6 +f 28/33/6 59/73/6 20/59/6 +f 123/38/3 122/38/3 102/38/3 +f 79/38/12 68/38/12 67/38/12 +f 79/38/12 67/38/12 87/38/12 +f 103/38/12 120/38/12 149/38/12 +f 120/38/12 79/38/12 149/38/12 +f 79/38/12 87/38/12 149/38/12 +f 87/38/12 118/38/12 149/38/12 +f 118/38/12 88/38/12 106/38/12 +f 88/38/12 71/38/12 106/38/12 +f 106/38/12 123/38/12 70/38/12 +f 123/38/12 82/38/12 70/38/12 +f 70/38/12 149/38/12 118/38/12 +f 104/38/2 121/38/2 120/38/2 +f 121/38/11 104/38/11 102/38/11 +f 127/34/5 133/11/5 128/14/5 +f 145/49/12 144/2/12 141/3/12 +f 14/40/6 6/52/6 8/44/6 +g Chest_chest-top +usemtl chest-top +f 53/1/1 34/2/1 44/3/1 +f 33/4/2 34/2/2 58/5/2 +f 55/11/3 44/12/3 43/13/3 +f 3/16/4 10/17/4 34/2/4 +f 33/14/4 53/3/4 55/11/4 +f 33/14/5 43/18/5 45/19/5 +f 43/11/4 44/3/4 1/37/4 +f 93/11/10 107/14/10 74/18/10 +f 119/14/10 90/3/10 117/2/10 +f 117/2/11 92/1/11 91/17/11 +f 90/12/3 93/11/3 92/3/3 +f 117/2/2 107/4/2 119/14/2 +f 89/18/12 107/14/12 93/11/12 +f 72/1/10 91/2/10 92/3/10 +f 130/60/6 51/14/6 50/11/6 +f 136/2/6 131/61/6 129/62/6 +f 137/14/13 138/3/13 140/2/13 +f 142/3/9 144/14/9 143/2/9 +f 148/62/9 149/14/9 145/61/9 +f 104/11/9 102/3/9 146/60/9 +f 53/1/14 58/17/14 34/2/14 +f 33/4/2 45/14/2 34/2/2 +f 55/11/3 53/3/3 44/12/3 +f 34/2/4 45/14/4 4/38/4 +f 45/14/4 15/19/4 4/38/4 +f 4/38/4 3/16/4 34/2/4 +f 33/14/15 58/2/15 53/3/15 +f 33/14/5 55/11/5 43/18/5 +f 2/39/4 15/19/4 43/11/4 +f 15/19/4 45/14/4 43/11/4 +f 34/2/4 10/17/4 44/3/4 +f 10/17/4 1/37/4 44/3/4 +f 2/39/4 43/11/4 1/37/4 +f 107/14/10 91/2/10 76/4/10 +f 91/2/10 77/17/10 64/16/10 +f 76/4/10 91/2/10 64/16/10 +f 76/4/10 65/38/10 107/14/10 +f 65/38/10 74/18/10 107/14/10 +f 74/18/10 63/39/10 93/11/10 +f 63/39/10 75/12/10 93/11/10 +f 75/12/10 62/37/10 92/3/10 +f 62/37/10 72/1/10 92/3/10 +f 75/12/10 92/3/10 93/11/10 +f 119/14/10 89/11/10 90/3/10 +f 117/2/11 90/3/11 92/1/11 +f 90/12/3 89/13/3 93/11/3 +f 117/2/2 91/5/2 107/4/2 +f 89/18/12 119/19/12 107/14/12 +f 72/1/10 77/17/10 91/2/10 +f 21/3/6 48/2/6 127/74/6 +f 48/2/6 136/75/6 129/76/6 +f 127/74/6 48/2/6 129/76/6 +f 130/60/6 131/77/6 51/14/6 +f 131/77/6 135/78/6 51/14/6 +f 21/3/6 127/74/6 9/34/6 +f 127/74/6 130/60/6 9/34/6 +f 50/11/6 14/79/6 130/60/6 +f 14/79/6 9/34/6 130/60/6 +f 136/2/6 135/14/6 131/61/6 +f 137/14/6 139/11/6 138/3/6 +f 142/3/9 141/11/9 144/14/9 +f 148/62/9 70/2/9 149/14/9 +f 102/3/9 82/2/9 148/76/9 +f 82/2/9 70/75/9 148/76/9 +f 149/78/9 103/14/9 145/77/9 +f 103/14/9 104/11/9 146/60/9 +f 146/60/9 145/77/9 103/14/9 +f 102/3/9 148/76/9 147/74/9 +f 102/3/9 147/74/9 146/60/9 +g Chest_chest-side +usemtl chest-side +f 42/19/7 33/11/7 58/14/7 +f 33/13/5 24/34/5 50/33/5 +f 19/35/1 58/14/1 51/31/1 +f 22/33/2 58/11/2 49/13/2 +f 58/19/8 52/11/8 49/14/8 +f 81/31/3 53/4/3 48/32/3 +f 136/36/5 48/34/5 53/11/5 +f 46/18/6 55/14/6 47/19/6 +f 23/33/1 53/11/1 46/13/1 +f 21/32/5 47/14/5 55/4/5 +f 55/14/2 48/34/2 21/31/2 +f 58/11/3 50/31/3 51/34/3 +f 47/14/2 2/38/2 1/39/2 +f 52/14/5 1/38/5 10/18/5 +f 61/35/12 111/49/12 113/2/12 +f 96/50/3 84/33/3 125/34/3 +f 114/2/2 63/16/2 124/35/2 +f 98/48/2 83/34/2 61/33/2 +f 101/12/12 100/50/12 126/34/12 +f 97/3/9 117/17/9 119/1/9 +f 96/48/12 119/12/12 120/50/12 +f 64/16/3 126/35/3 115/2/3 +f 109/31/10 120/48/10 121/49/10 +f 111/31/10 121/48/10 122/49/10 +f 110/31/10 122/48/10 123/49/10 +f 115/5/11 121/49/11 117/2/11 +f 121/48/3 119/2/3 117/3/3 +f 100/50/2 117/3/2 121/48/2 +f 111/49/3 90/5/3 113/2/3 +f 90/17/9 101/3/9 113/2/9 +f 121/49/12 90/3/12 122/48/12 +f 90/3/11 98/50/11 99/12/11 +f 89/17/9 99/3/9 114/2/9 +f 89/5/12 110/49/12 123/56/12 +f 90/3/2 123/49/2 122/48/2 +f 3/38/3 4/39/3 42/14/3 +f 134/14/1 129/34/1 131/31/1 +f 129/34/3 133/14/3 127/31/3 +f 130/31/2 134/11/2 131/34/2 +f 144/2/2 146/48/2 143/3/2 +f 147/48/11 143/2/11 146/49/11 +f 148/49/3 142/3/3 147/48/3 +f 42/19/6 41/18/6 33/11/6 +f 33/13/5 41/11/5 24/34/5 +f 19/35/16 42/4/16 58/14/16 +f 22/33/2 51/34/2 58/11/2 +f 58/19/17 53/18/17 52/11/17 +f 81/31/3 52/14/3 53/4/3 +f 53/11/5 58/14/5 136/36/5 +f 58/14/5 51/31/5 135/65/5 +f 58/14/5 135/65/5 136/36/5 +f 46/18/6 53/11/6 55/14/6 +f 23/33/1 48/34/1 53/11/1 +f 21/32/5 20/31/5 47/14/5 +f 55/14/2 53/11/2 48/34/2 +f 58/11/3 33/14/3 50/31/3 +f 1/39/2 61/33/2 46/11/2 +f 61/33/2 23/34/2 46/11/2 +f 20/31/2 59/35/2 47/14/2 +f 59/35/2 2/38/2 47/14/2 +f 1/39/2 46/11/2 47/14/2 +f 52/14/5 81/31/5 61/35/5 +f 10/18/5 3/66/5 49/11/5 +f 3/66/5 126/33/5 49/11/5 +f 126/33/5 22/34/5 49/11/5 +f 52/14/5 61/35/5 1/38/5 +f 49/11/5 52/14/5 10/18/5 +f 72/17/12 62/16/12 113/2/12 +f 62/16/12 61/35/12 113/2/12 +f 81/31/12 22/34/12 100/48/12 +f 101/3/12 77/1/12 72/17/12 +f 113/2/12 101/3/12 72/17/12 +f 61/35/12 81/31/12 111/49/12 +f 81/31/12 100/48/12 111/49/12 +f 125/34/3 65/1/3 96/50/3 +f 65/1/3 76/37/3 97/12/3 +f 96/50/3 65/1/3 97/12/3 +f 124/35/2 83/34/2 110/49/2 +f 83/34/2 98/48/2 110/49/2 +f 99/3/2 75/1/2 114/2/2 +f 75/1/2 63/16/2 114/2/2 +f 124/35/2 110/49/2 114/2/2 +f 61/33/2 62/37/2 99/3/2 +f 62/37/2 75/1/2 99/3/2 +f 99/3/2 98/48/2 61/33/2 +f 126/34/12 64/1/12 101/12/12 +f 64/1/12 77/37/12 101/12/12 +f 100/50/12 22/33/12 126/34/12 +f 97/3/9 115/2/9 117/17/9 +f 96/48/12 97/3/12 119/12/12 +f 126/35/3 84/34/3 109/49/3 +f 84/34/3 96/48/3 109/49/3 +f 97/3/3 76/1/3 115/2/3 +f 76/1/3 64/16/3 115/2/3 +f 126/35/3 109/49/3 115/2/3 +f 109/31/10 96/34/10 120/48/10 +f 111/31/10 100/34/10 121/48/10 +f 110/31/10 98/34/10 122/48/10 +f 115/5/11 109/56/11 121/49/11 +f 121/48/3 120/49/3 119/2/3 +f 100/50/2 101/12/2 117/3/2 +f 111/49/3 122/56/3 90/5/3 +f 90/17/9 117/1/9 101/3/9 +f 121/49/12 117/2/12 90/3/12 +f 90/3/11 122/48/11 98/50/11 +f 89/17/9 90/1/9 99/3/9 +f 89/5/12 114/2/12 110/49/12 +f 90/3/2 89/2/2 123/49/2 +f 42/14/3 19/31/3 126/35/3 +f 4/39/3 60/33/3 41/11/3 +f 60/33/3 24/34/3 41/11/3 +f 42/14/3 126/35/3 3/38/3 +f 4/39/3 41/11/3 42/14/3 +f 134/14/1 132/11/1 129/34/1 +f 129/34/3 132/11/3 133/14/3 +f 130/31/2 128/14/2 134/11/2 +f 144/2/2 145/49/2 146/48/2 +f 147/48/11 142/3/11 143/2/11 +f 148/49/3 141/2/3 142/3/3 diff --git a/mods/everness/models/everness_chest_protected_closed.obj b/mods/everness/models/everness_chest_protected_closed.obj new file mode 100644 index 0000000..c5845a4 --- /dev/null +++ b/mods/everness/models/everness_chest_protected_closed.obj @@ -0,0 +1,8632 @@ +# Blender 4.4.3 +# www.blender.org +mtllib everness_chest_protected_closed.mtl +o Chest +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.062500 0.000000 -0.437500 +v -0.125000 0.250000 -0.500000 +v 0.062500 0.250000 -0.437500 +v 0.125000 0.250000 -0.437500 +v 0.125000 0.250000 -0.500000 +v 0.125000 0.125000 -0.500000 +v 0.062500 -0.125000 -0.437500 +v -0.125000 0.125000 -0.500000 +v -0.125000 0.125000 -0.437500 +v -0.125000 0.250000 -0.437500 +v 0.500000 -0.500000 -0.437500 +v 0.437500 -0.500000 0.500000 +v -0.437500 -0.500000 -0.500000 +v -0.437500 0.500000 0.500000 +v -0.062500 0.000000 -0.500000 +v -0.062500 0.250000 -0.500000 +v 0.062500 0.062500 -0.437500 +v 0.062500 -0.062500 -0.437500 +v 0.125000 0.125000 -0.437500 +v -0.437500 0.500000 -0.500000 +v -0.500000 0.500000 0.437500 +v 0.437500 -0.500000 -0.500000 +v 0.500000 0.500000 -0.437500 +v 0.437500 0.500000 0.500000 +v -0.500000 -0.500000 -0.437500 +v 0.062500 0.000000 -0.500000 +v -0.125000 -0.062500 -0.437500 +v 0.062500 0.250000 -0.500000 +v 0.125000 0.187500 -0.437500 +v 0.125000 0.187500 -0.500000 +v 0.437500 0.125000 -0.500000 +v 0.500000 0.125000 0.437500 +v -0.500000 0.125000 -0.437500 +v -0.437500 0.125000 0.500000 +v -0.437500 0.125000 -0.437500 +v 0.437500 0.125000 0.500000 +v -0.500000 0.125000 0.437500 +v 0.500000 0.125000 -0.437500 +v 0.062500 -0.125000 -0.500000 +v 0.125000 -0.062500 -0.500000 +v 0.125000 -0.062500 -0.437500 +v -0.437500 0.125000 -0.500000 +v -0.125000 0.062500 -0.500000 +v -0.125000 0.187500 -0.500000 +v 0.062500 0.187500 -0.437500 +v -0.062500 -0.125000 -0.500000 +v -0.125000 -0.062500 -0.500000 +v 0.062500 0.000000 -0.437500 +v 0.437500 -0.437500 -0.437500 +v 0.437500 -0.500000 0.437500 +v -0.062500 0.250000 -0.437500 +v -0.062500 0.062500 -0.437500 +v -0.437500 0.437500 -0.437500 +v -0.437500 0.437500 0.437500 +v 0.437500 0.500000 0.437500 +v -0.437500 0.500000 0.437500 +v -0.437500 0.500000 -0.437500 +v -0.062500 0.062500 -0.500000 +v -0.437500 0.187500 -0.500000 +v -0.437500 0.437500 -0.500000 +v -0.437500 -0.437500 -0.500000 +v -0.062500 -0.125000 -0.437500 +v 0.437500 -0.437500 -0.500000 +v 0.062500 -0.062500 -0.500000 +v 0.500000 0.187500 -0.437500 +v 0.500000 0.437500 -0.437500 +v 0.500000 -0.437500 -0.437500 +v 0.500000 -0.437500 0.437500 +v -0.437500 -0.500000 -0.437500 +v -0.437500 -0.500000 0.437500 +v 0.437500 -0.500000 -0.437500 +v -0.500000 0.187500 0.437500 +v -0.500000 0.437500 0.437500 +v -0.500000 -0.437500 0.437500 +v -0.500000 -0.437500 -0.437500 +v 0.437500 0.187500 0.500000 +v 0.437500 0.437500 0.500000 +v -0.437500 0.125000 0.437500 +v 0.437500 -0.437500 0.500000 +v 0.437500 0.125000 -0.437500 +v 0.437500 0.125000 0.437500 +v -0.437500 -0.437500 0.500000 +v -0.437500 -0.437500 0.437500 +v 0.062500 0.187500 -0.500000 +v 0.062500 0.062500 -0.500000 +v -0.125000 0.187500 -0.437500 +v 0.437500 0.500000 -0.437500 +v 0.437500 0.187500 -0.500000 +v 0.500000 0.187500 0.437500 +v -0.500000 0.187500 -0.437500 +v -0.437500 0.187500 0.500000 +v -0.437500 -0.437500 -0.437500 +v -0.062500 -0.062500 -0.437500 +v -0.062500 0.187500 -0.500000 +v -0.062500 -0.062500 -0.500000 +v -0.437500 0.437500 0.500000 +v -0.500000 0.437500 -0.437500 +v 0.500000 0.437500 0.437500 +v 0.437500 0.437500 -0.500000 +v 0.437500 0.437500 0.437500 +v -0.062500 0.187500 -0.437500 +v 0.437500 0.437500 -0.437500 +v 0.437500 -0.437455 0.437505 +v 0.437500 0.187500 -0.437500 +v 0.437500 0.187500 0.437500 +v -0.437500 0.187500 0.437500 +v -0.437500 0.187500 -0.437500 +v 0.031983 -0.040647 -0.446669 +v 0.092717 -0.147176 -0.470919 +v 0.111101 -0.125266 -0.526491 +v 0.057782 -0.028912 -0.433507 +v 0.059559 -0.007783 -0.530027 +v 0.118516 -0.135440 -0.457758 +v 0.065551 -0.045370 -0.508303 +v 0.056359 -0.056325 -0.480517 +v 0.082158 -0.044589 -0.467356 +v 0.085358 0.003952 -0.516865 +v 0.091350 -0.033634 -0.495142 +v 0.108576 -0.174995 -0.477250 +v 0.134784 -0.139727 -0.560065 +v 0.134393 -0.163289 -0.464095 +v 0.120293 -0.114312 -0.554278 +v 0.101909 -0.136221 -0.498705 +v 0.127708 -0.124485 -0.485544 +v 0.160600 -0.128021 -0.546911 +v 0.146092 -0.102576 -0.541116 +v 0.138324 -0.086117 -0.466319 +v 0.200505 -0.192756 -0.493582 +v 0.148809 -0.216060 -0.519862 +v 0.147516 -0.075163 -0.494105 +v 0.060926 -0.121324 -0.505804 +v 0.208404 -0.179586 -0.520798 +v 0.136900 -0.113531 -0.513330 +v 0.070118 -0.110370 -0.533590 +v 0.216066 -0.218430 -0.501420 +v 0.138544 -0.253424 -0.540851 +v 0.224164 -0.205591 -0.528735 +v 0.122960 -0.227712 -0.533002 +v 0.146642 -0.240585 -0.568167 +v 0.130859 -0.214543 -0.560219 +v 0.124839 -0.202606 -0.484660 +v 0.184202 -0.303128 -0.511975 +v 0.203865 -0.283544 -0.567976 +v 0.150676 -0.190935 -0.471515 +v 0.149404 -0.164540 -0.566737 +v 0.209978 -0.291349 -0.498806 +v 0.156707 -0.202891 -0.547078 +v 0.174657 -0.204408 -0.506722 +v 0.175242 -0.152870 -0.553592 +v 0.182556 -0.191238 -0.533938 +v 0.196775 -0.327422 -0.514748 +v 0.229740 -0.304738 -0.599529 +v 0.222506 -0.315558 -0.501568 +v 0.213697 -0.273752 -0.595976 +v 0.219809 -0.281557 -0.526806 +v 0.255472 -0.292874 -0.586349 +v 0.239472 -0.261972 -0.582807 +v 0.229640 -0.271765 -0.554806 +v 0.231154 -0.243985 -0.508358 +v 0.285705 -0.353409 -0.517899 +v 0.233382 -0.375214 -0.544225 +v 0.239935 -0.232305 -0.535982 +v 0.153710 -0.279110 -0.547825 +v 0.297515 -0.347543 -0.546231 +v 0.194034 -0.293336 -0.539976 +v 0.162490 -0.267430 -0.575448 +v 0.298280 -0.383683 -0.519300 +v 0.218698 -0.413766 -0.558680 +v 0.309980 -0.377559 -0.547623 +v 0.207220 -0.386117 -0.557387 +v 0.271353 -0.358445 -0.559393 +v 0.230398 -0.407642 -0.587003 +v 0.219029 -0.380250 -0.585719 +v 0.209033 -0.352952 -0.515589 +v 0.254026 -0.464116 -0.518746 +v 0.234828 -0.341223 -0.502412 +v 0.244456 -0.335363 -0.600589 +v 0.280604 -0.454195 -0.505642 +v 0.245191 -0.369348 -0.572556 +v 0.259543 -0.364312 -0.531062 +v 0.270251 -0.323634 -0.587412 +v 0.262426 -0.488555 -0.516612 +v 0.304351 -0.489482 -0.600460 +v 0.288634 -0.477549 -0.503629 +v 0.292170 -0.453986 -0.603784 +v 0.266740 -0.460740 -0.547092 +v 0.293319 -0.450819 -0.533988 +v 0.330559 -0.478476 -0.587477 +v 0.318749 -0.444066 -0.590680 +v 0.309745 -0.413029 -0.520773 +v 0.341871 -0.508442 -0.501275 +v 0.321703 -0.407572 -0.549124 +v 0.229689 -0.441904 -0.560096 +v 0.359598 -0.520736 -0.523884 +v 0.306034 -0.447442 -0.562334 +v 0.241647 -0.436447 -0.588448 +v 0.279455 -0.457363 -0.575438 +v 0.346415 -0.524114 -0.485171 +v 0.274109 -0.577808 -0.511208 +v 0.365578 -0.541354 -0.502838 +v 0.267694 -0.555695 -0.533740 +v 0.334872 -0.536487 -0.534706 +v 0.293273 -0.595047 -0.528874 +v 0.285421 -0.567989 -0.556349 +v 0.310147 -0.552238 -0.545528 +v 0.269208 -0.509662 -0.510500 +v 0.282944 -0.559509 -0.447639 +v 0.294727 -0.496513 -0.498152 +v 0.316649 -0.527717 -0.589319 +v 0.306517 -0.539242 -0.444448 +v 0.292419 -0.539944 -0.522919 +v 0.317145 -0.524193 -0.512097 +v 0.342168 -0.514568 -0.576971 +v 0.281748 -0.559876 -0.426539 +v 0.342075 -0.630486 -0.413728 +v 0.305471 -0.539538 -0.426151 +v 0.344488 -0.629534 -0.457533 +v 0.303459 -0.582851 -0.450937 +v 0.365797 -0.610147 -0.413340 +v 0.368060 -0.609268 -0.454343 +v 0.347546 -0.585926 -0.451045 +v 0.349792 -0.536559 -0.465703 +v 0.341031 -0.529598 -0.368226 +v 0.292931 -0.569314 -0.364316 +v 0.369917 -0.557445 -0.477337 +v 0.278642 -0.594629 -0.484536 +v 0.360253 -0.551832 -0.357609 +v 0.327031 -0.562584 -0.447747 +v 0.298767 -0.615514 -0.496170 +v 0.323973 -0.606192 -0.454235 +v 0.335573 -0.519955 -0.338899 +v 0.263442 -0.579563 -0.333140 +v 0.354810 -0.542216 -0.328366 +v 0.268881 -0.589171 -0.362361 +v 0.316981 -0.549456 -0.366271 +v 0.336203 -0.571690 -0.355655 +v 0.282679 -0.601824 -0.322607 +v 0.288103 -0.611406 -0.351745 +v 0.278414 -0.555097 -0.402001 +v 0.257893 -0.520813 -0.280385 +v 0.297640 -0.567327 -0.267625 +v 0.302347 -0.535042 -0.403260 +v 0.337039 -0.623411 -0.375820 +v 0.281698 -0.500571 -0.280751 +v 0.312153 -0.591548 -0.353700 +v 0.360972 -0.603355 -0.377079 +v 0.254247 -0.516772 -0.247247 +v 0.314480 -0.587269 -0.233419 +v 0.277972 -0.496435 -0.246910 +v 0.317513 -0.590584 -0.261244 +v 0.338205 -0.566932 -0.233082 +v 0.341319 -0.570343 -0.261610 +v 0.330121 -0.510639 -0.307832 +v 0.315220 -0.493342 -0.180007 +v 0.349610 -0.533324 -0.298767 +v 0.258273 -0.570722 -0.303720 +v 0.335288 -0.516832 -0.175309 +v 0.277766 -0.544070 -0.274005 +v 0.301572 -0.523828 -0.274371 +v 0.321445 -0.547086 -0.267991 +v 0.277761 -0.593406 -0.294655 +v 0.311800 -0.490022 -0.149162 +v 0.240657 -0.551062 -0.150467 +v 0.331862 -0.513506 -0.144411 +v 0.244079 -0.554385 -0.181337 +v 0.260719 -0.574546 -0.145717 +v 0.264147 -0.577875 -0.176639 +v 0.251044 -0.513741 -0.216216 +v 0.237604 -0.500743 -0.092270 +v 0.274757 -0.493393 -0.215762 +v 0.311309 -0.584270 -0.202689 +v 0.261318 -0.480397 -0.091836 +v 0.287861 -0.557527 -0.176195 +v 0.267793 -0.534038 -0.180894 +v 0.291506 -0.513690 -0.180450 +v 0.335021 -0.563921 -0.202235 +v 0.311574 -0.537180 -0.175752 +v 0.234573 -0.497890 -0.060628 +v 0.295033 -0.568604 -0.049096 +v 0.258287 -0.477542 -0.060188 +v 0.297937 -0.571338 -0.079413 +v 0.257715 -0.524275 -0.087985 +v 0.318748 -0.548257 -0.048656 +v 0.321652 -0.550991 -0.078980 +v 0.308406 -0.486724 -0.118202 +v 0.297045 -0.476158 0.006461 +v 0.249602 -0.516839 0.005779 +v 0.328484 -0.510224 -0.113599 +v 0.237261 -0.547763 -0.119498 +v 0.317263 -0.499789 0.009519 +v 0.281430 -0.503928 -0.087551 +v 0.301541 -0.527460 -0.083265 +v 0.257340 -0.571263 -0.114895 +v 0.277826 -0.547807 -0.083699 +v 0.294992 -0.474041 0.037113 +v 0.223760 -0.534992 0.037099 +v 0.315217 -0.497678 0.040070 +v 0.225880 -0.537180 0.005438 +v 0.273323 -0.496499 0.006120 +v 0.293542 -0.520130 0.009178 +v 0.243985 -0.558630 0.040056 +v 0.246099 -0.560811 0.008496 +v 0.269820 -0.540470 0.008837 +v 0.231815 -0.495368 -0.028893 +v 0.224010 -0.486452 0.097421 +v 0.255528 -0.475020 -0.028444 +v 0.292398 -0.566194 -0.018770 +v 0.247772 -0.466157 0.097127 +v 0.316111 -0.545846 -0.018321 +v 0.222761 -0.484734 0.129387 +v 0.283599 -0.555872 0.134601 +v 0.246509 -0.464421 0.129434 +v 0.284773 -0.557489 0.104547 +v 0.307347 -0.535559 0.134648 +v 0.308534 -0.537194 0.104253 +v 0.288280 -0.513515 0.101878 +v 0.293247 -0.471758 0.067902 +v 0.288092 -0.467165 0.196515 +v 0.240703 -0.507810 0.193606 +v 0.313482 -0.495409 0.070681 +v 0.221967 -0.532649 0.068717 +v 0.308427 -0.490892 0.196765 +v 0.244265 -0.510131 0.099796 +v 0.268026 -0.489836 0.099502 +v 0.242202 -0.556300 0.071496 +v 0.264519 -0.533810 0.102172 +v 0.286654 -0.468551 0.229555 +v 0.215692 -0.529395 0.222386 +v 0.307028 -0.492237 0.228913 +v 0.217008 -0.528133 0.192151 +v 0.264397 -0.487487 0.195060 +v 0.284733 -0.511215 0.195310 +v 0.236066 -0.553082 0.221744 +v 0.237343 -0.551860 0.192402 +v 0.261038 -0.531537 0.193856 +v 0.221589 -0.483894 0.161413 +v 0.216201 -0.495566 0.292061 +v 0.245314 -0.463565 0.162092 +v 0.282510 -0.555090 0.164376 +v 0.239712 -0.475837 0.297940 +v 0.306234 -0.534762 0.165054 +v 0.215170 -0.505079 0.323767 +v 0.277009 -0.572547 0.303438 +v 0.238640 -0.485715 0.330892 +v 0.277879 -0.564452 0.276581 +v 0.300478 -0.553183 0.310564 +v 0.301390 -0.544723 0.282460 +v 0.280830 -0.521761 0.287620 +v 0.285100 -0.471830 0.264033 +v 0.280789 -0.508257 0.388878 +v 0.233798 -0.547377 0.375925 +v 0.305562 -0.495301 0.261390 +v 0.214350 -0.532161 0.252052 +v 0.301355 -0.531114 0.383296 +v 0.236760 -0.518528 0.286901 +v 0.260271 -0.498799 0.292780 +v 0.234812 -0.555632 0.249409 +v 0.257320 -0.541490 0.281741 +v 0.279562 -0.513790 0.414273 +v 0.208742 -0.573913 0.401674 +v 0.299966 -0.537352 0.412022 +v 0.210302 -0.566936 0.369449 +v 0.229146 -0.597476 0.399423 +v 0.230868 -0.589793 0.363868 +v 0.254364 -0.570234 0.370344 +v 0.214239 -0.515360 0.353458 +v 0.208179 -0.528416 0.459570 +v 0.247671 -0.574931 0.473100 +v 0.237701 -0.496077 0.360825 +v 0.276095 -0.582629 0.332536 +v 0.232242 -0.508583 0.457522 +v 0.257293 -0.527817 0.382401 +v 0.299557 -0.563346 0.339903 +v 0.277860 -0.550674 0.376820 +v 0.205603 -0.520979 0.485025 +v 0.263727 -0.587579 0.516251 +v 0.229889 -0.501779 0.480768 +v 0.267416 -0.598189 0.479865 +v 0.227925 -0.551674 0.466335 +v 0.288013 -0.568379 0.511994 +v 0.291479 -0.578355 0.477818 +v 0.278042 -0.515419 0.438285 +v 0.267296 -0.481313 0.530342 +v 0.298150 -0.539228 0.440602 +v 0.206606 -0.576054 0.435208 +v 0.285596 -0.499385 0.548093 +v 0.251988 -0.531840 0.464287 +v 0.271733 -0.555098 0.471052 +v 0.226715 -0.599862 0.437525 +v 0.264315 -0.465504 0.546407 +v 0.187815 -0.506663 0.581659 +v 0.281965 -0.480101 0.567666 +v 0.192348 -0.530804 0.557220 +v 0.242314 -0.497810 0.539301 +v 0.260613 -0.515882 0.557052 +v 0.205465 -0.521260 0.602918 +v 0.210648 -0.548876 0.574971 +v 0.235631 -0.532379 0.566011 +v 0.202449 -0.510268 0.509163 +v 0.190483 -0.431516 0.574469 +v 0.224191 -0.446519 0.624916 +v 0.227001 -0.491981 0.502889 +v 0.259212 -0.572200 0.550774 +v 0.216718 -0.424383 0.559060 +v 0.217331 -0.514307 0.548260 +v 0.283764 -0.553913 0.544500 +v 0.188812 -0.403995 0.582376 +v 0.238949 -0.419732 0.660015 +v 0.215163 -0.398710 0.566430 +v 0.241045 -0.454022 0.650140 +v 0.233572 -0.431885 0.584284 +v 0.265300 -0.414447 0.644069 +v 0.267280 -0.446889 0.634731 +v 0.261740 -0.446469 0.559169 +v 0.256051 -0.346514 0.582512 +v 0.202972 -0.348044 0.615476 +v 0.278902 -0.457450 0.582864 +v 0.183919 -0.477814 0.601007 +v 0.272528 -0.346100 0.609063 +v 0.207337 -0.439018 0.599692 +v 0.250426 -0.439387 0.609508 +v 0.201081 -0.488795 0.624702 +v 0.255502 -0.319998 0.581004 +v 0.175747 -0.315744 0.630097 +v 0.271922 -0.316893 0.607411 +v 0.176433 -0.348809 0.631957 +v 0.245988 -0.346865 0.625544 +v 0.192167 -0.312639 0.656504 +v 0.192909 -0.348395 0.658507 +v 0.187470 -0.376352 0.587268 +v 0.185868 -0.263185 0.575729 +v 0.213928 -0.373262 0.570928 +v 0.237205 -0.383842 0.666385 +v 0.212460 -0.267809 0.559979 +v 0.219449 -0.347630 0.642026 +v 0.229512 -0.347279 0.598994 +v 0.263663 -0.380752 0.650045 +v 0.186323 -0.234268 0.566915 +v 0.235600 -0.210746 0.643123 +v 0.212902 -0.239780 0.551431 +v 0.235102 -0.242496 0.652782 +v 0.262178 -0.216259 0.627639 +v 0.261694 -0.247120 0.637032 +v 0.255315 -0.293030 0.576658 +v 0.257485 -0.178930 0.541392 +v 0.271718 -0.287718 0.602721 +v 0.175519 -0.283272 0.624892 +v 0.273911 -0.171031 0.566776 +v 0.202279 -0.256289 0.601413 +v 0.228871 -0.260913 0.585663 +v 0.245283 -0.254016 0.611348 +v 0.191923 -0.277961 0.650955 +v 0.218691 -0.249392 0.627097 +v 0.258481 -0.148241 0.531555 +v 0.178735 -0.131693 0.577986 +v 0.274883 -0.141076 0.557171 +v 0.177777 -0.161221 0.587458 +v 0.230916 -0.173028 0.556748 +v 0.247342 -0.165128 0.582132 +v 0.195137 -0.124528 0.603603 +v 0.194203 -0.153321 0.612842 +v 0.187028 -0.204957 0.556980 +v 0.190976 -0.080754 0.520779 +v 0.213596 -0.210890 0.541635 +v 0.236328 -0.180459 0.632864 +v 0.217611 -0.084605 0.504894 +v 0.220772 -0.159224 0.597487 +v 0.204347 -0.167124 0.572103 +v 0.262896 -0.186392 0.617519 +v 0.191946 -0.047923 0.515331 +v 0.240748 -0.039554 0.594939 +v 0.218614 -0.050620 0.499266 +v 0.239929 -0.067160 0.599569 +v 0.207294 -0.076223 0.547042 +v 0.267416 -0.042252 0.578873 +v 0.266564 -0.071010 0.583684 +v 0.259525 -0.116553 0.522675 +v 0.263278 0.016948 0.506571 +v 0.209824 0.017928 0.538944 +v 0.275890 -0.110533 0.548608 +v 0.179711 -0.102107 0.569687 +v 0.279449 0.016101 0.533299 +v 0.233929 -0.080073 0.531158 +v 0.250247 -0.075542 0.557421 +v 0.196076 -0.096087 0.595620 +v 0.223612 -0.071691 0.573305 +v 0.264232 0.050295 0.508141 +v 0.183975 0.049100 0.556580 +v 0.280355 0.047775 0.534792 +v 0.183097 0.018418 0.555130 +v 0.200097 0.046580 0.583231 +v 0.199268 0.017570 0.581857 +v 0.192798 -0.014600 0.512489 +v 0.196906 0.117439 0.522158 +v 0.228955 0.106822 0.574754 +v 0.219498 -0.016106 0.496322 +v 0.241451 -0.011814 0.592578 +v 0.223707 0.119209 0.506184 +v 0.225995 0.017081 0.565671 +v 0.236551 0.017438 0.522757 +v 0.268151 -0.013321 0.576410 +v 0.252722 0.016591 0.549485 +v 0.198243 0.149138 0.528522 +v 0.246209 0.130646 0.606921 +v 0.225060 0.151297 0.512624 +v 0.244979 0.101513 0.601053 +v 0.212930 0.112130 0.548456 +v 0.239731 0.113900 0.532483 +v 0.273026 0.132805 0.591023 +v 0.271780 0.103283 0.585079 +v 0.255755 0.108591 0.558781 +v 0.265319 0.083242 0.511514 +v 0.270716 0.208404 0.536623 +v 0.217080 0.204032 0.568409 +v 0.281391 0.079207 0.538008 +v 0.184986 0.079787 0.559720 +v 0.286690 0.201912 0.562685 +v 0.201058 0.075752 0.586214 +v 0.272175 0.238014 0.542920 +v 0.191781 0.232677 0.590852 +v 0.288179 0.232140 0.569110 +v 0.190262 0.201846 0.584302 +v 0.243898 0.206218 0.552516 +v 0.259872 0.199726 0.578578 +v 0.207786 0.226803 0.617042 +v 0.206237 0.195354 0.610365 +v 0.233055 0.197540 0.594472 +v 0.199652 0.180150 0.535437 +v 0.205433 0.298585 0.557443 +v 0.226476 0.182455 0.519570 +v 0.247563 0.160425 0.613568 +v 0.232150 0.298694 0.541232 +v 0.274387 0.162731 0.597702 +v 0.206769 0.327188 0.558967 +v 0.255490 0.324376 0.639013 +v 0.233430 0.326112 0.542701 +v 0.253864 0.289498 0.637199 +v 0.248293 0.295665 0.567818 +v 0.282151 0.323300 0.622747 +v 0.280580 0.289607 0.620988 +v 0.264437 0.292636 0.594403 +v 0.273615 0.267107 0.548080 +v 0.278677 0.379917 0.548910 +v 0.225575 0.387374 0.581017 +v 0.289678 0.262399 0.574470 +v 0.193326 0.263868 0.596372 +v 0.295116 0.383743 0.575210 +v 0.221577 0.295556 0.584028 +v 0.209388 0.259161 0.622762 +v 0.237720 0.292527 0.610614 +v 0.279671 0.407799 0.542623 +v 0.200136 0.422194 0.590121 +v 0.296181 0.413557 0.568524 +v 0.199024 0.391103 0.597071 +v 0.216646 0.427952 0.616021 +v 0.215463 0.394929 0.623371 +v 0.242014 0.391200 0.607317 +v 0.208014 0.355517 0.558234 +v 0.211823 0.464604 0.530483 +v 0.234618 0.353126 0.542015 +v 0.257042 0.359753 0.638030 +v 0.238245 0.456946 0.515657 +v 0.252126 0.383646 0.564964 +v 0.283646 0.357361 0.621811 +v 0.268565 0.387471 0.591264 +v 0.212428 0.487436 0.517754 +v 0.262718 0.530657 0.584025 +v 0.238794 0.477666 0.504118 +v 0.261825 0.496894 0.602914 +v 0.228490 0.475367 0.554627 +v 0.254912 0.467709 0.539801 +v 0.289084 0.520887 0.570389 +v 0.288247 0.489235 0.588089 +v 0.271579 0.478472 0.563945 +v 0.280568 0.434659 0.535056 +v 0.282503 0.517109 0.478553 +v 0.229907 0.544795 0.497876 +v 0.297156 0.442781 0.560263 +v 0.201164 0.453036 0.581385 +v 0.299384 0.538555 0.493774 +v 0.217752 0.461159 0.606593 +v 0.245158 0.486131 0.578771 +v 0.282506 0.530282 0.456569 +v 0.203610 0.575440 0.479489 +v 0.299386 0.553846 0.468246 +v 0.203609 0.558638 0.507537 +v 0.220490 0.599004 0.491166 +v 0.220489 0.580083 0.522758 +v 0.212830 0.506932 0.501980 +v 0.212185 0.549641 0.413351 +v 0.239150 0.494897 0.490190 +v 0.263361 0.561890 0.558684 +v 0.238593 0.533021 0.411632 +v 0.246788 0.566240 0.513097 +v 0.256205 0.530952 0.488214 +v 0.289681 0.549855 0.546894 +v 0.273086 0.552397 0.503435 +v 0.211333 0.548866 0.386672 +v 0.261033 0.627930 0.378434 +v 0.237811 0.532278 0.387207 +v 0.262238 0.628853 0.416404 +v 0.228870 0.576045 0.414369 +v 0.255277 0.559425 0.412649 +v 0.287511 0.611342 0.378969 +v 0.288646 0.612232 0.414685 +v 0.271962 0.585828 0.413667 +v 0.282256 0.539120 0.434114 +v 0.279227 0.534856 0.323654 +v 0.226232 0.567924 0.321585 +v 0.299076 0.564594 0.440799 +v 0.203263 0.587421 0.448819 +v 0.295785 0.561226 0.320995 +v 0.220084 0.612895 0.455505 +v 0.245554 0.602449 0.415386 +v 0.278853 0.533007 0.290584 +v 0.199384 0.582733 0.289496 +v 0.295431 0.559481 0.289668 +v 0.199735 0.584458 0.320550 +v 0.252730 0.551390 0.322619 +v 0.269287 0.577759 0.319961 +v 0.215963 0.609207 0.288579 +v 0.216292 0.610827 0.317891 +v 0.242790 0.594293 0.318926 +v 0.210416 0.545350 0.356801 +v 0.209276 0.537168 0.229051 +v 0.242434 0.590041 0.225704 +v 0.236920 0.528851 0.358169 +v 0.260017 0.624087 0.345431 +v 0.235765 0.520632 0.230255 +v 0.286521 0.607588 0.346799 +v 0.209482 0.534778 0.198368 +v 0.259228 0.613980 0.191932 +v 0.235968 0.518279 0.200045 +v 0.259013 0.616478 0.224031 +v 0.285715 0.597481 0.193610 +v 0.285503 0.599942 0.225235 +v 0.278774 0.532173 0.259845 +v 0.279869 0.522194 0.137974 +v 0.226905 0.555125 0.133901 +v 0.295352 0.558642 0.258783 +v 0.199303 0.581869 0.257907 +v 0.296452 0.548584 0.135712 +v 0.225855 0.563604 0.227378 +v 0.252344 0.547069 0.228581 +v 0.268923 0.573505 0.226908 +v 0.215881 0.608338 0.256845 +v 0.280445 0.519305 0.106358 +v 0.200989 0.568753 0.100826 +v 0.297020 0.545733 0.104521 +v 0.200423 0.571591 0.131864 +v 0.253387 0.538660 0.135937 +v 0.217564 0.595182 0.098988 +v 0.217006 0.597982 0.129602 +v 0.209830 0.531863 0.167460 +v 0.212139 0.522285 0.040374 +v 0.245232 0.575300 0.039656 +v 0.236313 0.515392 0.169451 +v 0.259585 0.610998 0.160308 +v 0.238642 0.505754 0.041287 +v 0.243488 0.581516 0.131638 +v 0.286067 0.594528 0.162298 +v 0.269970 0.565050 0.133675 +v 0.212723 0.522004 0.008081 +v 0.262314 0.601547 0.009705 +v 0.239237 0.505467 0.008397 +v 0.261779 0.601808 0.039297 +v 0.288828 0.585011 0.010022 +v 0.288282 0.585276 0.040210 +v 0.271736 0.558768 0.040569 +v 0.281069 0.517025 0.074261 +v 0.283501 0.518915 -0.056606 +v 0.230417 0.551824 -0.054285 +v 0.297631 0.543500 0.073093 +v 0.201589 0.566556 0.069926 +v 0.299983 0.545284 -0.053515 +v 0.228686 0.548793 0.040015 +v 0.255189 0.532261 0.040928 +v 0.218151 0.593030 0.068758 +v 0.284223 0.523085 -0.089253 +v 0.204551 0.572183 -0.083700 +v 0.300677 0.549294 -0.084912 +v 0.203875 0.568278 -0.053125 +v 0.221006 0.598393 -0.079359 +v 0.220357 0.594647 -0.050034 +v 0.246899 0.578193 -0.051194 +v 0.213296 0.522926 -0.024537 +v 0.216208 0.540809 -0.152487 +v 0.239823 0.506411 -0.024919 +v 0.262825 0.602361 -0.019432 +v 0.242777 0.524525 -0.154832 +v 0.256959 0.535369 -0.055446 +v 0.289352 0.585846 -0.019813 +v 0.273441 0.561739 -0.052354 +v 0.216955 0.546187 -0.182521 +v 0.266297 0.624672 -0.168571 +v 0.243516 0.529848 -0.184541 +v 0.265507 0.618987 -0.136778 +v 0.259210 0.550585 -0.149595 +v 0.292858 0.608332 -0.170591 +v 0.292076 0.602704 -0.139123 +v 0.275643 0.576644 -0.144359 +v 0.284998 0.528513 -0.121048 +v 0.287768 0.546250 -0.239974 +v 0.234716 0.579283 -0.239255 +v 0.301435 0.554599 -0.115953 +v 0.205297 0.577406 -0.114246 +v 0.304279 0.572731 -0.238327 +v 0.232641 0.566868 -0.147251 +v 0.221733 0.603491 -0.109150 +v 0.249074 0.592928 -0.142014 +v 0.288245 0.546867 -0.268700 +v 0.208718 0.596468 -0.270748 +v 0.304787 0.573379 -0.268937 +v 0.208190 0.595800 -0.238896 +v 0.261242 0.562767 -0.239614 +v 0.277753 0.589248 -0.237967 +v 0.225259 0.622980 -0.270986 +v 0.224701 0.622281 -0.237249 +v 0.217625 0.550301 -0.211872 +v 0.220501 0.550642 -0.333794 +v 0.253501 0.603713 -0.332958 +v 0.244170 0.533862 -0.213176 +v 0.267055 0.629322 -0.201806 +v 0.246980 0.534149 -0.331948 +v 0.251227 0.605765 -0.237608 +v 0.293600 0.612883 -0.203110 +v 0.222965 0.550639 -0.366850 +v 0.272218 0.630266 -0.362083 +v 0.249423 0.534146 -0.364725 +v 0.270001 0.630249 -0.332540 +v 0.237001 0.577178 -0.333376 +v 0.263480 0.560684 -0.331530 +v 0.298676 0.613774 -0.359957 +v 0.296479 0.613756 -0.330694 +v 0.288687 0.545423 -0.298470 +v 0.298306 0.544674 -0.421737 +v 0.305238 0.571918 -0.299260 +v 0.209204 0.594944 -0.302844 +v 0.314772 0.571209 -0.420587 +v 0.279980 0.587220 -0.331112 +v 0.225755 0.621439 -0.303634 +v 0.301141 0.543520 -0.450887 +v 0.222194 0.592912 -0.461697 +v 0.317784 0.569959 -0.451632 +v 0.219176 0.594159 -0.430602 +v 0.271929 0.561169 -0.424692 +v 0.288395 0.587704 -0.423541 +v 0.238837 0.619351 -0.462442 +v 0.235641 0.620695 -0.429451 +v 0.225974 0.551073 -0.398521 +v 0.234043 0.540698 -0.503576 +v 0.267905 0.588249 -0.525903 +v 0.252398 0.534577 -0.396038 +v 0.275158 0.630693 -0.392983 +v 0.260285 0.524821 -0.497590 +v 0.262018 0.604199 -0.426496 +v 0.245553 0.577664 -0.427647 +v 0.301583 0.614196 -0.390499 +v 0.232761 0.532538 -0.517540 +v 0.280423 0.586634 -0.577465 +v 0.259205 0.517778 -0.509832 +v 0.284837 0.612025 -0.537066 +v 0.250974 0.564474 -0.514739 +v 0.306867 0.571874 -0.569757 +v 0.311079 0.596147 -0.531080 +v 0.303219 0.540204 -0.478593 +v 0.287212 0.477810 -0.544300 +v 0.320107 0.566131 -0.482968 +v 0.224461 0.589206 -0.492197 +v 0.298833 0.482135 -0.572985 +v 0.277216 0.548596 -0.508754 +v 0.294147 0.572372 -0.519917 +v 0.241349 0.615134 -0.496572 +v 0.274515 0.449385 -0.551967 +v 0.195976 0.493860 -0.577318 +v 0.285079 0.451311 -0.581314 +v 0.206941 0.518415 -0.570696 +v 0.272076 0.495671 -0.581784 +v 0.206540 0.495787 -0.606665 +v 0.218561 0.522741 -0.599381 +v 0.245319 0.509206 -0.590582 +v 0.229163 0.520185 -0.526284 +v 0.185824 0.430174 -0.547618 +v 0.255998 0.506822 -0.517461 +v 0.269695 0.549145 -0.605704 +v 0.211509 0.414406 -0.539358 +v 0.233698 0.504880 -0.561898 +v 0.260455 0.491345 -0.553099 +v 0.296530 0.535782 -0.596881 +v 0.171957 0.407203 -0.548032 +v 0.191540 0.391657 -0.638386 +v 0.197861 0.391800 -0.539768 +v 0.210151 0.422541 -0.637834 +v 0.219618 0.411862 -0.569430 +v 0.217445 0.376255 -0.630122 +v 0.235835 0.406773 -0.629574 +v 0.227727 0.409317 -0.599502 +v 0.260213 0.422031 -0.557836 +v 0.201484 0.323942 -0.553669 +v 0.147570 0.351275 -0.569561 +v 0.269685 0.421870 -0.587615 +v 0.182921 0.468915 -0.582675 +v 0.204585 0.313112 -0.582817 +v 0.193933 0.427630 -0.577690 +v 0.192393 0.468753 -0.612454 +v 0.202042 0.425086 -0.607762 +v 0.188211 0.301457 -0.545229 +v 0.105315 0.339005 -0.567754 +v 0.189693 0.287870 -0.573331 +v 0.120614 0.364941 -0.577506 +v 0.174527 0.337608 -0.561615 +v 0.106797 0.325418 -0.595856 +v 0.123715 0.354110 -0.606655 +v 0.150672 0.340444 -0.598709 +v 0.158060 0.384502 -0.545693 +v 0.108283 0.297629 -0.506508 +v 0.106071 0.260982 -0.557088 +v 0.184412 0.369835 -0.537508 +v 0.172525 0.360554 -0.635171 +v 0.137183 0.287436 -0.500387 +v 0.198877 0.345888 -0.626986 +v 0.177628 0.326778 -0.590763 +v 0.098432 0.277457 -0.489667 +v 0.092370 0.216919 -0.560993 +v 0.127831 0.268278 -0.484374 +v 0.104964 0.242659 -0.582378 +v 0.136077 0.269112 -0.525677 +v 0.121770 0.207740 -0.555701 +v 0.133864 0.232466 -0.576257 +v 0.134970 0.250789 -0.550967 +v 0.175931 0.279727 -0.533942 +v 0.138651 0.200983 -0.464403 +v 0.078403 0.215991 -0.471560 +v 0.175986 0.263600 -0.560709 +v 0.091027 0.313702 -0.554588 +v 0.135375 0.177906 -0.485219 +v 0.107177 0.279306 -0.531798 +v 0.091083 0.297574 -0.581355 +v 0.130042 0.180470 -0.442456 +v 0.039671 0.202981 -0.453191 +v 0.126767 0.157393 -0.463272 +v 0.048279 0.223495 -0.475138 +v 0.108527 0.208487 -0.467981 +v 0.105251 0.185410 -0.488797 +v 0.036395 0.179905 -0.474007 +v 0.045004 0.200418 -0.495954 +v 0.075127 0.192914 -0.492376 +v -0.033737 -0.040801 -0.446078 +v -0.094447 -0.147287 -0.470573 +v -0.112989 -0.125189 -0.526018 +v -0.059511 -0.029132 -0.432808 +v -0.061550 -0.007654 -0.529246 +v -0.120221 -0.135618 -0.457303 +v -0.067457 -0.045324 -0.507647 +v -0.058186 -0.056373 -0.479924 +v -0.083960 -0.044705 -0.466654 +v -0.087324 0.004014 -0.515975 +v -0.093231 -0.033656 -0.494377 +v -0.110301 -0.175096 -0.476968 +v -0.136742 -0.139538 -0.559585 +v -0.136095 -0.163463 -0.463706 +v -0.122260 -0.114140 -0.553741 +v -0.129492 -0.124569 -0.485026 +v -0.162536 -0.127905 -0.546323 +v -0.148035 -0.102471 -0.540471 +v -0.140089 -0.086279 -0.465632 +v -0.202255 -0.192891 -0.493158 +v -0.149360 -0.075230 -0.493354 +v -0.062766 -0.121285 -0.505442 +v -0.210229 -0.179620 -0.520303 +v -0.103718 -0.136238 -0.498296 +v -0.138764 -0.113520 -0.512748 +v -0.072038 -0.110236 -0.533165 +v -0.217806 -0.218546 -0.501064 +v -0.140340 -0.253306 -0.540812 +v -0.225979 -0.205606 -0.528309 +v -0.124763 -0.227607 -0.532893 +v -0.176424 -0.204463 -0.506403 +v -0.148513 -0.240365 -0.568057 +v -0.132737 -0.214336 -0.560039 +v -0.158568 -0.202764 -0.546794 +v -0.126557 -0.202696 -0.484447 +v -0.185893 -0.303164 -0.512019 +v -0.152375 -0.191103 -0.471196 +v -0.151351 -0.164332 -0.566317 +v -0.211639 -0.291445 -0.498739 +v -0.150594 -0.216035 -0.519648 +v -0.177169 -0.152739 -0.553065 +v -0.184398 -0.191192 -0.533549 +v -0.198463 -0.327447 -0.514840 +v -0.231676 -0.304499 -0.599453 +v -0.224159 -0.315630 -0.501549 +v -0.215624 -0.273503 -0.595837 +v -0.195803 -0.293277 -0.539958 +v -0.257372 -0.292683 -0.586162 +v -0.241370 -0.261784 -0.582557 +v -0.232881 -0.244075 -0.508066 +v -0.287388 -0.353394 -0.517775 +v -0.235153 -0.375143 -0.544324 +v -0.241737 -0.232296 -0.535623 +v -0.155504 -0.278986 -0.547855 +v -0.299294 -0.347470 -0.546055 +v -0.221549 -0.281558 -0.526679 +v -0.231460 -0.271671 -0.554618 +v -0.164360 -0.267207 -0.575412 +v -0.205713 -0.283390 -0.567897 +v -0.299960 -0.383659 -0.519190 +v -0.220514 -0.413664 -0.558903 +v -0.311761 -0.377486 -0.547460 +v -0.209036 -0.386017 -0.557598 +v -0.261270 -0.364268 -0.531050 +v -0.232315 -0.407491 -0.587173 +v -0.220942 -0.380093 -0.585877 +v -0.247059 -0.369218 -0.572603 +v -0.210716 -0.352963 -0.515719 +v -0.255699 -0.464084 -0.518919 +v -0.236469 -0.341270 -0.502430 +v -0.246404 -0.335146 -0.600560 +v -0.282227 -0.454176 -0.505704 +v -0.272157 -0.323453 -0.587271 +v -0.273176 -0.358344 -0.559329 +v -0.264104 -0.488536 -0.516782 +v -0.306335 -0.489322 -0.600478 +v -0.290257 -0.477529 -0.503689 +v -0.294152 -0.453827 -0.603802 +v -0.295045 -0.450757 -0.533998 +v -0.332488 -0.478314 -0.587385 +v -0.320681 -0.443919 -0.590587 +v -0.311422 -0.412993 -0.520668 +v -0.343534 -0.508340 -0.501223 +v -0.323484 -0.407494 -0.548967 +v -0.231509 -0.441805 -0.560325 +v -0.361354 -0.520558 -0.523800 +v -0.268517 -0.460665 -0.547213 +v -0.307863 -0.447338 -0.562293 +v -0.243570 -0.436307 -0.588624 +v -0.281334 -0.457246 -0.575508 +v -0.348073 -0.523996 -0.485147 +v -0.275990 -0.577876 -0.511414 +v -0.367328 -0.541152 -0.502796 +v -0.269562 -0.555721 -0.533969 +v -0.318876 -0.524134 -0.512138 +v -0.295245 -0.595033 -0.529063 +v -0.287382 -0.567938 -0.556546 +v -0.312039 -0.552145 -0.545631 +v -0.270900 -0.509679 -0.510670 +v -0.284680 -0.559665 -0.447731 +v -0.296357 -0.496510 -0.498217 +v -0.318632 -0.527544 -0.589356 +v -0.308172 -0.539308 -0.444517 +v -0.294219 -0.539927 -0.523053 +v -0.344089 -0.514375 -0.576904 +v -0.336697 -0.536351 -0.534715 +v -0.283492 -0.560057 -0.426614 +v -0.344105 -0.630430 -0.413855 +v -0.307135 -0.539625 -0.426236 +v -0.346503 -0.629436 -0.457677 +v -0.367747 -0.609998 -0.413476 +v -0.369994 -0.609080 -0.454463 +v -0.349387 -0.585823 -0.451147 +v -0.351457 -0.536452 -0.465719 +v -0.342723 -0.529539 -0.368384 +v -0.371672 -0.557248 -0.477355 +v -0.280542 -0.594754 -0.484720 +v -0.362040 -0.551695 -0.357777 +v -0.305288 -0.582922 -0.451047 +v -0.328779 -0.562565 -0.447832 +v -0.300758 -0.615551 -0.496356 +v -0.325895 -0.606179 -0.454362 +v -0.337265 -0.519897 -0.339060 +v -0.265362 -0.579766 -0.333174 +v -0.356596 -0.542078 -0.328533 +v -0.270801 -0.589376 -0.362395 +v -0.318749 -0.549484 -0.366388 +v -0.338066 -0.571641 -0.355780 +v -0.284693 -0.601948 -0.322646 +v -0.290118 -0.611532 -0.351788 +v -0.280160 -0.555283 -0.402064 +v -0.259640 -0.520995 -0.280488 +v -0.304014 -0.535136 -0.403353 +v -0.339073 -0.623367 -0.375933 +v -0.283367 -0.500663 -0.280882 +v -0.314092 -0.591586 -0.353784 +v -0.294775 -0.569430 -0.364391 +v -0.362927 -0.603221 -0.377222 +v -0.255992 -0.516950 -0.247349 +v -0.316505 -0.587204 -0.233510 +v -0.279637 -0.496520 -0.247032 +v -0.319538 -0.590523 -0.261325 +v -0.303333 -0.523838 -0.274495 +v -0.340150 -0.566775 -0.233192 +v -0.343266 -0.570190 -0.261720 +v -0.323299 -0.547014 -0.268107 +v -0.331811 -0.510576 -0.307991 +v -0.316900 -0.493255 -0.180142 +v -0.269632 -0.534135 -0.180991 +v -0.351393 -0.533180 -0.298925 +v -0.260193 -0.570925 -0.303765 +v -0.337061 -0.516664 -0.175442 +v -0.279606 -0.544171 -0.274100 +v -0.279775 -0.593529 -0.294699 +v -0.299572 -0.567347 -0.267713 +v -0.313481 -0.489935 -0.149297 +v -0.242575 -0.551253 -0.150546 +v -0.333636 -0.513338 -0.144545 +v -0.245998 -0.554576 -0.181416 +v -0.293266 -0.513695 -0.180567 +v -0.313427 -0.537104 -0.175867 +v -0.262731 -0.574656 -0.145794 +v -0.266159 -0.577985 -0.176716 +v -0.252789 -0.513919 -0.216315 +v -0.239349 -0.500921 -0.092372 +v -0.276422 -0.493477 -0.215878 +v -0.313334 -0.584206 -0.202785 +v -0.262984 -0.480482 -0.091956 +v -0.289793 -0.557545 -0.176292 +v -0.336967 -0.563765 -0.202349 +v -0.236316 -0.498066 -0.060733 +v -0.297057 -0.568539 -0.049190 +v -0.259951 -0.477626 -0.060308 +v -0.299962 -0.571274 -0.079507 +v -0.283188 -0.503933 -0.087667 +v -0.320692 -0.548099 -0.048765 +v -0.323597 -0.550835 -0.079090 +v -0.303393 -0.527384 -0.083379 +v -0.310086 -0.486636 -0.118337 +v -0.298719 -0.476066 0.006337 +v -0.330258 -0.510056 -0.113731 +v -0.239180 -0.547954 -0.119578 +v -0.319032 -0.499616 0.009396 +v -0.259553 -0.524372 -0.088084 +v -0.259351 -0.571373 -0.114972 +v -0.279758 -0.547823 -0.083796 +v -0.296665 -0.473949 0.036990 +v -0.225674 -0.535180 0.037007 +v -0.316985 -0.497506 0.039948 +v -0.227795 -0.537367 0.005347 +v -0.275078 -0.496500 0.006007 +v -0.245993 -0.558737 0.039965 +v -0.248107 -0.560917 0.008406 +v -0.233558 -0.495544 -0.028999 +v -0.225749 -0.486627 0.097318 +v -0.257191 -0.475103 -0.028563 +v -0.294421 -0.566128 -0.018865 +v -0.249430 -0.466239 0.097015 +v -0.271749 -0.540483 0.008737 +v -0.251437 -0.516933 0.005677 +v -0.318054 -0.545687 -0.018430 +v -0.295390 -0.520050 0.009066 +v -0.224499 -0.484906 0.129280 +v -0.285617 -0.555803 0.134502 +v -0.248167 -0.464500 0.129318 +v -0.286792 -0.557422 0.104445 +v -0.269778 -0.489837 0.099390 +v -0.309285 -0.535397 0.134541 +v -0.310473 -0.537034 0.104142 +v -0.294919 -0.471667 0.067779 +v -0.289763 -0.467061 0.196398 +v -0.315248 -0.495237 0.070558 +v -0.223880 -0.532837 0.068626 +v -0.310192 -0.490708 0.196656 +v -0.246097 -0.510225 0.099694 +v -0.290125 -0.513436 0.101766 +v -0.244209 -0.556407 0.071405 +v -0.266444 -0.533824 0.102070 +v -0.288326 -0.468445 0.229438 +v -0.217605 -0.529570 0.222274 +v -0.308793 -0.492051 0.228810 +v -0.218920 -0.528310 0.192045 +v -0.266149 -0.487477 0.194947 +v -0.286578 -0.511124 0.195205 +v -0.238072 -0.553176 0.221646 +v -0.239349 -0.551957 0.192304 +v -0.223327 -0.484062 0.161301 +v -0.217941 -0.495698 0.291904 +v -0.246971 -0.463640 0.161973 +v -0.284528 -0.555017 0.164279 +v -0.241370 -0.475877 0.297798 +v -0.262963 -0.531540 0.193755 +v -0.242535 -0.507894 0.193496 +v -0.308172 -0.534595 0.164952 +v -0.216910 -0.505203 0.323604 +v -0.279025 -0.572445 0.303373 +v -0.240298 -0.485750 0.330753 +v -0.279896 -0.564355 0.276515 +v -0.238592 -0.518584 0.286775 +v -0.262022 -0.498762 0.292668 +v -0.302413 -0.552992 0.310522 +v -0.303325 -0.544534 0.282409 +v -0.282673 -0.521648 0.287538 +v -0.286772 -0.471717 0.263920 +v -0.282458 -0.508132 0.388805 +v -0.307326 -0.495109 0.261301 +v -0.216263 -0.532329 0.251927 +v -0.303117 -0.530909 0.383243 +v -0.236818 -0.555721 0.249308 +v -0.259244 -0.541470 0.281645 +v -0.281233 -0.513677 0.414193 +v -0.210657 -0.574075 0.401538 +v -0.301731 -0.537158 0.411945 +v -0.212216 -0.567077 0.369297 +v -0.259044 -0.527780 0.382302 +v -0.279703 -0.550558 0.376740 +v -0.231154 -0.597556 0.399290 +v -0.232875 -0.589855 0.363735 +v -0.215978 -0.515484 0.353302 +v -0.209918 -0.528600 0.459506 +v -0.249601 -0.574963 0.472994 +v -0.239358 -0.496113 0.360698 +v -0.278112 -0.582522 0.332460 +v -0.233902 -0.508673 0.457440 +v -0.256289 -0.570206 0.370238 +v -0.235630 -0.547429 0.375800 +v -0.301492 -0.563151 0.339856 +v -0.207342 -0.521170 0.484985 +v -0.265757 -0.587554 0.516127 +v -0.231550 -0.501881 0.480692 +v -0.269443 -0.598145 0.479738 +v -0.229760 -0.551782 0.466250 +v -0.289966 -0.568265 0.511835 +v -0.293427 -0.578218 0.477672 +v -0.273585 -0.555036 0.470928 +v -0.279716 -0.515327 0.438189 +v -0.268983 -0.481288 0.530192 +v -0.299919 -0.539056 0.440493 +v -0.208521 -0.576244 0.435104 +v -0.287383 -0.499305 0.547895 +v -0.253743 -0.531855 0.464184 +v -0.228725 -0.599973 0.437408 +v -0.266004 -0.465502 0.546253 +v -0.189718 -0.506866 0.581729 +v -0.283756 -0.480058 0.567455 +v -0.194257 -0.531017 0.557250 +v -0.207471 -0.521422 0.602931 +v -0.212658 -0.549034 0.574953 +v -0.204187 -0.510460 0.509150 +v -0.192200 -0.431668 0.574583 +v -0.228663 -0.492087 0.502830 +v -0.261246 -0.572197 0.550646 +v -0.218368 -0.424500 0.559078 +v -0.237566 -0.532457 0.565934 +v -0.219166 -0.514440 0.548231 +v -0.244075 -0.497864 0.539212 +v -0.285722 -0.553824 0.544326 +v -0.262475 -0.515881 0.556914 +v -0.190529 -0.404131 0.582494 +v -0.240978 -0.419829 0.659938 +v -0.216813 -0.398820 0.566448 +v -0.243074 -0.454112 0.650063 +v -0.209158 -0.439149 0.599743 +v -0.235326 -0.431981 0.584238 +v -0.267263 -0.414517 0.643892 +v -0.269242 -0.446944 0.634557 +v -0.263428 -0.446499 0.559021 +v -0.257737 -0.346609 0.582389 +v -0.204789 -0.348151 0.615561 +v -0.280693 -0.457450 0.582655 +v -0.185814 -0.478006 0.601122 +v -0.274318 -0.346201 0.608874 +v -0.252284 -0.439462 0.609398 +v -0.203080 -0.488957 0.624756 +v -0.226116 -0.446630 0.624903 +v -0.257187 -0.320106 0.580893 +v -0.177627 -0.315836 0.630301 +v -0.273712 -0.317015 0.607236 +v -0.178316 -0.348923 0.632148 +v -0.247845 -0.346973 0.625460 +v -0.194152 -0.312745 0.656643 +v -0.194897 -0.348515 0.658633 +v -0.189184 -0.376471 0.587404 +v -0.187576 -0.263243 0.575903 +v -0.215576 -0.373363 0.570961 +v -0.239233 -0.383954 0.666323 +v -0.214103 -0.267891 0.560051 +v -0.221371 -0.347744 0.642046 +v -0.231263 -0.347380 0.598975 +v -0.265625 -0.380847 0.649880 +v -0.188030 -0.234320 0.567092 +v -0.237621 -0.210868 0.643117 +v -0.214543 -0.239863 0.551507 +v -0.237124 -0.242620 0.652772 +v -0.204092 -0.256369 0.601526 +v -0.230619 -0.261017 0.585674 +v -0.264134 -0.216410 0.627532 +v -0.263651 -0.247268 0.636920 +v -0.256998 -0.293149 0.576558 +v -0.259166 -0.179068 0.541308 +v -0.206157 -0.167199 0.572218 +v -0.273507 -0.287856 0.602559 +v -0.177397 -0.283344 0.625103 +v -0.275696 -0.171191 0.566631 +v -0.247135 -0.254143 0.611297 +v -0.193906 -0.278052 0.651104 +v -0.220608 -0.249495 0.627149 +v -0.260161 -0.148379 0.531467 +v -0.180611 -0.131741 0.578201 +v -0.276668 -0.141233 0.557022 +v -0.179653 -0.161265 0.587674 +v -0.232662 -0.173134 0.556763 +v -0.197118 -0.124595 0.603755 +v -0.196184 -0.153387 0.612997 +v -0.188735 -0.205007 0.557155 +v -0.192681 -0.080835 0.520945 +v -0.215238 -0.210970 0.541710 +v -0.238349 -0.180583 0.632859 +v -0.219252 -0.084707 0.504958 +v -0.222688 -0.159322 0.597541 +v -0.264852 -0.186546 0.617413 +v -0.249192 -0.165256 0.582086 +v -0.193651 -0.048016 0.515489 +v -0.242769 -0.039660 0.594903 +v -0.220255 -0.050729 0.499320 +v -0.241950 -0.067269 0.599543 +v -0.209104 -0.076313 0.547145 +v -0.269373 -0.042373 0.578734 +v -0.268521 -0.071141 0.583556 +v -0.252098 -0.075663 0.557357 +v -0.261206 -0.116690 0.522582 +v -0.264960 0.016839 0.506444 +v -0.277675 -0.110685 0.548452 +v -0.181586 -0.102164 0.569898 +v -0.281237 0.015995 0.533108 +v -0.235675 -0.080185 0.531158 +v -0.198056 -0.096158 0.595768 +v -0.225527 -0.071791 0.573344 +v -0.265914 0.050196 0.508006 +v -0.185848 0.048979 0.556761 +v -0.282142 0.047682 0.534593 +v -0.184972 0.018308 0.555319 +v -0.238298 0.017328 0.522736 +v -0.254574 0.016485 0.549399 +v -0.202076 0.046466 0.583348 +v -0.201248 0.017465 0.581982 +v -0.194503 -0.014704 0.512648 +v -0.198608 0.117309 0.522283 +v -0.221139 -0.016218 0.496375 +v -0.243472 -0.011917 0.592543 +v -0.225346 0.119098 0.506205 +v -0.227911 0.016975 0.565691 +v -0.211635 0.017818 0.539028 +v -0.270108 -0.013431 0.576270 +v -0.199945 0.149004 0.528646 +v -0.248229 0.130547 0.606858 +v -0.226698 0.151186 0.512645 +v -0.246999 0.101413 0.600989 +v -0.241476 0.113799 0.532441 +v -0.274982 0.132728 0.590856 +v -0.273736 0.103202 0.584912 +v -0.267000 0.083152 0.511372 +v -0.272397 0.208335 0.536477 +v -0.283178 0.079126 0.537803 +v -0.186859 0.079655 0.559892 +v -0.288477 0.201851 0.562476 +v -0.214738 0.112010 0.548518 +v -0.257606 0.108501 0.558677 +v -0.203037 0.075629 0.586323 +v -0.230869 0.106711 0.574754 +v -0.273855 0.237944 0.542776 +v -0.193652 0.232532 0.591017 +v -0.289966 0.232075 0.568902 +v -0.192133 0.201697 0.584464 +v -0.245642 0.206122 0.552473 +v -0.209762 0.226662 0.617143 +v -0.208213 0.195213 0.610463 +v -0.234968 0.197426 0.594468 +v -0.201354 0.180017 0.535559 +v -0.207136 0.298479 0.557584 +v -0.239633 0.292409 0.610625 +v -0.228114 0.182348 0.519589 +v -0.249583 0.160323 0.613502 +v -0.233789 0.298604 0.541269 +v -0.218888 0.203910 0.568469 +v -0.276343 0.162655 0.597533 +v -0.261722 0.199638 0.578472 +v -0.208473 0.327095 0.559118 +v -0.257508 0.324246 0.638971 +v -0.235070 0.326027 0.542747 +v -0.255882 0.289373 0.637146 +v -0.284106 0.323178 0.622600 +v -0.282535 0.289498 0.620831 +v -0.266286 0.292534 0.594310 +v -0.275296 0.267033 0.547941 +v -0.280356 0.379806 0.548798 +v -0.291464 0.262325 0.574266 +v -0.195197 0.263730 0.596544 +v -0.296900 0.383609 0.575036 +v -0.223385 0.295444 0.584105 +v -0.250038 0.295569 0.567790 +v -0.211364 0.259022 0.622869 +v -0.281351 0.407678 0.542525 +v -0.202012 0.422131 0.590331 +v -0.297965 0.413411 0.568364 +v -0.200899 0.391023 0.597272 +v -0.253871 0.383545 0.564956 +v -0.270414 0.387348 0.591194 +v -0.218626 0.427864 0.616170 +v -0.217442 0.394826 0.623510 +v -0.209719 0.355438 0.558396 +v -0.213531 0.464589 0.530659 +v -0.236259 0.353046 0.542071 +v -0.259060 0.359620 0.638001 +v -0.239887 0.456895 0.515735 +v -0.243928 0.391087 0.607352 +v -0.227385 0.387284 0.581114 +v -0.285600 0.357228 0.621676 +v -0.214138 0.487449 0.517928 +v -0.264738 0.530514 0.584065 +v -0.240438 0.477631 0.504199 +v -0.263845 0.496752 0.602931 +v -0.230302 0.475310 0.554750 +v -0.256658 0.467616 0.539826 +v -0.291038 0.520695 0.570336 +v -0.290201 0.489058 0.588007 +v -0.282248 0.434533 0.534970 +v -0.284185 0.516962 0.478556 +v -0.231722 0.544807 0.498013 +v -0.298940 0.442623 0.560119 +v -0.203041 0.452992 0.581603 +v -0.301169 0.538345 0.493751 +v -0.273429 0.478337 0.563916 +v -0.219733 0.461082 0.606752 +v -0.247074 0.486031 0.578840 +v -0.284188 0.530138 0.456593 +v -0.205493 0.575563 0.479676 +v -0.301172 0.553635 0.468255 +v -0.205491 0.558730 0.507741 +v -0.274938 0.552267 0.503479 +v -0.222477 0.599060 0.491338 +v -0.222475 0.580113 0.522935 +v -0.248707 0.566190 0.513207 +v -0.214541 0.506976 0.502146 +v -0.213899 0.549791 0.413452 +v -0.247477 0.602466 0.415505 +v -0.240794 0.494877 0.490274 +v -0.265382 0.561753 0.558747 +v -0.240240 0.533067 0.411719 +v -0.257954 0.530885 0.488284 +v -0.291635 0.549654 0.546876 +v -0.213046 0.549027 0.386763 +v -0.263060 0.627895 0.378551 +v -0.239459 0.532334 0.387304 +v -0.264266 0.628803 0.416532 +v -0.289473 0.611203 0.379092 +v -0.290607 0.612079 0.414800 +v -0.283939 0.538975 0.434160 +v -0.280912 0.534743 0.323784 +v -0.228048 0.568018 0.321687 +v -0.300864 0.564380 0.440846 +v -0.205147 0.587568 0.448977 +v -0.297574 0.561046 0.321122 +v -0.230688 0.576128 0.414479 +v -0.257029 0.559405 0.412746 +v -0.273818 0.585742 0.413773 +v -0.222072 0.612973 0.455663 +v -0.280537 0.532886 0.290696 +v -0.201265 0.582925 0.289598 +v -0.297219 0.559294 0.289781 +v -0.201616 0.584656 0.320639 +v -0.254480 0.551380 0.322735 +v -0.217948 0.609333 0.288683 +v -0.218278 0.610959 0.317977 +v -0.212128 0.545514 0.356894 +v -0.210986 0.537325 0.229146 +v -0.238567 0.528912 0.358277 +v -0.262043 0.624055 0.345536 +v -0.237409 0.520685 0.230354 +v -0.244710 0.594321 0.319025 +v -0.288482 0.607452 0.346919 +v -0.271142 0.577684 0.320073 +v -0.211191 0.534937 0.198460 +v -0.261251 0.613944 0.192048 +v -0.237612 0.518333 0.200144 +v -0.261036 0.616439 0.224146 +v -0.227669 0.563697 0.227479 +v -0.287671 0.597340 0.193733 +v -0.287460 0.599799 0.225355 +v -0.270776 0.573428 0.227021 +v -0.280457 0.532054 0.259954 +v -0.281551 0.522081 0.138091 +v -0.228718 0.555221 0.134000 +v -0.297139 0.558457 0.258896 +v -0.201183 0.582064 0.258009 +v -0.298238 0.548406 0.135836 +v -0.254093 0.547057 0.228688 +v -0.217866 0.608467 0.256951 +v -0.244353 0.590068 0.225813 +v -0.282127 0.519191 0.106475 +v -0.202867 0.568951 0.100918 +v -0.298806 0.545554 0.104643 +v -0.202302 0.571790 0.131954 +v -0.255135 0.538651 0.136045 +v -0.219547 0.595314 0.099086 +v -0.218989 0.598116 0.129699 +v -0.245406 0.581546 0.131745 +v -0.211539 0.532023 0.167551 +v -0.213847 0.522438 0.040479 +v -0.237956 0.515449 0.169551 +v -0.261606 0.610963 0.160422 +v -0.240285 0.505802 0.041395 +v -0.288023 0.594389 0.162422 +v -0.271822 0.564976 0.133790 +v -0.214431 0.522153 0.008191 +v -0.264336 0.601501 0.009810 +v -0.240879 0.505512 0.008508 +v -0.263801 0.601764 0.039405 +v -0.290784 0.584859 0.010127 +v -0.290238 0.585128 0.040321 +v -0.282750 0.516907 0.074376 +v -0.285182 0.518781 -0.056508 +v -0.232229 0.551898 -0.054169 +v -0.299417 0.543315 0.073212 +v -0.203467 0.566750 0.070022 +v -0.301769 0.545085 -0.053426 +v -0.230498 0.548880 0.040121 +v -0.256936 0.532244 0.041037 +v -0.273587 0.558686 0.040679 +v -0.220134 0.593159 0.068857 +v -0.247149 0.575322 0.039763 +v -0.285904 0.522944 -0.089164 +v -0.206428 0.572353 -0.083566 +v -0.302464 0.549089 -0.084834 +v -0.205753 0.568457 -0.052999 +v -0.258706 0.535339 -0.055338 +v -0.222988 0.598499 -0.079235 +v -0.222340 0.594761 -0.049917 +v -0.215004 0.523071 -0.024419 +v -0.217915 0.540937 -0.152358 +v -0.241465 0.506451 -0.024804 +v -0.264847 0.602311 -0.019331 +v -0.244419 0.524551 -0.154723 +v -0.248816 0.578203 -0.051087 +v -0.291308 0.585691 -0.019717 +v -0.275293 0.561644 -0.052257 +v -0.218662 0.546321 -0.182398 +v -0.268318 0.624609 -0.168460 +v -0.245158 0.529878 -0.184439 +v -0.267528 0.618922 -0.136675 +v -0.234453 0.566932 -0.147130 +v -0.294815 0.608166 -0.170501 +v -0.294032 0.602535 -0.139041 +v -0.286680 0.528372 -0.120966 +v -0.289450 0.546120 -0.239883 +v -0.236529 0.579361 -0.239145 +v -0.303221 0.554392 -0.115881 +v -0.207173 0.577573 -0.114106 +v -0.306066 0.572535 -0.238232 +v -0.260957 0.550546 -0.149496 +v -0.277495 0.576541 -0.144268 +v -0.223715 0.603594 -0.109021 +v -0.250990 0.592927 -0.141903 +v -0.289927 0.546742 -0.268601 +v -0.210596 0.596656 -0.270641 +v -0.306573 0.573188 -0.268829 +v -0.210068 0.595982 -0.238776 +v -0.262989 0.562741 -0.239514 +v -0.227242 0.623103 -0.270869 +v -0.226683 0.622397 -0.237124 +v -0.253144 0.605777 -0.237493 +v -0.219332 0.550439 -0.211757 +v -0.222204 0.550793 -0.333688 +v -0.255413 0.603734 -0.332848 +v -0.245812 0.533897 -0.213078 +v -0.269077 0.629263 -0.201690 +v -0.248617 0.534195 -0.331846 +v -0.295557 0.612720 -0.203010 +v -0.279605 0.589156 -0.237862 +v -0.224666 0.550788 -0.366749 +v -0.274232 0.630219 -0.361962 +v -0.251059 0.534191 -0.364631 +v -0.272018 0.630204 -0.332428 +v -0.238808 0.577264 -0.333268 +v -0.300625 0.613622 -0.359844 +v -0.298431 0.613606 -0.330585 +v -0.290367 0.545304 -0.298360 +v -0.299980 0.544550 -0.421648 +v -0.307023 0.571734 -0.299149 +v -0.211081 0.595139 -0.302740 +v -0.316549 0.571020 -0.420481 +v -0.265222 0.560665 -0.331425 +v -0.281826 0.587136 -0.331005 +v -0.227736 0.621568 -0.303528 +v -0.302816 0.543402 -0.450791 +v -0.224065 0.593107 -0.461602 +v -0.319562 0.569776 -0.451513 +v -0.221045 0.594350 -0.430493 +v -0.273669 0.561150 -0.424596 +v -0.240812 0.619481 -0.462325 +v -0.237614 0.620820 -0.429326 +v -0.263926 0.604220 -0.426378 +v -0.227673 0.551222 -0.398426 +v -0.235758 0.540866 -0.503576 +v -0.269830 0.588316 -0.525797 +v -0.254033 0.534621 -0.395951 +v -0.277170 0.630646 -0.392855 +v -0.261933 0.524892 -0.497553 +v -0.247357 0.577750 -0.427544 +v -0.303530 0.614044 -0.390380 +v -0.290238 0.587620 -0.423430 +v -0.234475 0.532688 -0.517580 +v -0.282469 0.586689 -0.577327 +v -0.260855 0.517851 -0.509799 +v -0.286866 0.612042 -0.536908 +v -0.308848 0.571852 -0.569546 +v -0.313041 0.596068 -0.530884 +v -0.296005 0.572343 -0.519774 +v -0.304899 0.540106 -0.478489 +v -0.288963 0.477908 -0.544120 +v -0.235538 0.505004 -0.561946 +v -0.321889 0.565973 -0.482825 +v -0.226342 0.589418 -0.492131 +v -0.300694 0.482191 -0.572766 +v -0.252794 0.564591 -0.514687 +v -0.278969 0.548617 -0.508663 +v -0.243332 0.615285 -0.496467 +v -0.276282 0.449501 -0.551785 +v -0.197862 0.493985 -0.577487 +v -0.286952 0.451376 -0.581097 +v -0.208825 0.518552 -0.570859 +v -0.262251 0.491456 -0.553033 +v -0.273981 0.495739 -0.581679 +v -0.208532 0.495860 -0.606799 +v -0.220556 0.522835 -0.599506 +v -0.230886 0.520345 -0.526366 +v -0.187570 0.430342 -0.547725 +v -0.204001 0.425146 -0.607802 +v -0.257667 0.506942 -0.517439 +v -0.271758 0.549214 -0.605644 +v -0.213222 0.414582 -0.539346 +v -0.247269 0.509287 -0.590593 +v -0.298539 0.535811 -0.596718 +v -0.173699 0.407362 -0.548148 +v -0.193607 0.391663 -0.638405 +v -0.199576 0.391978 -0.539765 +v -0.212217 0.422549 -0.637841 +v -0.221438 0.411985 -0.569385 +v -0.219483 0.376279 -0.630021 +v -0.237869 0.406790 -0.629462 +v -0.229653 0.409387 -0.599423 +v -0.261990 0.422156 -0.557657 +v -0.203292 0.324111 -0.553541 +v -0.271568 0.421940 -0.587402 +v -0.184807 0.469031 -0.582850 +v -0.206505 0.313236 -0.582661 +v -0.195786 0.427744 -0.577763 +v -0.194385 0.468815 -0.612595 +v -0.190024 0.301637 -0.545117 +v -0.107153 0.339036 -0.567980 +v -0.191620 0.288009 -0.573193 +v -0.122467 0.364993 -0.577727 +v -0.176350 0.337738 -0.561603 +v -0.179564 0.326863 -0.590723 +v -0.108749 0.325409 -0.596057 +v -0.125680 0.354118 -0.606847 +v -0.159794 0.384650 -0.545818 +v -0.109983 0.297725 -0.506643 +v -0.186126 0.370011 -0.537514 +v -0.174590 0.360558 -0.635204 +v -0.138884 0.287600 -0.500420 +v -0.152622 0.340491 -0.598785 +v -0.149408 0.351366 -0.569665 +v -0.200921 0.345920 -0.626900 +v -0.100121 0.277540 -0.489805 +v -0.094416 0.216911 -0.561084 +v -0.129527 0.268437 -0.484416 +v -0.107017 0.242656 -0.582457 +v -0.108994 0.279369 -0.531915 +v -0.137896 0.269244 -0.525691 +v -0.123822 0.207809 -0.555696 +v -0.135919 0.232532 -0.576234 +v -0.177751 0.279920 -0.533835 +v -0.140473 0.201201 -0.464358 +v -0.080201 0.216030 -0.471683 +v -0.177923 0.263757 -0.560580 +v -0.092856 0.313715 -0.554805 +v -0.137317 0.178098 -0.485162 +v -0.136907 0.250888 -0.550962 +v -0.093028 0.297552 -0.581550 +v -0.108005 0.261013 -0.557186 +v -0.131866 0.180691 -0.442415 +v -0.041456 0.202930 -0.453397 +v -0.128709 0.157585 -0.463217 +v -0.050065 0.223444 -0.475345 +v -0.110337 0.208616 -0.468020 +v -0.107181 0.185512 -0.488825 +v -0.038299 0.179824 -0.474199 +v -0.046909 0.200341 -0.496150 +v -0.077045 0.192927 -0.492487 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn 0.0007 1.0000 -0.0001 +vn -0.0000 1.0000 0.0007 +vn -0.4816 0.8580 0.1789 +vn -0.2861 -0.3648 0.8860 +vn 0.8259 0.3750 0.4211 +vn 0.4892 -0.8475 -0.2061 +vn 0.2861 0.3648 -0.8860 +vn -0.8259 -0.3750 -0.4211 +vn 0.4816 -0.8580 -0.1789 +vn -0.2861 -0.3647 0.8861 +vn 0.2860 0.3649 -0.8860 +vn 0.8265 0.3740 0.4208 +vn 0.2538 0.4198 -0.8714 +vn 0.4991 -0.8318 -0.2430 +vn 0.8263 0.3742 0.4209 +vn -0.8263 -0.3742 -0.4209 +vn -0.2537 -0.4198 0.8714 +vn -0.8265 -0.3740 -0.4208 +vn 0.5019 -0.8267 -0.2543 +vn -0.5019 0.8267 0.2543 +vn 0.8271 0.3729 0.4205 +vn -0.8271 -0.3729 -0.4205 +vn -0.4977 0.8341 0.2378 +vn -0.2728 -0.3877 0.8805 +vn 0.8241 0.3783 0.4217 +vn 0.4454 -0.8929 -0.0657 +vn 0.8270 0.3731 0.4205 +vn -0.2675 -0.3966 0.8782 +vn 0.2691 0.3938 -0.8789 +vn -0.8241 -0.3783 -0.4217 +vn 0.2723 0.3885 -0.8803 +vn 0.4698 -0.8716 -0.1399 +vn -0.8270 -0.3731 -0.4205 +vn -0.3344 -0.2759 0.9012 +vn 0.3341 0.2763 -0.9011 +vn -0.4885 0.8485 0.2035 +vn 0.8257 0.3752 0.4212 +vn 0.3738 0.1973 -0.9063 +vn 0.3731 -0.9266 -0.0462 +vn 0.2960 0.3473 -0.8898 +vn 0.8256 0.3748 0.4218 +vn -0.8255 -0.3751 -0.4218 +vn -0.3738 -0.1972 0.9063 +vn -0.8256 -0.3747 -0.4218 +vn 0.3954 -0.9182 -0.0253 +vn -0.3954 0.9182 0.0253 +vn -0.2958 -0.3476 0.8898 +vn 0.8446 0.3313 0.4205 +vn -0.8447 -0.3310 -0.4206 +vn -0.4194 0.9077 0.0131 +vn -0.3818 -0.1787 0.9068 +vn 0.8462 0.3294 0.4188 +vn 0.3109 -0.9359 0.1658 +vn 0.8299 0.3655 0.4215 +vn -0.3802 -0.1797 0.9073 +vn 0.3810 0.1777 -0.9073 +vn -0.8462 -0.3296 -0.4188 +vn 0.3806 0.1789 -0.9073 +vn 0.3333 -0.9421 0.0373 +vn -0.8299 -0.3654 -0.4216 +vn -0.4207 -0.0656 0.9048 +vn 0.4226 0.0603 -0.9043 +vn -0.3527 0.9352 0.0313 +vn 0.8207 0.3927 0.4149 +vn 0.5908 -0.4840 -0.6455 +vn 0.1706 -0.6063 0.7767 +vn 0.3931 0.1459 -0.9078 +vn 0.8179 0.3718 0.4391 +vn -0.8268 -0.3736 -0.4206 +vn -0.5917 0.4879 0.6418 +vn -0.8216 -0.3906 -0.4151 +vn 0.2284 -0.7689 0.5972 +vn -0.2284 0.7689 -0.5972 +vn -0.3930 -0.1466 0.9078 +vn 0.7780 0.5456 0.3115 +vn -0.7782 -0.5445 -0.3128 +vn -0.2776 0.8865 -0.3702 +vn -0.6113 0.6373 0.4692 +vn 0.7539 0.6547 0.0556 +vn -0.0983 0.0957 0.9905 +vn 0.8024 0.4618 0.3780 +vn -0.5739 0.5759 0.5821 +vn 0.5771 -0.5827 -0.5721 +vn -0.7538 -0.6549 -0.0541 +vn 0.6105 -0.6357 -0.4725 +vn -0.0078 -0.1466 0.9892 +vn -0.8031 -0.4606 -0.3779 +vn -0.6504 0.7591 -0.0249 +vn 0.6503 -0.7594 0.0193 +vn -0.0963 0.4119 -0.9061 +vn 0.7505 0.6608 -0.0080 +vn 0.6137 -0.7090 0.3474 +vn -0.1705 0.2971 0.9395 +vn 0.6520 -0.7220 -0.2314 +vn 0.7515 0.6594 0.0204 +vn -0.7490 -0.6619 -0.0303 +vn -0.6137 0.7090 -0.3474 +vn -0.7591 -0.6509 0.0112 +vn -0.1714 0.2999 0.9384 +vn 0.1714 -0.2999 -0.9384 +vn -0.6511 0.7248 0.2251 +vn 0.7701 0.6346 -0.0653 +vn -0.7701 -0.6346 0.0653 +vn 0.1499 -0.2391 -0.9594 +vn -0.6206 0.7213 -0.3076 +vn 0.7597 0.6503 0.0042 +vn -0.1041 0.1051 0.9890 +vn 0.7682 0.6379 -0.0548 +vn -0.6191 0.7225 -0.3077 +vn 0.6198 -0.7201 0.3119 +vn -0.7597 -0.6503 -0.0043 +vn 0.6208 -0.7218 0.3060 +vn -0.1235 0.1630 0.9789 +vn -0.7681 -0.6380 0.0552 +vn -0.6409 0.7503 -0.1620 +vn 0.6412 -0.7506 0.1593 +vn 0.1541 -0.2497 -0.9560 +vn 0.7587 0.6514 0.0111 +vn 0.6420 -0.7515 0.1521 +vn -0.1094 0.1064 0.9883 +vn 0.6299 -0.7363 0.2472 +vn 0.7602 0.6497 0.0014 +vn -0.7583 -0.6519 -0.0009 +vn -0.6420 0.7515 -0.1521 +vn -0.7587 -0.6513 -0.0110 +vn -0.1086 0.1050 0.9885 +vn -0.6299 0.7363 -0.2472 +vn 0.7589 0.6511 0.0140 +vn -0.7589 -0.6511 -0.0140 +vn 0.1049 -0.1001 -0.9894 +vn -0.6423 0.7518 -0.1487 +vn -0.0907 0.0843 0.9923 +vn 0.7588 0.6511 0.0143 +vn -0.6424 0.7519 -0.1485 +vn 0.6424 -0.7519 0.1485 +vn 0.6423 -0.7519 0.1487 +vn -0.0997 0.0951 0.9905 +vn -0.7588 -0.6511 -0.0143 +vn -0.6443 0.7537 -0.1297 +vn 0.6443 -0.7537 0.1297 +vn 0.1063 -0.1029 -0.9890 +vn 0.6472 -0.7563 0.0956 +vn -0.0616 0.0718 0.9955 +vn 0.6429 -0.7524 0.1435 +vn -0.6472 0.7563 -0.0956 +vn -0.0719 0.0672 0.9951 +vn 0.0719 -0.0672 -0.9951 +vn -0.6429 0.7524 -0.1435 +vn 0.7594 0.6506 0.0059 +vn -0.7594 -0.6506 -0.0059 +vn 0.0812 -0.0727 -0.9940 +vn -0.6475 0.7566 -0.0908 +vn 0.7602 0.6497 -0.0052 +vn -0.0373 0.0413 0.9985 +vn 0.7589 0.6511 0.0139 +vn -0.6473 0.7565 -0.0934 +vn 0.6473 -0.7565 0.0934 +vn -0.7602 -0.6497 0.0052 +vn 0.6475 -0.7566 0.0907 +vn -0.0422 0.0639 0.9971 +vn -0.7589 -0.6511 -0.0139 +vn -0.6485 0.7583 -0.0661 +vn 0.6485 -0.7583 0.0661 +vn 0.0512 -0.0732 -0.9960 +vn 0.7592 0.6507 0.0127 +vn 0.6511 -0.7589 -0.0034 +vn -0.0446 -0.0654 0.9969 +vn 0.6478 -0.7572 0.0839 +vn 0.7592 0.6508 0.0072 +vn -0.7592 -0.6508 -0.0067 +vn -0.6512 0.7589 0.0035 +vn -0.7592 -0.6508 -0.0128 +vn -0.0405 -0.0242 0.9989 +vn 0.0405 0.0242 -0.9989 +vn -0.6478 0.7572 -0.0838 +vn 0.7576 0.6500 0.0602 +vn -0.7576 -0.6500 -0.0601 +vn 0.0371 -0.0099 -0.9993 +vn -0.6520 0.7560 0.0580 +vn 0.7513 0.6251 0.2118 +vn -0.0297 -0.3133 0.9492 +vn 0.7587 0.6506 0.0329 +vn -0.6484 0.7602 0.0419 +vn 0.6508 -0.7583 -0.0364 +vn -0.7513 -0.6250 -0.2120 +vn 0.6520 -0.7559 -0.0593 +vn -0.0340 -0.2480 0.9682 +vn -0.7587 -0.6506 -0.0329 +vn -0.6588 0.7262 0.1965 +vn 0.6589 -0.7259 -0.1974 +vn 0.0416 0.1475 -0.9882 +vn 0.7504 0.6210 0.2262 +vn 0.6552 -0.7443 -0.1291 +vn -0.0551 -0.1422 0.9883 +vn 0.6560 -0.7432 -0.1316 +vn 0.7518 0.6252 0.2096 +vn -0.7483 -0.6285 -0.2120 +vn -0.6552 0.7442 0.1294 +vn -0.7504 -0.6211 -0.2260 +vn -0.0398 -0.2707 0.9618 +vn 0.0398 0.2707 -0.9618 +vn -0.6563 0.7432 0.1304 +vn 0.7526 0.6350 0.1743 +vn -0.7528 -0.6349 -0.1739 +vn 0.0314 0.3231 -0.9458 +vn -0.6389 0.7693 -0.0054 +vn 0.7729 0.6259 -0.1043 +vn -0.1079 0.3433 0.9330 +vn 0.7508 0.6197 0.2285 +vn -0.6319 0.7728 0.0590 +vn 0.6332 -0.7727 -0.0443 +vn -0.7729 -0.6259 0.1041 +vn 0.6363 -0.7715 0.0047 +vn -0.0886 0.2081 0.9741 +vn -0.7510 -0.6194 -0.2289 +vn -0.6253 0.7296 -0.2768 +vn 0.6252 -0.7300 0.2762 +vn 0.0729 -0.0354 -0.9967 +vn 0.7751 0.6067 -0.1765 +vn 0.5731 -0.5273 0.6273 +vn -0.1230 0.7675 0.6291 +vn 0.6362 -0.7558 0.1549 +vn 0.7627 0.6303 -0.1446 +vn -0.7628 -0.6302 0.1446 +vn -0.5732 0.5273 -0.6272 +vn -0.7751 -0.6070 0.1754 +vn -0.1341 0.6220 0.7715 +vn 0.1341 -0.6220 -0.7715 +vn -0.6349 0.7561 -0.1587 +vn 0.8059 0.4896 -0.3329 +vn -0.8062 -0.4889 0.3334 +vn 0.1271 -0.4703 -0.8733 +vn -0.5411 0.4255 -0.7253 +vn 0.8413 0.1963 -0.5037 +vn -0.0544 0.9712 0.2320 +vn 0.7908 0.5617 -0.2434 +vn -0.5368 0.4887 -0.6877 +vn 0.5363 -0.4933 0.6848 +vn -0.8413 -0.1965 0.5037 +vn 0.5407 -0.4244 0.7263 +vn -0.0658 0.9435 0.3246 +vn -0.0659 0.9435 0.3246 +vn -0.7909 -0.5616 0.2430 +vn -0.5364 0.2027 -0.8193 +vn 0.5364 -0.2031 0.8192 +vn 0.0967 -0.8745 -0.4753 +vn 0.8419 0.1312 -0.5235 +vn 0.5254 0.0585 0.8488 +vn -0.0137 0.9940 -0.1084 +vn 0.5425 -0.3005 0.7845 +vn 0.8362 0.1694 -0.5216 +vn -0.8356 -0.1735 0.5212 +vn -0.5254 -0.0586 -0.8488 +vn -0.8419 -0.1314 0.5234 +vn -0.0278 0.9996 0.0017 +vn 0.0278 -0.9996 -0.0016 +vn -0.5428 0.3014 -0.7839 +vn 0.8498 -0.0124 -0.5270 +vn -0.8498 0.0120 0.5270 +vn 0.0417 -0.9919 -0.1201 +vn -0.5202 -0.1322 -0.8438 +vn 0.8506 -0.1653 -0.4991 +vn 0.0191 0.9518 -0.3061 +vn 0.8477 0.0611 -0.5270 +vn -0.5195 -0.0954 -0.8491 +vn 0.5157 0.0897 0.8520 +vn -0.8506 0.1652 0.4992 +vn 0.5201 0.1332 0.8437 +vn 0.0104 0.9641 -0.2655 +vn -0.8476 -0.0610 0.5271 +vn -0.5254 -0.2406 -0.8161 +vn 0.5253 0.2401 0.8164 +vn 0.0006 -0.9799 0.1993 +vn 0.8500 -0.1819 -0.4943 +vn 0.5253 0.2443 0.8151 +vn 0.0311 0.9572 -0.2877 +vn 0.5248 0.1994 0.8275 +vn 0.8506 -0.1700 -0.4975 +vn -0.8507 0.1685 0.4980 +vn -0.5253 -0.2442 -0.8151 +vn -0.8504 0.1822 0.4936 +vn 0.0292 0.9489 -0.3142 +vn -0.0292 -0.9489 0.3142 +vn -0.5246 -0.1999 -0.8275 +vn 0.8503 -0.1855 -0.4926 +vn -0.8503 0.1856 0.4925 +vn -0.0254 -0.9464 0.3220 +vn -0.5238 -0.2110 -0.8253 +vn 0.8527 -0.1098 -0.5108 +vn 0.0274 0.9923 -0.1211 +vn 0.8501 -0.1934 -0.4899 +vn -0.5229 -0.2227 -0.8228 +vn 0.5245 0.2247 0.8212 +vn -0.8526 0.1099 0.5108 +vn 0.5238 0.2106 0.8254 +vn 0.0298 0.9817 -0.1879 +vn -0.8501 0.1933 0.4899 +vn -0.5212 -0.1245 -0.8443 +vn 0.5215 0.1261 0.8439 +vn -0.0313 -0.9691 0.2447 +vn 0.8526 -0.0675 -0.5181 +vn 0.5165 -0.0552 0.8545 +vn 0.0308 0.9967 0.0756 +vn 0.5229 0.1732 0.8346 +vn 0.8512 -0.0864 -0.5177 +vn -0.8512 0.0864 0.5177 +vn -0.5165 0.0550 -0.8545 +vn -0.8527 0.0676 0.5180 +vn 0.0274 0.9995 0.0151 +vn -0.0274 -0.9995 -0.0151 +vn -0.5228 -0.1727 -0.8348 +vn 0.8556 -0.0001 -0.5176 +vn -0.8556 -0.0000 0.5177 +vn -0.0258 -0.9984 0.0504 +vn -0.5139 0.1030 -0.8517 +vn 0.8580 0.0661 -0.5094 +vn 0.0426 0.9779 0.2046 +vn 0.8548 -0.0257 -0.5184 +vn -0.5142 0.0785 -0.8541 +vn 0.5142 -0.0799 0.8539 +vn -0.8580 -0.0661 0.5094 +vn 0.5143 -0.1029 0.8514 +vn 0.0392 0.9838 0.1747 +vn -0.8549 0.0262 0.5181 +vn -0.5120 0.1898 -0.8378 +vn 0.5119 -0.1903 0.8377 +vn -0.0351 -0.9909 -0.1296 +vn 0.8581 0.0716 -0.5084 +vn 0.5114 -0.2025 0.8351 +vn 0.0484 0.9805 0.1903 +vn 0.5135 -0.1494 0.8450 +vn 0.8579 0.0654 -0.5096 +vn -0.8575 -0.0657 0.5102 +vn -0.5114 0.2026 -0.8351 +vn -0.8581 -0.0716 0.5084 +vn 0.0473 0.9757 0.2140 +vn -0.0473 -0.9757 -0.2140 +vn -0.5135 0.1494 -0.8450 +vn 0.8579 0.0660 -0.5095 +vn -0.8580 -0.0660 0.5095 +vn -0.0453 -0.9748 -0.2183 +vn -0.5127 0.1686 -0.8419 +vn 0.8540 -0.0127 -0.5200 +vn 0.0450 0.9990 0.0077 +vn 0.8584 0.0744 -0.5076 +vn -0.5107 0.1811 -0.8405 +vn 0.5109 -0.1789 0.8408 +vn -0.8541 0.0122 0.5200 +vn 0.5118 -0.1689 0.8423 +vn 0.0473 0.9953 0.0847 +vn -0.8584 -0.0744 0.5076 +vn -0.5175 0.0696 -0.8528 +vn 0.5176 -0.0685 0.8529 +vn -0.0484 -0.9880 -0.1468 +vn 0.8507 -0.0542 -0.5228 +vn 0.5272 0.1666 0.8333 +vn 0.0339 0.9708 -0.2374 +vn 0.5148 -0.1286 0.8476 +vn 0.8497 -0.0349 -0.5261 +vn -0.8509 0.0352 0.5242 +vn -0.5272 -0.1690 -0.8327 +vn -0.8508 0.0540 0.5228 +vn 0.0375 0.9853 -0.1668 +vn -0.0375 -0.9853 0.1668 +vn -0.5149 0.1291 -0.8475 +vn 0.8486 -0.1450 -0.5087 +vn -0.8487 0.1441 0.5089 +vn -0.0417 -0.9960 0.0785 +vn -0.5270 -0.2283 -0.8186 +vn 0.8439 -0.2787 -0.4584 +vn 0.0198 0.8305 -0.5567 +vn 0.8502 -0.0987 -0.5171 +vn -0.5221 -0.1931 -0.8307 +vn 0.5223 0.1944 0.8303 +vn -0.8440 0.2781 0.4587 +vn 0.5259 0.2283 0.8193 +vn 0.0259 0.9063 -0.4219 +vn -0.8502 0.0988 0.5171 +vn -0.5337 -0.4010 -0.7446 +vn 0.5337 0.4021 0.7439 +vn -0.0297 -0.9455 0.3242 +vn 0.8354 -0.3580 -0.4171 +vn 0.5393 0.7225 0.4327 +vn -0.0044 0.4465 -0.8948 +vn 0.5314 0.2996 0.7924 +vn 0.8285 -0.3322 -0.4508 +vn -0.8341 0.3290 0.4428 +vn -0.5393 -0.7223 -0.4329 +vn -0.8355 0.3575 0.4174 +vn 0.0036 0.5769 -0.8168 +vn -0.0036 -0.5769 0.8168 +vn -0.5316 -0.2988 -0.7925 +vn 0.8408 -0.4644 -0.2782 +vn -0.8408 0.4644 0.2782 +vn -0.0118 -0.7128 0.7013 +vn -0.5271 -0.7985 -0.2908 +vn 0.8455 -0.5338 -0.0136 +vn -0.0322 -0.0835 -0.9960 +vn 0.8409 -0.4167 -0.3455 +vn -0.5120 -0.7753 -0.3699 +vn 0.5133 0.7781 0.3621 +vn -0.8455 0.5337 0.0139 +vn 0.5229 0.8005 0.2931 +vn -0.0292 0.0569 -0.9980 +vn -0.8409 0.4167 0.3455 +vn -0.5310 -0.8463 0.0427 +vn 0.5305 0.8468 -0.0374 +vn 0.0176 -0.2647 0.9642 +vn 0.8448 -0.5346 0.0210 +vn 0.5301 0.8463 -0.0531 +vn -0.0057 -0.0310 -0.9995 +vn 0.5344 0.8365 0.1215 +vn 0.8468 -0.5320 -0.0027 +vn -0.8463 0.5325 0.0110 +vn -0.5301 -0.8462 0.0533 +vn -0.8477 0.5299 -0.0233 +vn -0.0171 -0.0897 -0.9958 +vn 0.0171 0.0897 0.9958 +vn -0.5341 -0.8368 -0.1203 +vn 0.8477 -0.5301 0.0199 +vn -0.8476 0.5302 -0.0199 +vn 0.0273 0.1260 0.9917 +vn -0.5301 -0.8470 0.0408 +vn 0.8476 -0.5286 0.0468 +vn 0.0091 -0.0867 -0.9962 +vn 0.8481 -0.5281 0.0424 +vn -0.5305 -0.8456 0.0589 +vn 0.5305 0.8457 -0.0574 +vn -0.8476 0.5286 -0.0468 +vn 0.5304 0.8467 -0.0409 +vn 0.0043 -0.0658 -0.9978 +vn -0.8480 0.5282 -0.0423 +vn -0.5306 -0.8454 0.0623 +vn 0.5305 0.8454 -0.0622 +vn 0.0005 0.0398 0.9992 +vn 0.8474 -0.5278 0.0573 +vn 0.5306 0.8449 -0.0676 +vn 0.0189 -0.0811 -0.9965 +vn 0.5305 0.8465 -0.0450 +vn 0.8476 -0.5282 0.0509 +vn -0.8476 0.5283 -0.0506 +vn -0.5306 -0.8450 0.0675 +vn -0.8475 0.5276 -0.0574 +vn 0.0169 -0.0959 -0.9952 +vn -0.0169 0.0959 0.9952 +vn -0.5305 -0.8465 0.0451 +vn 0.8474 -0.5271 0.0636 +vn -0.8474 0.5271 -0.0636 +vn -0.0136 0.0985 0.9950 +vn -0.5301 -0.8467 0.0472 +vn 0.8482 -0.5292 0.0199 +vn 0.0178 0.0093 -0.9998 +vn 0.8474 -0.5268 0.0660 +vn -0.5298 -0.8464 0.0540 +vn 0.5303 0.8461 -0.0546 +vn -0.8482 0.5292 -0.0199 +vn 0.5300 0.8467 -0.0471 +vn 0.0187 -0.0252 -0.9995 +vn -0.8474 0.5268 -0.0660 +vn -0.5292 -0.8485 -0.0022 +vn 0.5292 0.8485 0.0021 +vn -0.0194 0.0562 0.9982 +vn 0.8483 -0.5295 -0.0013 +vn 0.5269 0.8415 0.1191 +vn 0.0231 0.1492 -0.9885 +vn 0.5297 0.8479 -0.0237 +vn 0.8475 -0.5307 0.0081 +vn -0.8475 0.5307 -0.0083 +vn -0.5269 -0.8415 -0.1191 +vn -0.8481 0.5299 0.0015 +vn 0.0208 0.1036 -0.9944 +vn -0.0208 -0.1036 0.9944 +vn -0.5297 -0.8479 0.0237 +vn 0.8495 -0.5253 -0.0483 +vn -0.8495 0.5253 0.0483 +vn -0.0184 -0.0527 0.9984 +vn -0.5258 -0.8376 -0.1483 +vn 0.8501 -0.5216 -0.0722 +vn 0.0237 0.1605 -0.9868 +vn 0.8490 -0.5278 -0.0241 +vn -0.5264 -0.8403 -0.1294 +vn 0.5264 0.8401 0.1311 +vn -0.8501 0.5216 0.0721 +vn 0.5262 0.8373 0.1481 +vn 0.0247 0.1819 -0.9830 +vn -0.8490 0.5278 0.0241 +vn -0.5259 -0.8348 -0.1626 +vn 0.5259 0.8349 0.1623 +vn -0.0245 -0.1768 0.9839 +vn 0.8494 -0.5252 -0.0517 +vn 0.5286 0.8484 0.0263 +vn 0.0145 -0.0180 -0.9997 +vn 0.5258 0.8335 0.1695 +vn 0.8488 -0.5256 -0.0582 +vn -0.8497 0.5241 0.0576 +vn -0.5286 -0.8484 -0.0270 +vn -0.8494 0.5252 0.0519 +vn 0.0181 0.0508 -0.9985 +vn -0.0181 -0.0508 0.9985 +vn -0.5258 -0.8336 -0.1695 +vn 0.8484 -0.5293 0.0029 +vn -0.8485 0.5292 -0.0030 +vn -0.0213 -0.1132 0.9933 +vn -0.5285 -0.8489 0.0057 +vn 0.8471 -0.5277 0.0632 +vn 0.0846 0.0073 -0.9964 +vn 0.8490 -0.5276 -0.0283 +vn -0.5279 -0.8492 -0.0145 +vn 0.5271 0.8496 0.0179 +vn -0.8471 0.5277 -0.0632 +vn 0.5285 0.8489 -0.0062 +vn 0.0572 -0.0198 -0.9982 +vn 0.0572 -0.0199 -0.9982 +vn -0.8491 0.5275 0.0284 +vn -0.5263 -0.8494 -0.0392 +vn 0.5263 0.8494 0.0400 +vn -0.0262 0.0462 0.9986 +vn 0.8464 -0.5274 0.0741 +vn 0.5288 0.8486 0.0167 +vn 0.0850 -0.0815 -0.9930 +vn 0.5293 0.8484 -0.0120 +vn 0.8463 -0.5281 0.0696 +vn -0.8470 0.5270 -0.0693 +vn -0.5287 -0.8486 -0.0178 +vn -0.8464 0.5274 -0.0740 +vn 0.0997 -0.0187 -0.9948 +vn -0.0997 0.0187 0.9948 +vn -0.5292 -0.8484 0.0119 +vn 0.8431 -0.5278 0.1031 +vn -0.8432 0.5277 -0.1030 +vn -0.0987 -0.0083 0.9951 +vn -0.5356 -0.8383 0.1014 +vn 0.8404 -0.4955 0.2194 +vn -0.1596 -0.6663 -0.7284 +vn 0.8449 -0.5280 0.0861 +vn -0.5244 -0.8503 0.0437 +vn 0.5286 0.8457 -0.0741 +vn -0.8404 0.4954 -0.2195 +vn 0.5310 0.8421 -0.0945 +vn -0.0358 -0.4038 -0.9142 +vn -0.8449 0.5279 -0.0860 +vn -0.5310 -0.7094 0.4633 +vn 0.5292 0.6911 -0.4922 +vn -0.0472 0.1960 0.9795 +vn 0.8393 -0.4672 0.2779 +vn 0.3535 0.0938 -0.9307 +vn -0.4288 -0.8781 -0.2120 +vn 0.5422 0.8035 -0.2456 +vn 0.8312 -0.4900 0.2628 +vn -0.8289 0.4948 -0.2612 +vn -0.3533 -0.0933 0.9309 +vn -0.8453 0.4591 -0.2732 +vn -0.3586 -0.8906 -0.2796 +vn 0.3586 0.8906 0.2796 +vn -0.5424 -0.8040 0.2439 +vn 0.8479 -0.4530 0.2755 +vn -0.8479 0.4529 -0.2755 +vn 0.2750 0.8495 0.4501 +vn -0.3247 -0.0272 0.9454 +vn 0.8239 -0.5012 0.2646 +vn -0.5189 -0.8542 0.0345 +vn 0.8622 -0.4179 0.2863 +vn -0.3386 -0.0596 0.9391 +vn 0.3450 0.0752 -0.9356 +vn -0.8239 0.5012 -0.2646 +vn 0.3216 0.0280 -0.9465 +vn -0.5071 -0.8595 -0.0640 +vn -0.8625 0.4158 -0.2885 +vn -0.2340 0.1239 0.9643 +vn 0.2340 -0.1238 -0.9643 +vn 0.4779 0.8660 0.1473 +vn 0.8363 -0.4794 0.2661 +vn 0.0735 -0.3890 -0.9183 +vn -0.4646 -0.8066 0.3655 +vn 0.2835 -0.0403 -0.9581 +vn 0.8316 -0.4859 0.2690 +vn -0.8323 0.4855 -0.2674 +vn -0.0736 0.3888 0.9184 +vn -0.8361 0.4797 -0.2660 +vn -0.4960 -0.8298 0.2556 +vn 0.4960 0.8298 -0.2556 +vn -0.2836 0.0399 0.9581 +vn 0.8722 -0.4208 0.2494 +vn -0.8722 0.4208 -0.2492 +vn 0.5149 0.8453 -0.1430 +vn -0.0201 0.4727 0.8810 +vn 0.9345 -0.3065 0.1812 +vn -0.3328 -0.7048 0.6265 +vn 0.8518 -0.4550 0.2597 +vn -0.0396 0.4296 0.9022 +vn 0.0405 -0.4276 -0.9031 +vn -0.9348 0.3057 -0.1806 +vn 0.0197 -0.4732 -0.8808 +vn -0.3788 -0.7415 0.5538 +vn -0.8517 0.4553 -0.2595 +vn 0.0547 0.6245 0.7791 +vn -0.0541 -0.6223 -0.7809 +vn 0.4241 0.7761 -0.4667 +vn 0.9471 -0.2783 0.1602 +vn -0.0935 -0.7088 -0.6992 +vn -0.2445 -0.6301 0.7370 +vn -0.0214 -0.5586 -0.8291 +vn 0.9406 -0.2911 0.1747 +vn -0.9404 0.2914 -0.1751 +vn 0.0935 0.7088 0.6992 +vn -0.9471 0.2784 -0.1596 +vn 0.2445 0.6301 -0.7370 +vn 0.0226 0.5599 0.8283 +vn 0.9569 -0.2574 0.1348 +vn -0.9569 0.2574 -0.1348 +vn 0.4814 0.8577 0.1808 +vn 0.2886 -0.3679 0.8840 +vn -0.8251 0.3728 0.4245 +vn -0.4890 -0.8471 -0.2081 +vn -0.2886 0.3679 -0.8840 +vn 0.8251 -0.3728 -0.4245 +vn -0.4814 -0.8577 -0.1808 +vn 0.2886 -0.3678 0.8840 +vn -0.2885 0.3679 -0.8840 +vn -0.8258 0.3716 0.4243 +vn -0.2562 0.4230 -0.8692 +vn -0.4988 -0.8313 -0.2452 +vn -0.8256 0.3719 0.4243 +vn 0.8256 -0.3719 -0.4243 +vn 0.2561 -0.4231 0.8691 +vn 0.8258 -0.3716 -0.4243 +vn -0.5017 -0.8262 -0.2565 +vn 0.5017 0.8262 0.2565 +vn -0.8265 0.3704 0.4239 +vn 0.8265 -0.3704 -0.4239 +vn 0.4975 0.8336 0.2400 +vn 0.2752 -0.3908 0.8784 +vn -0.8230 0.3766 0.4252 +vn -0.4454 -0.8928 -0.0673 +vn -0.8264 0.3705 0.4239 +vn 0.2700 -0.3999 0.8759 +vn -0.2717 0.3970 -0.8767 +vn 0.8230 -0.3766 -0.4252 +vn -0.2748 0.3918 -0.8781 +vn -0.4697 -0.8714 -0.1417 +vn 0.8264 -0.3705 -0.4239 +vn 0.3369 -0.2789 0.8993 +vn -0.3367 0.2793 -0.8992 +vn 0.4883 0.8481 0.2056 +vn -0.8243 0.3736 0.4253 +vn -0.3768 0.1992 -0.9046 +vn -0.3732 -0.9266 -0.0465 +vn -0.2984 0.3504 -0.8878 +vn -0.8246 0.3736 0.4247 +vn 0.8245 -0.3739 -0.4248 +vn 0.3768 -0.1992 0.9046 +vn 0.8245 -0.3738 -0.4247 +vn -0.3954 -0.9181 -0.0259 +vn 0.3954 0.9181 0.0259 +vn 0.2983 -0.3506 0.8877 +vn -0.8432 0.3304 0.4241 +vn 0.8433 -0.3301 -0.4242 +vn 0.4194 0.9077 0.0142 +vn 0.3841 -0.1795 0.9057 +vn -0.8445 0.3292 0.4224 +vn -0.3110 -0.9359 0.1657 +vn -0.8285 0.3644 0.4252 +vn 0.3844 -0.1820 0.9051 +vn -0.3853 0.1801 -0.9051 +vn 0.8446 -0.3282 -0.4231 +vn -0.3846 0.1811 -0.9051 +vn -0.3333 -0.9421 0.0372 +vn 0.8284 -0.3647 -0.4251 +vn 0.4244 -0.0680 0.9029 +vn -0.4263 0.0623 -0.9024 +vn 0.3527 0.9352 0.0314 +vn -0.8188 0.3931 0.4184 +vn -0.5938 -0.4815 -0.6446 +vn -0.1708 -0.6069 0.7762 +vn -0.3964 0.1476 -0.9061 +vn -0.8159 0.3718 0.4428 +vn 0.8249 -0.3737 -0.4242 +vn 0.5941 0.4827 0.6435 +vn 0.8197 -0.3909 -0.4186 +vn -0.2286 -0.7692 0.5967 +vn 0.2286 0.7692 -0.5967 +vn 0.3963 -0.1476 0.9062 +vn -0.7752 0.5470 0.3159 +vn 0.7755 -0.5462 -0.3166 +vn 0.2777 0.8866 -0.3698 +vn 0.6142 0.6347 0.4690 +vn -0.7512 0.6577 0.0559 +vn 0.0981 0.0951 0.9906 +vn -0.8013 0.4610 0.3814 +vn 0.5797 0.5703 0.5820 +vn -0.5799 -0.5803 -0.5718 +vn 0.7516 -0.6573 -0.0553 +vn -0.6141 -0.6322 -0.4724 +vn 0.0074 -0.1476 0.9890 +vn 0.8003 -0.4630 -0.3811 +vn 0.6535 0.7566 -0.0240 +vn -0.6533 -0.7569 0.0186 +vn 0.0967 0.4128 -0.9057 +vn -0.7561 0.6544 -0.0102 +vn -0.6167 -0.7065 0.3472 +vn 0.1706 0.2972 0.9394 +vn -0.6541 -0.7207 -0.2296 +vn -0.7241 0.6892 0.0263 +vn 0.7262 -0.6867 -0.0344 +vn 0.6167 0.7065 -0.3471 +vn 0.7477 -0.6640 0.0100 +vn 0.1714 0.2999 0.9385 +vn -0.1713 -0.2999 -0.9385 +vn 0.6552 0.7200 0.2285 +vn -0.7677 0.6374 -0.0667 +vn 0.7677 -0.6374 0.0667 +vn -0.1497 -0.2387 -0.9595 +vn 0.6236 0.7187 -0.3076 +vn -0.7570 0.6534 0.0044 +vn 0.1041 0.1051 0.9890 +vn -0.7656 0.6408 -0.0565 +vn 0.6221 0.7200 -0.3075 +vn -0.6228 -0.7175 0.3118 +vn 0.7570 -0.6534 -0.0046 +vn -0.6238 -0.7192 0.3060 +vn 0.1236 0.1633 0.9788 +vn 0.7657 -0.6408 0.0559 +vn 0.6436 0.7479 -0.1624 +vn -0.6439 -0.7483 0.1599 +vn -0.1541 -0.2499 -0.9559 +vn -0.7561 0.6543 0.0105 +vn -0.6450 -0.7489 0.1521 +vn 0.1094 0.1064 0.9883 +vn -0.6328 -0.7337 0.2475 +vn -0.7577 0.6527 0.0006 +vn 0.7558 -0.6548 -0.0002 +vn 0.6450 0.7489 -0.1521 +vn 0.7562 -0.6543 -0.0104 +vn 0.1086 0.1050 0.9885 +vn -0.1086 -0.1050 -0.9885 +vn 0.6328 0.7337 -0.2475 +vn -0.7563 0.6541 0.0134 +vn 0.7563 -0.6541 -0.0134 +vn -0.1049 -0.1001 -0.9894 +vn 0.6453 0.7493 -0.1488 +vn -0.7563 0.6541 0.0135 +vn 0.0908 0.0843 0.9923 +vn -0.7563 0.6541 0.0138 +vn 0.6454 0.7493 -0.1486 +vn -0.6454 -0.7493 0.1486 +vn 0.7563 -0.6541 -0.0135 +vn -0.6453 -0.7493 0.1487 +vn 0.0998 0.0952 0.9904 +vn 0.7563 -0.6541 -0.0138 +vn 0.6473 0.7511 -0.1298 +vn -0.6473 -0.7511 0.1298 +vn -0.1063 -0.1029 -0.9890 +vn -0.7563 0.6541 0.0136 +vn -0.6502 -0.7538 0.0956 +vn 0.0617 0.0718 0.9955 +vn -0.6459 -0.7498 0.1436 +vn 0.6502 0.7538 -0.0956 +vn 0.7563 -0.6541 -0.0136 +vn 0.0720 0.0672 0.9951 +vn -0.0720 -0.0672 -0.9951 +vn 0.6459 0.7498 -0.1436 +vn -0.7569 0.6535 0.0056 +vn 0.7569 -0.6535 -0.0056 +vn -0.0812 -0.0727 -0.9940 +vn 0.6505 0.7541 -0.0908 +vn -0.7576 0.6527 -0.0055 +vn 0.0373 0.0414 0.9984 +vn 0.6503 0.7539 -0.0934 +vn -0.6503 -0.7539 0.0935 +vn 0.7576 -0.6527 0.0055 +vn -0.6505 -0.7541 0.0907 +vn 0.0423 0.0639 0.9971 +vn 0.6515 0.7558 -0.0662 +vn -0.6515 -0.7557 0.0662 +vn -0.0512 -0.0733 -0.9960 +vn -0.7566 0.6538 0.0125 +vn -0.6541 -0.7564 -0.0030 +vn 0.0446 -0.0652 0.9969 +vn -0.6508 -0.7546 0.0838 +vn -0.7568 0.6536 0.0069 +vn 0.7569 -0.6535 -0.0064 +vn 0.6541 0.7564 0.0031 +vn 0.7567 -0.6537 -0.0126 +vn 0.0405 -0.0241 0.9989 +vn -0.0405 0.0241 -0.9989 +vn 0.6508 0.7546 -0.0838 +vn -0.7550 0.6529 0.0601 +vn 0.7550 -0.6529 -0.0600 +vn -0.0370 -0.0100 -0.9993 +vn 0.6550 0.7535 0.0574 +vn -0.7486 0.6278 0.2132 +vn 0.0297 -0.3131 0.9493 +vn -0.7561 0.6536 0.0327 +vn 0.6514 0.7576 0.0414 +vn -0.6538 -0.7558 -0.0359 +vn 0.7486 -0.6277 -0.2134 +vn -0.6550 -0.7534 -0.0587 +vn 0.0340 -0.2477 0.9682 +vn 0.7562 -0.6536 -0.0326 +vn 0.6616 0.7240 0.1954 +vn -0.6616 -0.7237 -0.1963 +vn -0.0416 0.1472 -0.9882 +vn -0.7478 0.6239 0.2270 +vn -0.6582 -0.7417 -0.1288 +vn 0.0551 -0.1427 0.9882 +vn -0.6592 -0.7407 -0.1297 +vn -0.7492 0.6281 0.2103 +vn 0.7457 -0.6314 -0.2127 +vn 0.6582 0.7417 0.1291 +vn 0.7478 -0.6240 -0.2268 +vn 0.0398 -0.2709 0.9618 +vn -0.0398 0.2709 -0.9618 +vn 0.6590 0.7408 0.1300 +vn -0.7499 0.6379 0.1751 +vn 0.7502 -0.6377 -0.1747 +vn -0.0314 0.3232 -0.9458 +vn 0.6394 0.7689 -0.0060 +vn -0.7704 0.6288 -0.1052 +vn 0.1078 0.3429 0.9332 +vn -0.7484 0.6221 0.2300 +vn 0.6483 0.7589 0.0620 +vn -0.6458 -0.7621 -0.0455 +vn 0.7704 -0.6289 0.1050 +vn -0.6423 -0.7665 0.0034 +vn 0.0886 0.2076 0.9742 +vn 0.7482 -0.6226 -0.2292 +vn 0.6284 0.7273 -0.2760 +vn -0.6283 -0.7276 0.2754 +vn -0.0729 -0.0347 -0.9967 +vn -0.7726 0.6095 -0.1778 +vn -0.5764 -0.5257 0.6256 +vn 0.1231 0.7670 0.6297 +vn -0.6382 -0.7538 0.1564 +vn -0.7601 0.6332 -0.1456 +vn 0.7602 -0.6331 0.1457 +vn 0.5764 0.5258 -0.6256 +vn 0.7726 -0.6098 0.1767 +vn 0.1341 0.6215 0.7719 +vn 0.6392 0.7531 -0.1557 +vn -0.8036 0.4920 -0.3351 +vn 0.8038 -0.4912 0.3356 +vn -0.1271 -0.4698 -0.8736 +vn 0.5444 0.4245 -0.7235 +vn -0.8391 0.1971 -0.5070 +vn 0.0544 0.9711 0.2323 +vn -0.7885 0.5645 -0.2444 +vn 0.5424 0.4871 -0.6845 +vn -0.5441 -0.4907 0.6806 +vn 0.8391 -0.1973 0.5069 +vn -0.5440 -0.4233 0.7244 +vn 0.0659 0.9434 0.3249 +vn 0.7884 -0.5641 0.2453 +vn 0.5397 0.2019 -0.8173 +vn -0.5397 -0.2024 0.8172 +vn -0.0968 -0.8742 -0.4758 +vn -0.8397 0.1319 -0.5268 +vn -0.5288 0.0581 0.8468 +vn 0.0137 0.9941 -0.1080 +vn -0.5461 -0.3002 0.7821 +vn -0.8317 0.1721 -0.5279 +vn 0.8319 -0.1755 0.5264 +vn 0.5288 -0.0583 -0.8467 +vn 0.8397 -0.1321 0.5267 +vn 0.0278 0.9996 0.0021 +vn -0.0278 -0.9996 -0.0021 +vn 0.5458 0.3001 -0.7823 +vn -0.8476 -0.0122 -0.5305 +vn 0.8476 0.0119 0.5305 +vn -0.0417 -0.9918 -0.1205 +vn 0.5235 -0.1317 -0.8418 +vn -0.8485 -0.1661 -0.5024 +vn -0.0191 0.9518 -0.3061 +vn -0.8455 0.0614 -0.5304 +vn 0.5229 -0.0949 -0.8471 +vn -0.5191 0.0893 0.8500 +vn 0.8485 0.1661 0.5024 +vn -0.5234 0.1327 0.8417 +vn -0.0104 0.9641 -0.2653 +vn 0.8456 -0.0616 0.5303 +vn 0.5287 -0.2399 -0.8142 +vn -0.5286 0.2394 0.8144 +vn -0.0007 -0.9800 0.1991 +vn -0.8483 -0.1830 -0.4969 +vn -0.5287 0.2438 0.8130 +vn -0.0311 0.9572 -0.2878 +vn -0.5280 0.1990 0.8256 +vn -0.8472 -0.1708 -0.5031 +vn 0.8472 0.1694 0.5035 +vn 0.5287 -0.2437 -0.8131 +vn 0.8479 0.1831 0.4974 +vn -0.0292 0.9489 -0.3142 +vn 0.0292 -0.9489 0.3143 +vn 0.5282 -0.1989 -0.8255 +vn -0.8482 -0.1865 -0.4957 +vn 0.8482 0.1866 0.4957 +vn 0.0253 -0.9464 0.3219 +vn 0.5272 -0.2105 -0.8233 +vn -0.8506 -0.1114 -0.5140 +vn -0.0274 0.9922 -0.1214 +vn -0.8480 -0.1943 -0.4931 +vn 0.5262 -0.2222 -0.8208 +vn -0.5279 0.2241 0.8192 +vn 0.8506 0.1106 0.5141 +vn -0.5272 0.2101 0.8234 +vn -0.0299 0.9817 -0.1882 +vn -0.0298 0.9817 -0.1882 +vn 0.8480 0.1944 0.4931 +vn 0.5246 -0.1243 -0.8422 +vn -0.5249 0.1259 0.8418 +vn 0.0313 -0.9691 0.2449 +vn -0.8506 -0.0678 -0.5214 +vn -0.5199 -0.0550 0.8525 +vn -0.0308 0.9967 0.0754 +vn -0.5262 0.1725 0.8327 +vn -0.8494 -0.0869 -0.5206 +vn 0.8494 0.0870 0.5205 +vn 0.5199 0.0548 -0.8525 +vn 0.8506 0.0679 0.5215 +vn -0.0274 0.9995 0.0149 +vn 0.0274 -0.9995 -0.0149 +vn 0.5263 -0.1726 -0.8326 +vn -0.8536 -0.0000 -0.5210 +vn 0.8535 -0.0001 0.5210 +vn 0.0258 -0.9984 0.0506 +vn 0.5176 0.1028 -0.8494 +vn -0.8559 0.0671 -0.5127 +vn -0.0426 0.9779 0.2045 +vn -0.8529 -0.0265 -0.5215 +vn 0.5165 0.0780 -0.8527 +vn -0.5164 -0.0792 0.8527 +vn 0.8559 -0.0671 0.5127 +vn -0.5173 -0.1025 0.8497 +vn -0.0392 0.9839 0.1746 +vn 0.8527 0.0256 0.5217 +vn 0.5153 0.1895 -0.8358 +vn -0.5152 -0.1900 0.8357 +vn 0.0351 -0.9910 -0.1294 +vn -0.8561 0.0724 -0.5117 +vn -0.5148 -0.2023 0.8331 +vn -0.0484 0.9805 0.1904 +vn -0.5169 -0.1491 0.8430 +vn -0.8559 0.0662 -0.5129 +vn 0.8555 -0.0664 0.5135 +vn 0.5148 0.2024 -0.8331 +vn 0.8561 -0.0724 0.5117 +vn -0.0473 0.9757 0.2141 +vn 0.0473 -0.9757 -0.2141 +vn 0.5169 0.1491 -0.8430 +vn -0.8559 0.0669 -0.5128 +vn 0.8559 -0.0668 0.5127 +vn 0.0453 -0.9748 -0.2183 +vn 0.5152 0.1683 -0.8404 +vn -0.8520 -0.0122 -0.5234 +vn -0.0450 0.9990 0.0080 +vn -0.8564 0.0752 -0.5109 +vn 0.5155 0.1813 -0.8375 +vn -0.5156 -0.1791 0.8379 +vn 0.8520 0.0123 0.5234 +vn -0.5160 -0.1691 0.8397 +vn -0.0473 0.9953 0.0849 +vn 0.8564 -0.0752 0.5109 +vn 0.5210 0.0702 -0.8506 +vn -0.5211 -0.0690 0.8507 +vn 0.0484 -0.9880 -0.1470 +vn -0.8487 -0.0541 -0.5262 +vn -0.5305 0.1657 0.8313 +vn -0.0339 0.9709 -0.2372 +vn -0.5183 -0.1290 0.8454 +vn -0.8476 -0.0346 -0.5294 +vn 0.8488 0.0350 0.5276 +vn 0.5306 -0.1665 -0.8311 +vn 0.8487 0.0539 0.5261 +vn -0.0375 0.9853 -0.1665 +vn 0.0375 -0.9853 0.1665 +vn 0.5182 0.1289 -0.8455 +vn -0.8463 -0.1450 -0.5126 +vn 0.8463 0.1442 0.5127 +vn 0.0417 -0.9961 0.0782 +vn 0.5293 -0.2279 -0.8173 +vn -0.8418 -0.2800 -0.4614 +vn -0.0199 0.8308 -0.5562 +vn -0.8481 -0.0992 -0.5205 +vn 0.5267 -0.1916 -0.8282 +vn -0.5266 0.1931 0.8279 +vn 0.8418 0.2801 0.4614 +vn -0.5304 0.2266 0.8169 +vn -0.0260 0.9065 -0.4215 +vn 0.8481 0.0990 0.5204 +vn 0.5372 -0.3991 -0.7430 +vn -0.5372 0.4004 0.7423 +vn 0.0297 -0.9456 0.3239 +vn -0.8332 -0.3598 -0.4199 +vn -0.5426 0.7204 0.4320 +vn 0.0043 0.4471 -0.8945 +vn -0.5349 0.2980 0.7906 +vn -0.8262 -0.3338 -0.4537 +vn 0.8319 0.3306 0.4457 +vn 0.5426 -0.7203 -0.4321 +vn 0.8333 0.3593 0.4202 +vn -0.0036 0.5773 -0.8165 +vn 0.0036 -0.5773 0.8165 +vn 0.5348 -0.2981 -0.7907 +vn -0.8386 -0.4672 -0.2801 +vn 0.8387 0.4671 0.2801 +vn 0.0118 -0.7132 0.7008 +vn 0.5265 -0.7992 -0.2901 +vn -0.8434 -0.5371 -0.0136 +vn 0.0322 -0.0833 -0.9960 +vn -0.8387 -0.4189 -0.3479 +vn 0.5216 -0.7687 -0.3701 +vn -0.5201 0.7737 0.3617 +vn 0.8434 0.5371 0.0139 +vn -0.5308 0.7950 0.2936 +vn 0.0291 0.0575 -0.9979 +vn 0.8387 0.4190 0.3479 +vn 0.5344 -0.8442 0.0425 +vn -0.5339 0.8447 -0.0371 +vn -0.0176 -0.2654 0.9640 +vn -0.8456 -0.5334 0.0226 +vn -0.5335 0.8442 -0.0529 +vn 0.0057 -0.0310 -0.9995 +vn -0.5375 0.8345 0.1215 +vn -0.8331 -0.5531 -0.0075 +vn 0.8339 0.5517 0.0149 +vn 0.5335 -0.8442 0.0531 +vn 0.8426 0.5380 -0.0222 +vn 0.0171 -0.0899 -0.9958 +vn -0.0171 0.0899 0.9958 +vn 0.5377 -0.8343 -0.1214 +vn -0.8456 -0.5335 0.0202 +vn 0.8455 0.5336 -0.0202 +vn -0.0273 0.1261 0.9916 +vn 0.5338 -0.8447 0.0406 +vn -0.8455 -0.5319 0.0470 +vn -0.0091 -0.0866 -0.9962 +vn -0.8459 -0.5316 0.0427 +vn 0.5331 -0.8440 0.0591 +vn -0.5331 0.8441 -0.0576 +vn 0.8455 0.5319 -0.0470 +vn -0.5334 0.8449 -0.0410 +vn -0.0042 -0.0657 -0.9978 +vn 0.8460 0.5314 -0.0429 +vn 0.5339 -0.8433 0.0621 +vn -0.5339 0.8433 -0.0620 +vn -0.0005 0.0397 0.9992 +vn -0.8454 -0.5310 0.0576 +vn -0.5339 0.8429 -0.0674 +vn -0.0189 -0.0812 -0.9965 +vn -0.5338 0.8444 -0.0449 +vn -0.8452 -0.5320 0.0510 +vn 0.8452 0.5320 -0.0507 +vn 0.5339 -0.8429 0.0673 +vn 0.8453 0.5311 -0.0576 +vn -0.0169 -0.0960 -0.9952 +vn 0.0169 0.0960 0.9952 +vn 0.5338 -0.8444 0.0449 +vn -0.8453 -0.5304 0.0639 +vn 0.8453 0.5304 -0.0639 +vn 0.0136 0.0985 0.9950 +vn 0.5334 -0.8446 0.0470 +vn -0.8461 -0.5326 0.0200 +vn -0.0178 0.0092 -0.9998 +vn -0.8453 -0.5302 0.0663 +vn 0.5332 -0.8443 0.0539 +vn -0.5336 0.8440 -0.0545 +vn 0.8461 0.5326 -0.0200 +vn -0.5334 0.8446 -0.0469 +vn -0.0187 -0.0253 -0.9995 +vn 0.8453 0.5302 -0.0663 +vn 0.5325 -0.8464 -0.0022 +vn -0.5325 0.8464 0.0021 +vn 0.0194 0.0563 0.9982 +vn -0.8459 -0.5333 -0.0015 +vn -0.5303 0.8395 0.1187 +vn -0.0231 0.1491 -0.9885 +vn -0.5330 0.8458 -0.0236 +vn -0.8458 -0.5334 0.0083 +vn 0.8458 0.5334 -0.0085 +vn 0.5303 -0.8395 -0.1187 +vn 0.8462 0.5329 0.0014 +vn -0.0207 0.1034 -0.9944 +vn 0.0207 -0.1034 0.9944 +vn 0.5330 -0.8458 0.0236 +vn -0.8474 -0.5287 -0.0487 +vn 0.8474 0.5287 0.0487 +vn 0.0184 -0.0525 0.9984 +vn 0.5296 -0.8352 -0.1481 +vn -0.8481 -0.5249 -0.0729 +vn -0.0237 0.1606 -0.9867 +vn -0.8469 -0.5312 -0.0244 +vn 0.5288 -0.8389 -0.1289 +vn -0.5287 0.8387 0.1305 +vn 0.8481 0.5249 0.0728 +vn -0.5291 0.8356 0.1476 +vn -0.0247 0.1819 -0.9830 +vn 0.8469 0.5312 0.0243 +vn 0.5293 -0.8327 -0.1625 +vn -0.5293 0.8328 0.1622 +vn 0.0245 -0.1767 0.9840 +vn -0.8473 -0.5285 -0.0523 +vn -0.5320 0.8463 0.0265 +vn -0.0145 -0.0178 -0.9997 +vn -0.5292 0.8315 0.1692 +vn -0.8467 -0.5289 -0.0587 +vn 0.8476 0.5274 0.0582 +vn 0.5320 -0.8463 -0.0267 +vn 0.8473 0.5285 0.0525 +vn -0.0181 0.0510 -0.9985 +vn 0.0181 -0.0510 0.9985 +vn 0.5292 -0.8315 -0.1692 +vn -0.8463 -0.5327 0.0027 +vn 0.8464 0.5326 -0.0028 +vn 0.0213 -0.1134 0.9933 +vn 0.5318 -0.8468 0.0055 +vn -0.8450 -0.5311 0.0631 +vn -0.0846 0.0073 -0.9964 +vn -0.8470 -0.5308 -0.0288 +vn 0.5313 -0.8471 -0.0147 +vn -0.5304 0.8476 0.0180 +vn 0.8450 0.5311 -0.0631 +vn -0.5318 0.8468 -0.0060 +vn -0.0571 -0.0200 -0.9982 +vn 0.8469 0.5309 0.0286 +vn 0.5297 -0.8473 -0.0393 +vn -0.5296 0.8473 0.0402 +vn 0.0261 0.0462 0.9986 +vn -0.8443 -0.5308 0.0738 +vn -0.5321 0.8465 0.0172 +vn -0.0851 -0.0812 -0.9931 +vn -0.5326 0.8463 -0.0121 +vn -0.8442 -0.5315 0.0694 +vn 0.8449 0.5304 -0.0692 +vn 0.5319 -0.8466 -0.0182 +vn 0.8443 0.5308 -0.0738 +vn -0.0997 -0.0186 -0.9948 +vn 0.0997 0.0186 0.9948 +vn 0.5326 -0.8463 0.0117 +vn -0.8410 -0.5312 0.1029 +vn 0.8411 0.5310 -0.1029 +vn 0.0987 -0.0083 0.9951 +vn 0.5352 -0.8385 0.1023 +vn -0.8383 -0.4983 0.2212 +vn 0.1591 -0.6654 -0.7293 +vn -0.8428 -0.5313 0.0857 +vn 0.5351 -0.8439 0.0392 +vn -0.5363 0.8410 -0.0713 +vn 0.8383 0.4983 -0.2214 +vn -0.5386 0.8376 -0.0909 +vn 0.0354 -0.4029 -0.9146 +vn 0.8428 0.5313 -0.0859 +vn 0.5378 -0.7096 0.4552 +vn -0.5335 0.6896 -0.4898 +vn 0.0475 0.1954 0.9796 +vn -0.8425 -0.4627 0.2758 +vn -0.3569 0.0922 -0.9296 +vn 0.4286 -0.8782 -0.2122 +vn -0.5456 0.8017 -0.2440 +vn -0.8252 -0.4970 0.2685 +vn 0.8258 0.4981 -0.2644 +vn 0.3567 -0.0916 0.9297 +vn 0.8370 0.4688 -0.2823 +vn 0.3583 -0.8907 -0.2799 +vn -0.3583 0.8907 0.2799 +vn 0.5455 -0.8021 0.2432 +vn -0.8467 -0.4530 0.2790 +vn 0.8468 0.4529 -0.2790 +vn -0.2747 0.8492 0.4509 +vn 0.3249 -0.0263 0.9454 +vn -0.8229 -0.5008 0.2684 +vn 0.5189 -0.8542 0.0341 +vn -0.8609 -0.4166 0.2921 +vn 0.3417 -0.0581 0.9380 +vn -0.3484 0.0738 -0.9344 +vn 0.8229 0.5008 -0.2684 +vn -0.3281 0.0258 -0.9443 +vn 0.5070 -0.8595 -0.0644 +vn 0.5070 -0.8595 -0.0643 +vn 0.8607 0.4186 -0.2898 +vn 0.2375 0.1255 0.9632 +vn -0.2375 -0.1255 -0.9632 +vn -0.4778 0.8660 0.1476 +vn -0.8355 -0.4787 0.2699 +vn -0.0771 -0.3903 -0.9175 +vn 0.4648 -0.8067 0.3651 +vn -0.2870 -0.0417 -0.9570 +vn -0.8307 -0.4853 0.2729 +vn 0.8315 0.4849 -0.2712 +vn 0.0773 0.3898 0.9177 +vn 0.8353 0.4790 -0.2699 +vn 0.4961 -0.8299 0.2552 +vn -0.4961 0.8299 -0.2552 +vn 0.2871 0.0415 0.9570 +vn -0.8718 -0.4194 0.2531 +vn 0.8719 0.4194 -0.2528 +vn -0.5149 0.8453 -0.1426 +vn 0.0235 0.4739 0.8802 +vn -0.9346 -0.3042 0.1844 +vn 0.3330 -0.7049 0.6263 +vn -0.8510 -0.4543 0.2633 +vn 0.0445 0.4311 0.9012 +vn -0.0458 -0.4293 -0.9020 +vn 0.9346 0.3043 -0.1845 +vn -0.0233 -0.4745 -0.8800 +vn 0.3790 -0.7416 0.5535 +vn 0.8513 0.4538 -0.2634 +vn -0.0509 0.6254 0.7786 +vn 0.0503 -0.6233 -0.7804 +vn -0.4242 0.7762 -0.4664 +vn -0.9473 -0.2759 0.1627 +vn 0.0897 -0.7098 -0.6986 +vn 0.2445 -0.6301 0.7370 +vn 0.0184 -0.5602 -0.8282 +vn -0.9407 -0.2876 0.1799 +vn 0.9405 0.2880 -0.1801 +vn -0.0897 0.7098 0.6987 +vn 0.9473 0.2757 -0.1632 +vn 0.2446 -0.6302 0.7369 +vn -0.2446 0.6302 -0.7369 +vn -0.0180 0.5603 0.8281 +vn -0.9572 -0.2546 0.1375 +vn 0.9572 0.2546 -0.1375 +vn -0.0000 0.0001 -1.0000 +vn 0.0001 -1.0000 0.0001 +vn -0.0001 -0.0000 -1.0000 +vn -0.0001 1.0000 -0.0000 +vn 0.2543 0.3761 -0.8910 +vn 0.2703 0.3920 -0.8794 +vn 0.2703 0.3920 -0.8793 +vn 0.2941 0.3940 -0.8708 +vn -0.2704 -0.3919 0.8794 +vn -0.2941 -0.3941 0.8708 +vn -0.2543 -0.3761 0.8910 +vn -0.2728 -0.3876 0.8805 +vn 0.8241 0.3783 0.4216 +vn 0.8268 0.3741 0.4200 +vn 0.8264 0.3741 0.4210 +vn 0.8263 0.3741 0.4210 +vn 0.8262 0.3735 0.4217 +vn -0.2676 -0.3967 0.8781 +vn 0.2693 0.3938 -0.8789 +vn -0.8241 -0.3783 -0.4216 +vn -0.8264 -0.3741 -0.4210 +vn -0.8262 -0.3735 -0.4217 +vn -0.8263 -0.3741 -0.4210 +vn -0.8268 -0.3741 -0.4200 +vn 0.8256 0.3749 0.4218 +vn 0.3738 0.1972 -0.9063 +vn 0.3738 0.1975 -0.9062 +vn 0.3736 0.1976 -0.9063 +vn 0.4346 0.2929 -0.8517 +vn 0.3626 0.2224 -0.9050 +vn 0.3624 0.2229 -0.9050 +vn 0.2533 0.2129 -0.9437 +vn 0.2959 0.3473 -0.8898 +vn 0.8258 0.3752 0.4211 +vn -0.8256 -0.3754 -0.4212 +vn -0.3737 -0.1975 0.9063 +vn -0.3738 -0.1974 0.9062 +vn -0.8258 -0.3751 -0.4211 +vn -0.3633 -0.2210 0.9051 +vn -0.2587 -0.2136 0.9421 +vn -0.3631 -0.2214 0.9051 +vn -0.4311 -0.2894 0.8546 +vn -0.2958 -0.3475 0.8898 +vn 0.8446 0.3313 0.4206 +vn -0.8448 -0.3309 -0.4205 +vn -0.3809 -0.1780 0.9073 +vn 0.8470 0.3273 0.4189 +vn 0.8463 0.3282 0.4196 +vn 0.8296 0.3232 0.4553 +vn 0.8504 0.3178 0.4193 +vn 0.8505 0.3176 0.4193 +vn 0.8602 0.3360 0.3836 +vn 0.8299 0.3653 0.4216 +vn -0.3812 -0.1804 0.9067 +vn 0.3821 0.1785 -0.9067 +vn -0.8463 -0.3284 -0.4195 +vn -0.8469 -0.3276 -0.4189 +vn 0.3814 0.1796 -0.9068 +vn -0.8505 -0.3177 -0.4193 +vn -0.8601 -0.3356 -0.3843 +vn -0.8505 -0.3174 -0.4193 +vn -0.8300 -0.3230 -0.4546 +vn -0.8299 -0.3656 -0.4215 +vn -0.4210 -0.0668 0.9046 +vn 0.4230 0.0610 -0.9041 +vn 0.8146 0.3969 0.4229 +vn 0.5912 -0.4857 -0.6438 +vn 0.5918 -0.4845 -0.6442 +vn 0.6057 0.0255 -0.7953 +vn 0.4625 -0.1227 -0.8781 +vn 0.4641 -0.1262 -0.8767 +vn 0.2454 -0.1520 -0.9574 +vn 0.3931 0.1463 -0.9078 +vn 0.8304 0.3655 0.4206 +vn -0.8171 -0.3781 -0.4351 +vn -0.5911 0.4851 0.6444 +vn -0.5924 0.4861 0.6425 +vn -0.8148 -0.3954 -0.4239 +vn -0.4584 0.1141 0.8814 +vn -0.2681 0.1315 0.9544 +vn -0.4608 0.1190 0.8795 +vn -0.5831 -0.0304 0.8118 +vn -0.3930 -0.1462 0.9078 +vn 0.7776 0.5452 0.3132 +vn -0.7779 -0.5444 -0.3139 +vn -0.6114 0.6372 0.4692 +vn 0.7538 0.6549 0.0537 +vn 0.7542 0.6543 0.0547 +vn 0.8101 0.5323 0.2457 +vn 0.7440 0.6179 0.2544 +vn 0.7442 0.6183 0.2527 +vn 0.4876 0.7378 0.4668 +vn 0.8033 0.4601 0.3781 +vn -0.5769 0.5727 0.5824 +vn 0.5780 -0.5823 -0.5717 +vn -0.7539 -0.6547 -0.0557 +vn -0.7542 -0.6543 -0.0550 +vn 0.6113 -0.6348 -0.4726 +vn -0.7440 -0.6179 -0.2542 +vn -0.4444 -0.7519 -0.4870 +vn -0.7442 -0.6183 -0.2527 +vn -0.8155 -0.5268 -0.2396 +vn -0.8023 -0.4620 -0.3779 +vn -0.6499 0.7596 -0.0236 +vn 0.6506 -0.7592 0.0196 +vn 0.7587 0.6513 -0.0096 +vn 0.8228 -0.5607 0.0927 +vn 0.6344 -0.7499 0.1874 +vn 0.6347 -0.7506 0.1839 +vn 0.2757 -0.9601 0.0477 +vn 0.6512 -0.7234 -0.2296 +vn 0.7272 0.6859 0.0265 +vn -0.7292 -0.6835 -0.0344 +vn -0.6137 0.7090 -0.3473 +vn -0.7504 -0.6609 0.0094 +vn -0.6336 0.7478 -0.1986 +vn -0.3492 0.9345 -0.0696 +vn -0.6339 0.7487 -0.1940 +vn -0.7855 0.6083 -0.1140 +vn -0.6523 0.7227 0.2284 +vn -0.6192 0.7227 -0.3071 +vn 0.7598 0.6501 0.0048 +vn 0.7595 0.6504 0.0051 +vn 0.7644 0.6427 -0.0520 +vn 0.7661 0.6408 -0.0502 +vn 0.7661 0.6407 -0.0509 +vn 0.7696 0.6365 -0.0510 +vn 0.7681 0.6380 -0.0553 +vn -0.6205 0.7212 -0.3080 +vn 0.6183 -0.7215 0.3115 +vn -0.7595 -0.6505 -0.0053 +vn -0.7598 -0.6502 -0.0050 +vn 0.6195 -0.7231 0.3055 +vn -0.7661 -0.6408 0.0505 +vn -0.7695 -0.6366 0.0512 +vn -0.7661 -0.6406 0.0511 +vn -0.7645 -0.6425 0.0521 +vn -0.7681 -0.6379 0.0547 +vn -0.6406 0.7505 -0.1623 +vn 0.6409 -0.7508 0.1597 +vn 0.7591 0.6508 0.0114 +vn 0.5790 -0.7967 0.1736 +vn 0.6423 -0.7518 0.1495 +vn 0.6423 -0.7518 0.1493 +vn 0.6892 -0.7038 0.1721 +vn 0.7585 0.6517 0.0002 +vn -0.7601 -0.6498 -0.0022 +vn -0.7591 -0.6508 -0.0113 +vn -0.6422 0.7517 -0.1500 +vn -0.6924 0.7002 -0.1738 +vn -0.6422 0.7517 -0.1498 +vn -0.5746 0.7994 -0.1752 +vn 0.7591 0.6509 0.0141 +vn 0.7586 0.6514 0.0140 +vn 0.6424 -0.7518 0.1487 +vn -0.7586 -0.6514 -0.0140 +vn -0.7591 -0.6509 -0.0141 +vn -0.0617 0.0718 0.9955 +vn 0.6289 -0.7678 0.1224 +vn 0.6456 -0.7549 0.1157 +vn 0.6607 -0.7405 0.1229 +vn -0.6456 0.7549 -0.1157 +vn -0.6609 0.7404 -0.1229 +vn -0.6288 0.7679 -0.1224 +vn -0.6474 0.7567 -0.0907 +vn 0.7682 0.6402 0.0023 +vn 0.7601 0.6498 -0.0032 +vn 0.7516 0.6597 -0.0001 +vn -0.7602 -0.6497 0.0053 +vn 0.6474 -0.7567 0.0907 +vn -0.7601 -0.6498 0.0032 +vn -0.7515 -0.6597 0.0001 +vn -0.7683 -0.6401 -0.0023 +vn 0.7592 0.6508 0.0127 +vn 0.6512 -0.7589 -0.0034 +vn 0.6511 -0.7590 -0.0033 +vn 0.6511 -0.7589 -0.0033 +vn 0.6251 -0.7788 0.0530 +vn 0.6489 -0.7596 0.0433 +vn 0.6489 -0.7596 0.0435 +vn 0.6709 -0.7396 0.0541 +vn 0.7594 0.6506 0.0071 +vn -0.7594 -0.6505 -0.0066 +vn -0.6511 0.7589 0.0033 +vn -0.6511 0.7590 0.0034 +vn -0.7592 -0.6507 -0.0128 +vn -0.6489 0.7596 -0.0433 +vn -0.6713 0.7392 -0.0540 +vn -0.6489 0.7596 -0.0434 +vn -0.6247 0.7791 -0.0529 +vn -0.6478 0.7572 -0.0839 +vn 0.7576 0.6499 0.0602 +vn -0.7576 -0.6499 -0.0600 +vn -0.6503 0.7574 0.0590 +vn 0.7514 0.6248 0.2122 +vn 0.7512 0.6249 0.2125 +vn 0.7126 0.6955 0.0922 +vn 0.7526 0.6498 0.1070 +vn 0.7525 0.6500 0.1061 +vn 0.7874 0.6107 0.0843 +vn -0.6508 0.7582 0.0409 +vn 0.6479 -0.7608 -0.0378 +vn -0.7512 -0.6248 -0.2127 +vn -0.7514 -0.6247 -0.2124 +vn 0.6504 -0.7572 -0.0602 +vn -0.7525 -0.6499 -0.1065 +vn -0.7863 -0.6122 -0.0835 +vn -0.7525 -0.6501 -0.1055 +vn -0.7142 -0.6939 -0.0914 +vn -0.7587 -0.6506 -0.0328 +vn -0.6587 0.7264 0.1963 +vn 0.6587 -0.7261 -0.1972 +vn 0.7509 0.6204 0.2263 +vn 0.6553 -0.7441 -0.1299 +vn 0.6550 -0.7444 -0.1296 +vn 0.6054 -0.7691 -0.2051 +vn 0.6591 -0.7216 -0.2119 +vn 0.6591 -0.7215 -0.2121 +vn 0.6977 -0.6927 -0.1827 +vn 0.6563 -0.7431 -0.1308 +vn 0.7486 0.6291 0.2094 +vn -0.7516 -0.6245 -0.2123 +vn -0.6550 0.7443 0.1301 +vn -0.6553 0.7440 0.1304 +vn -0.7509 -0.6205 -0.2261 +vn -0.6591 0.7216 0.2118 +vn -0.7005 0.6905 0.1804 +vn -0.6591 0.7216 0.2119 +vn -0.6018 0.7720 0.2045 +vn -0.6560 0.7433 0.1311 +vn 0.7528 0.6347 0.1746 +vn -0.7526 -0.6351 -0.1737 +vn -0.6363 0.7714 -0.0062 +vn 0.7730 0.6257 -0.1049 +vn 0.7731 0.6256 -0.1046 +vn 0.8061 0.5794 0.1204 +vn 0.7481 0.6586 0.0808 +vn 0.7484 0.6585 0.0796 +vn 0.6449 0.7548 0.1199 +vn 0.7510 0.6193 0.2291 +vn -0.6453 0.7614 0.0620 +vn 0.6428 -0.7647 -0.0456 +vn -0.7730 -0.6257 0.1044 +vn -0.7729 -0.6258 0.1046 +vn 0.6392 -0.7690 0.0036 +vn -0.7483 -0.6585 -0.0799 +vn -0.6388 -0.7603 -0.1179 +vn -0.7485 -0.6584 -0.0789 +vn -0.8088 -0.5763 -0.1171 +vn -0.7508 -0.6198 -0.2283 +vn -0.6251 0.7299 -0.2765 +vn 0.6254 -0.7297 0.2764 +vn 0.7735 0.6082 -0.1783 +vn 0.5733 -0.5280 0.6265 +vn 0.5729 -0.5279 0.6270 +vn 0.7269 -0.6119 0.3117 +vn 0.6007 -0.6953 0.3947 +vn 0.6007 -0.6946 0.3959 +vn 0.3950 -0.8453 0.3597 +vn 0.6352 -0.7563 0.1569 +vn 0.7628 0.6302 -0.1445 +vn -0.7628 -0.6303 0.1446 +vn -0.5729 0.5281 -0.6268 +vn -0.5734 0.5282 -0.6262 +vn -0.7733 -0.6087 0.1776 +vn -0.6007 0.6961 -0.3932 +vn -0.4271 0.8304 -0.3579 +vn -0.6007 0.6952 -0.3948 +vn -0.7111 0.6282 -0.3158 +vn -0.6361 0.7556 -0.1562 +vn 0.8060 0.4897 -0.3323 +vn -0.8061 -0.4889 0.3336 +vn -0.5415 0.4252 -0.7252 +vn 0.8413 0.1956 -0.5039 +vn 0.8414 0.1958 -0.5037 +vn 0.8710 0.3856 -0.3046 +vn 0.8131 0.3978 -0.4250 +vn 0.8128 0.3992 -0.4243 +vn 0.6204 0.5592 -0.5499 +vn 0.7909 0.5618 -0.2426 +vn -0.5391 0.4883 -0.6863 +vn 0.5408 -0.4920 0.6823 +vn -0.8414 -0.1960 0.5036 +vn -0.8413 -0.1959 0.5039 +vn 0.5416 -0.4236 0.7261 +vn -0.8130 -0.3981 0.4248 +vn -0.5940 -0.5693 0.5684 +vn -0.8127 -0.3994 0.4243 +vn -0.8776 -0.3780 0.2950 +vn -0.7908 -0.5615 0.2436 +vn -0.5363 0.2028 -0.8193 +vn 0.5364 -0.2030 0.8192 +vn 0.8414 0.1310 -0.5242 +vn 0.5254 0.0589 0.8488 +vn 0.5256 0.0587 0.8487 +vn 0.6256 -0.1446 0.7666 +vn 0.5262 -0.1207 0.8417 +vn 0.5262 -0.1204 0.8418 +vn 0.3558 -0.1991 0.9131 +vn 0.5428 -0.3009 0.7841 +vn 0.8339 0.1712 -0.5247 +vn -0.8341 -0.1745 0.5233 +vn -0.5256 -0.0590 -0.8487 +vn -0.5254 -0.0591 -0.8488 +vn -0.8414 -0.1312 0.5242 +vn 0.0278 -0.9996 -0.0017 +vn -0.5262 0.1211 -0.8417 +vn -0.3750 0.1956 -0.9062 +vn -0.5262 0.1208 -0.8417 +vn -0.6152 0.1459 -0.7747 +vn -0.5425 0.3009 -0.7844 +vn 0.8497 -0.0122 -0.5271 +vn -0.8497 0.0119 0.5271 +vn -0.5221 -0.1328 -0.8425 +vn 0.8506 -0.1656 -0.4990 +vn 0.8507 -0.1655 -0.4990 +vn 0.8873 -0.0354 -0.4599 +vn 0.8493 -0.0744 -0.5227 +vn 0.8492 -0.0735 -0.5229 +vn 0.7760 -0.0498 -0.6287 +vn 0.8476 0.0609 -0.5271 +vn -0.5151 -0.0942 -0.8519 +vn 0.5191 0.0904 0.8499 +vn -0.8507 0.1654 0.4990 +vn -0.8506 0.1655 0.4991 +vn 0.5221 0.1339 0.8423 +vn -0.8492 0.0737 0.5228 +vn -0.7705 0.0497 0.6355 +vn -0.8492 0.0729 0.5230 +vn -0.8898 0.0338 0.4551 +vn -0.8477 -0.0611 0.5270 +vn -0.5253 -0.2405 -0.8162 +vn 0.5254 0.2402 0.8163 +vn 0.8504 -0.1820 -0.4936 +vn 0.5253 0.2444 0.8151 +vn 0.5253 0.2445 0.8150 +vn 0.5586 0.2346 0.7956 +vn 0.5257 0.2546 0.8117 +vn 0.5257 0.2544 0.8118 +vn 0.4837 0.2478 0.8394 +vn 0.5247 0.1997 0.8276 +vn 0.8493 -0.1699 -0.4999 +vn -0.8493 0.1685 0.5002 +vn -0.5253 -0.2444 -0.8150 +vn -0.5253 -0.2444 -0.8151 +vn -0.8500 0.1821 0.4942 +vn -0.5257 -0.2548 -0.8116 +vn -0.4853 -0.2482 -0.8384 +vn -0.5257 -0.2546 -0.8117 +vn -0.5572 -0.2355 -0.7963 +vn -0.5248 -0.1996 -0.8275 +vn 0.8503 -0.1855 -0.4925 +vn -0.5230 -0.2108 -0.8259 +vn 0.8526 -0.1098 -0.5108 +vn 0.8525 -0.1104 -0.5110 +vn 0.8526 -0.1107 -0.5107 +vn 0.8377 -0.1770 -0.5167 +vn 0.8503 -0.1651 -0.4998 +vn 0.8502 -0.1654 -0.4997 +vn 0.8613 -0.1680 -0.4795 +vn 0.8501 -0.1933 -0.4899 +vn -0.5244 -0.2229 -0.8218 +vn 0.5229 0.2245 0.8223 +vn -0.8526 0.1109 0.5106 +vn -0.8525 0.1106 0.5110 +vn 0.5230 0.2104 0.8260 +vn -0.8502 0.1653 0.4997 +vn -0.8611 0.1683 0.4797 +vn -0.8502 0.1656 0.4997 +vn -0.8379 0.1771 0.5164 +vn -0.8501 0.1934 0.4899 +vn -0.5214 -0.1247 -0.8441 +vn 0.5212 0.1258 0.8441 +vn 0.8527 -0.0675 -0.5180 +vn 0.5165 -0.0551 0.8545 +vn 0.4379 0.0958 0.8939 +vn 0.5179 0.0596 0.8534 +vn 0.5179 0.0595 0.8534 +vn 0.5829 0.0815 0.8084 +vn 0.5228 0.1729 0.8347 +vn 0.8515 -0.0865 -0.5172 +vn -0.8515 0.0865 0.5172 +vn -0.5165 0.0552 -0.8545 +vn -0.5165 0.0551 -0.8545 +vn -0.8526 0.0675 0.5181 +vn -0.5179 -0.0596 -0.8534 +vn -0.5860 -0.0809 -0.8063 +vn -0.5179 -0.0595 -0.8534 +vn -0.4336 -0.0959 -0.8960 +vn -0.5229 -0.1730 -0.8346 +vn 0.8556 -0.0001 -0.5177 +vn -0.8556 -0.0001 0.5176 +vn -0.5143 0.1031 -0.8514 +vn 0.8580 0.0662 -0.5093 +vn 0.8580 0.0663 -0.5094 +vn 0.8317 0.0146 -0.5550 +vn 0.8558 0.0239 -0.5167 +vn 0.8559 0.0240 -0.5167 +vn 0.8720 0.0092 -0.4894 +vn 0.8549 -0.0263 -0.5181 +vn -0.5131 0.0783 -0.8547 +vn 0.5130 -0.0795 0.8547 +vn -0.8580 -0.0664 0.5094 +vn -0.8580 -0.0663 0.5093 +vn 0.5139 -0.1028 0.8517 +vn -0.8559 -0.0240 0.5167 +vn -0.8715 -0.0095 0.4903 +vn -0.8559 -0.0241 0.5166 +vn -0.8325 -0.0147 0.5538 +vn -0.8548 0.0255 0.5184 +vn -0.5119 0.1897 -0.8378 +vn 0.8583 0.0717 -0.5082 +vn 0.5114 -0.2027 0.8351 +vn 0.5114 -0.2026 0.8351 +vn 0.4744 -0.1932 0.8588 +vn 0.5113 -0.2044 0.8347 +vn 0.5113 -0.2045 0.8347 +vn 0.5454 -0.1885 0.8167 +vn 0.8575 0.0654 -0.5102 +vn -0.8580 -0.0657 0.5095 +vn -0.5114 0.2027 -0.8351 +vn -0.5114 0.2028 -0.8351 +vn -0.8583 -0.0716 0.5082 +vn -0.5113 0.2042 -0.8348 +vn -0.5465 0.1880 -0.8161 +vn -0.5113 0.2043 -0.8347 +vn -0.4733 0.1928 -0.8595 +vn -0.8579 -0.0659 0.5095 +vn -0.5118 0.1683 -0.8424 +vn 0.8541 -0.0120 -0.5200 +vn 0.8540 -0.0123 -0.5202 +vn 0.8676 0.0499 -0.4948 +vn 0.8562 0.0460 -0.5147 +vn 0.8562 0.0456 -0.5147 +vn 0.8448 0.0564 -0.5321 +vn -0.5122 0.1814 -0.8395 +vn 0.5122 -0.1792 0.8399 +vn -0.8540 0.0128 0.5201 +vn -0.8540 0.0124 0.5202 +vn 0.5126 -0.1692 0.8418 +vn -0.8562 -0.0458 0.5147 +vn -0.8446 -0.0562 0.5324 +vn -0.8562 -0.0454 0.5147 +vn -0.8677 -0.0495 0.4945 +vn -0.5177 0.0699 -0.8527 +vn 0.5177 -0.0687 0.8528 +vn 0.8503 -0.0545 -0.5235 +vn 0.5272 0.1680 0.8330 +vn 0.5276 0.1674 0.8328 +vn 0.5959 -0.0316 0.8025 +vn 0.5180 0.0058 0.8554 +vn 0.5180 0.0060 0.8553 +vn 0.4164 -0.0227 0.9089 +vn 0.5149 -0.1288 0.8475 +vn 0.8510 -0.0343 -0.5241 +vn -0.8498 0.0357 0.5260 +vn -0.5272 -0.1674 -0.8331 +vn -0.5277 -0.1683 -0.8326 +vn -0.8503 0.0543 0.5236 +vn -0.5179 -0.0052 -0.8554 +vn -0.4227 0.0239 -0.9060 +vn -0.5180 -0.0055 -0.8554 +vn -0.5914 0.0325 -0.8057 +vn -0.5148 0.1288 -0.8476 +vn 0.8484 -0.1445 -0.5093 +vn -0.8484 0.1437 0.5094 +vn -0.5260 -0.2289 -0.8191 +vn 0.8440 -0.2779 -0.4588 +vn 0.8438 -0.2783 -0.4588 +vn 0.8717 -0.1490 -0.4669 +vn 0.8452 -0.1788 -0.5037 +vn 0.8452 -0.1792 -0.5036 +vn 0.8045 -0.1733 -0.5680 +vn 0.8502 -0.0989 -0.5171 +vn -0.5234 -0.1925 -0.8301 +vn 0.5233 0.1939 0.8298 +vn -0.8439 0.2787 0.4583 +vn -0.8438 0.2785 0.4587 +vn 0.5270 0.2276 0.8188 +vn -0.8452 0.1790 0.5036 +vn -0.8023 0.1742 0.5709 +vn -0.8452 0.1794 0.5035 +vn -0.8728 0.1487 0.4648 +vn -0.8502 0.0987 0.5171 +vn -0.5339 -0.4006 -0.7446 +vn 0.5339 0.4019 0.7439 +vn 0.8341 -0.3598 -0.4181 +vn 0.5393 0.7224 0.4328 +vn 0.5392 0.7225 0.4328 +vn 0.6672 0.4143 0.6191 +vn 0.5245 0.5329 0.6641 +vn 0.5245 0.5334 0.6636 +vn 0.2983 0.5453 0.7833 +vn 0.5316 0.2992 0.7924 +vn 0.8348 -0.3244 -0.4448 +vn -0.8291 0.3348 0.4478 +vn -0.5393 -0.7224 -0.4328 +vn -0.5392 -0.7224 -0.4329 +vn -0.8341 0.3595 0.4185 +vn -0.5243 -0.5318 -0.6651 +vn -0.3237 -0.5372 -0.7789 +vn -0.5244 -0.5325 -0.6645 +vn -0.6541 -0.4171 -0.6311 +vn -0.5314 -0.2993 -0.7925 +vn -0.8408 0.4644 0.2781 +vn -0.5232 -0.8012 -0.2903 +vn 0.8455 -0.5338 -0.0108 +vn 0.8460 -0.5330 -0.0120 +vn 0.8785 -0.4273 -0.2136 +vn 0.8310 -0.5172 -0.2051 +vn 0.8313 -0.5174 -0.2031 +vn 0.7057 -0.6386 -0.3068 +vn -0.5184 -0.7708 -0.3704 +vn 0.5169 0.7758 0.3620 +vn -0.8460 0.5331 0.0125 +vn -0.8455 0.5338 0.0115 +vn 0.5275 0.7971 0.2939 +vn -0.8311 0.5173 0.2039 +vn -0.6893 0.6534 0.3130 +vn -0.8314 0.5176 0.2023 +vn -0.8827 0.4208 0.2092 +vn -0.5303 -0.8468 0.0415 +vn 0.5311 0.8465 -0.0380 +vn 0.8477 -0.5300 0.0223 +vn 0.5302 0.8462 -0.0529 +vn 0.5301 0.8463 -0.0527 +vn 0.6401 0.7673 -0.0392 +vn 0.5298 0.8436 -0.0878 +vn 0.5298 0.8437 -0.0865 +vn 0.3472 0.9375 -0.0237 +vn 0.5341 0.8367 0.1210 +vn 0.8354 -0.5496 -0.0075 +vn -0.8362 0.5483 0.0148 +vn -0.5301 -0.8463 0.0530 +vn -0.5302 -0.8462 0.0531 +vn -0.8448 0.5347 -0.0219 +vn -0.5298 -0.8433 0.0903 +vn -0.3700 -0.9285 0.0316 +vn -0.5298 -0.8435 0.0889 +vn -0.6244 -0.7797 0.0472 +vn -0.5344 -0.8365 -0.1210 +vn 0.8476 -0.5302 0.0201 +vn -0.8477 0.5301 -0.0198 +vn -0.5304 -0.8468 0.0406 +vn 0.8476 -0.5286 0.0469 +vn 0.8382 -0.5447 0.0274 +vn 0.8476 -0.5302 0.0209 +vn 0.8555 -0.5171 0.0254 +vn 0.8480 -0.5282 0.0422 +vn -0.5297 -0.8461 0.0591 +vn 0.5297 0.8462 -0.0577 +vn -0.8476 0.5286 -0.0469 +vn 0.5301 0.8470 -0.0411 +vn -0.8476 0.5302 -0.0209 +vn -0.8555 0.5172 -0.0253 +vn -0.8476 0.5302 -0.0210 +vn -0.8383 0.5446 -0.0274 +vn -0.8481 0.5281 -0.0425 +vn -0.5305 -0.8454 0.0623 +vn 0.5306 0.8454 -0.0622 +vn 0.8475 -0.5276 0.0574 +vn 0.5305 0.8450 -0.0676 +vn 0.5462 0.8353 -0.0634 +vn 0.5306 0.8447 -0.0706 +vn 0.5133 0.8557 -0.0651 +vn 0.5305 0.8465 -0.0451 +vn 0.8473 -0.5287 0.0508 +vn -0.8473 0.5287 -0.0505 +vn -0.5306 -0.8449 0.0676 +vn -0.5305 -0.8450 0.0676 +vn -0.8474 0.5278 -0.0574 +vn -0.5306 -0.8447 0.0707 +vn -0.5136 -0.8556 0.0652 +vn -0.5460 -0.8354 0.0635 +vn -0.8474 0.5270 -0.0636 +vn -0.5298 -0.8468 0.0471 +vn 0.8482 -0.5292 0.0200 +vn 0.8415 -0.5373 0.0557 +vn 0.8475 -0.5283 0.0517 +vn 0.8530 -0.5190 0.0548 +vn -0.5303 -0.8461 0.0541 +vn 0.5298 0.8464 -0.0545 +vn -0.8482 0.5292 -0.0200 +vn 0.5298 0.8468 -0.0470 +vn -0.8475 0.5283 -0.0517 +vn -0.8530 0.5191 -0.0549 +vn -0.8475 0.5283 -0.0518 +vn -0.8416 0.5373 -0.0558 +vn 0.8480 -0.5299 -0.0015 +vn 0.4878 0.8727 0.0214 +vn 0.5277 0.8486 0.0368 +vn 0.5277 0.8486 0.0367 +vn 0.5638 0.8256 0.0217 +vn 0.8479 -0.5301 0.0083 +vn -0.8479 0.5301 -0.0085 +vn -0.8483 0.5295 0.0014 +vn -0.5277 -0.8486 -0.0371 +vn -0.5650 -0.8248 -0.0220 +vn -0.5277 -0.8486 -0.0370 +vn -0.4863 -0.8735 -0.0217 +vn -0.5262 -0.8373 -0.1484 +vn 0.8501 -0.5216 -0.0723 +vn 0.8310 -0.5531 -0.0582 +vn 0.8499 -0.5230 -0.0642 +vn 0.8499 -0.5230 -0.0644 +vn 0.8638 -0.5012 -0.0511 +vn -0.5254 -0.8410 -0.1292 +vn 0.5253 0.8408 0.1308 +vn -0.8501 0.5216 0.0722 +vn -0.8501 0.5216 0.0723 +vn 0.5258 0.8377 0.1479 +vn -0.8499 0.5230 0.0643 +vn -0.8636 0.5016 0.0513 +vn -0.8499 0.5230 0.0645 +vn -0.8314 0.5526 0.0583 +vn -0.5260 -0.8348 -0.1626 +vn 0.5260 0.8348 0.1624 +vn 0.8489 -0.5261 -0.0515 +vn 0.5286 0.8484 0.0267 +vn 0.5285 0.8485 0.0266 +vn 0.5540 0.8216 0.1346 +vn 0.5256 0.8415 0.1251 +vn 0.5256 0.8415 0.1248 +vn 0.4962 0.8573 0.1372 +vn 0.8497 -0.5240 -0.0584 +vn -0.8488 0.5256 0.0574 +vn -0.5286 -0.8484 -0.0266 +vn -0.5285 -0.8485 -0.0268 +vn -0.8489 0.5261 0.0517 +vn -0.5256 -0.8414 -0.1257 +vn -0.4967 -0.8569 -0.1380 +vn -0.5256 -0.8414 -0.1254 +vn -0.5534 -0.8218 -0.1355 +vn 0.8485 -0.5292 0.0027 +vn -0.8484 0.5293 -0.0031 +vn -0.5290 -0.8486 0.0058 +vn 0.8471 -0.5277 0.0633 +vn 0.8685 -0.4953 0.0194 +vn 0.8485 -0.5281 0.0326 +vn 0.8486 -0.5281 0.0318 +vn 0.8204 -0.5716 0.0146 +vn 0.8491 -0.5275 -0.0284 +vn -0.5270 -0.8498 -0.0148 +vn 0.5277 0.8492 0.0177 +vn -0.8471 0.5277 -0.0633 +vn 0.5290 0.8486 -0.0063 +vn -0.8485 0.5281 -0.0324 +vn -0.8197 0.5727 -0.0144 +vn -0.8486 0.5281 -0.0316 +vn -0.8690 0.4944 -0.0191 +vn -0.8490 0.5276 0.0282 +vn 0.8459 -0.5281 0.0743 +vn 0.5288 0.8486 0.0171 +vn 0.5286 0.8487 0.0170 +vn 0.4869 0.8728 0.0332 +vn 0.5253 0.8493 0.0523 +vn 0.5253 0.8493 0.0522 +vn 0.5674 0.8225 0.0397 +vn 0.5292 0.8484 -0.0121 +vn 0.8470 -0.5270 0.0693 +vn -0.8463 0.5282 -0.0696 +vn -0.5288 -0.8486 -0.0173 +vn -0.5286 -0.8487 -0.0176 +vn -0.8459 0.5281 -0.0743 +vn -0.5253 -0.8493 -0.0521 +vn -0.5684 -0.8218 -0.0393 +vn -0.5253 -0.8493 -0.0520 +vn -0.4860 -0.8734 -0.0326 +vn -0.5293 -0.8484 0.0118 +vn 0.8432 -0.5277 0.1029 +vn -0.8431 0.5278 -0.1032 +vn -0.5320 -0.8404 0.1033 +vn 0.8403 -0.4986 0.2127 +vn 0.8393 -0.4981 0.2179 +vn 0.8557 -0.5046 0.1149 +vn 0.8357 -0.5330 0.1323 +vn 0.8359 -0.5321 0.1345 +vn 0.8152 -0.5650 0.1276 +vn 0.8449 -0.5279 0.0860 +vn -0.5318 -0.8459 0.0400 +vn 0.5331 0.8430 -0.0722 +vn -0.8394 0.4978 -0.2182 +vn -0.8404 0.4980 -0.2139 +vn 0.5354 0.8396 -0.0919 +vn -0.0358 -0.4037 -0.9142 +vn -0.8357 0.5328 -0.1327 +vn -0.8145 0.5659 -0.1280 +vn -0.8359 0.5320 -0.1349 +vn -0.8561 0.5038 -0.1155 +vn -0.8449 0.5280 -0.0861 +vn -0.5345 -0.7113 0.4564 +vn 0.5302 0.6910 -0.4914 +vn 0.8446 -0.4607 0.2727 +vn 0.7962 0.3369 -0.5025 +vn 0.4794 0.4632 -0.7454 +vn 0.4808 0.4689 -0.7409 +vn 0.0118 0.7424 -0.6698 +vn 0.5423 0.8035 -0.2453 +vn 0.8277 -0.4943 0.2656 +vn -0.8283 0.4954 -0.2616 +vn -0.8393 0.4666 -0.2791 +vn -0.4754 -0.4475 0.7574 +vn -0.1016 -0.7274 0.6786 +vn -0.4776 -0.4559 0.7511 +vn -0.7506 -0.3781 0.5419 +vn -0.5422 -0.8039 0.2444 +vn 0.8481 -0.4528 0.2753 +vn -0.8481 0.4527 -0.2753 +vn -0.3215 -0.0279 0.9465 +vn 0.8235 -0.5019 0.2645 +vn 0.8236 -0.5016 0.2648 +vn 0.8267 -0.4709 0.3079 +vn 0.8342 -0.4832 0.2658 +vn 0.8343 -0.4830 0.2658 +vn 0.8684 -0.4572 0.1919 +vn 0.8624 -0.4159 0.2885 +vn -0.3384 -0.0596 0.9391 +vn 0.3462 0.0741 -0.9352 +vn -0.8236 0.5016 -0.2648 +vn -0.8235 0.5019 -0.2645 +vn 0.3247 0.0274 -0.9454 +vn -0.8339 0.4836 -0.2658 +vn -0.8683 0.4572 -0.1923 +vn -0.8341 0.4834 -0.2658 +vn -0.8267 0.4710 -0.3077 +vn -0.8622 0.4179 -0.2863 +vn -0.2341 0.1238 0.9643 +vn 0.2341 -0.1238 -0.9643 +vn 0.8363 -0.4790 0.2669 +vn 0.0737 -0.3886 -0.9184 +vn 0.0735 -0.3887 -0.9184 +vn 0.3300 -0.2378 -0.9136 +vn 0.1773 -0.2094 -0.9616 +vn 0.1769 -0.2102 -0.9615 +vn 0.0689 -0.0915 -0.9934 +vn 0.2835 -0.0402 -0.9581 +vn 0.8317 -0.4866 0.2672 +vn -0.8322 0.4850 -0.2687 +vn -0.0736 0.3885 0.9185 +vn -0.0738 0.3884 0.9185 +vn -0.8361 0.4792 -0.2670 +vn -0.1775 0.2090 0.9617 +vn -0.0814 0.0981 0.9918 +vn -0.1770 0.2099 0.9616 +vn -0.3202 0.2308 0.9188 +vn -0.2836 0.0400 0.9581 +vn 0.8720 -0.4212 0.2493 +vn -0.8723 0.4205 -0.2493 +vn -0.0199 0.4726 0.8810 +vn 0.9349 -0.3055 0.1805 +vn 0.9347 -0.3062 0.1804 +vn 0.8863 -0.4192 0.1970 +vn 0.8950 -0.3789 0.2354 +vn 0.8949 -0.3791 0.2355 +vn 0.8757 -0.3563 0.3258 +vn 0.8516 -0.4554 0.2596 +vn -0.0410 0.4298 0.9020 +vn 0.0422 -0.4280 -0.9028 +vn -0.9344 0.3066 -0.1813 +vn -0.9346 0.3063 -0.1806 +vn 0.0197 -0.4732 -0.8807 +vn -0.8950 0.3789 -0.2353 +vn -0.8753 0.3541 -0.3293 +vn -0.8949 0.3790 -0.2354 +vn -0.8864 0.4199 -0.1950 +vn -0.8518 0.4549 -0.2597 +vn 0.0550 0.6240 0.7795 +vn -0.0539 -0.6227 -0.7806 +vn 0.9471 -0.2785 0.1597 +vn 0.0328 -0.6694 -0.7422 +vn -0.0785 -0.6680 -0.7400 +vn -0.0785 -0.6679 -0.7401 +vn -0.1906 -0.5956 -0.7804 +vn -0.0222 -0.5591 -0.8288 +vn 0.9406 -0.2901 0.1767 +vn -0.9404 0.2905 -0.1770 +vn -0.9471 0.2782 -0.1601 +vn 0.0786 0.6683 0.7397 +vn 0.1801 0.6007 0.7789 +vn 0.0786 0.6682 0.7398 +vn -0.0237 0.6680 0.7438 +vn 0.0217 0.5593 0.8287 +vn -0.8258 0.3716 0.4242 +vn -0.2966 0.3971 -0.8685 +vn -0.2728 0.3952 -0.8772 +vn -0.2568 0.3792 -0.8890 +vn 0.8258 -0.3716 -0.4242 +vn 0.2729 -0.3950 0.8772 +vn 0.2728 -0.3950 0.8772 +vn 0.2567 -0.3792 0.8890 +vn 0.2966 -0.3972 0.8685 +vn 0.2753 -0.3909 0.8783 +vn -0.8255 0.3710 0.4252 +vn -0.8257 0.3717 0.4244 +vn -0.8262 0.3718 0.4233 +vn 0.2699 -0.3998 0.8760 +vn -0.2715 0.3969 -0.8768 +vn -0.2747 0.3917 -0.8782 +vn 0.8257 -0.3717 -0.4244 +vn 0.8262 -0.3718 -0.4233 +vn 0.8255 -0.3710 -0.4252 +vn 0.4884 0.8481 0.2056 +vn -0.8245 0.3739 0.4248 +vn -0.3770 0.1991 -0.9046 +vn -0.3770 0.1989 -0.9046 +vn -0.2556 0.2155 -0.9425 +vn -0.3652 0.2254 -0.9032 +vn -0.3654 0.2250 -0.9033 +vn -0.4374 0.2955 -0.8493 +vn -0.8245 0.3733 0.4253 +vn 0.8243 -0.3736 -0.4253 +vn 0.3770 -0.1989 0.9046 +vn 0.3770 -0.1991 0.9046 +vn 0.8244 -0.3734 -0.4253 +vn 0.3661 -0.2235 0.9033 +vn 0.3658 -0.2240 0.9033 +vn 0.4339 -0.2920 0.8523 +vn 0.2610 -0.2162 0.9408 +vn -0.8431 0.3304 0.4242 +vn 0.8434 -0.3300 -0.4241 +vn 0.4195 0.9077 0.0142 +vn 0.3850 -0.1802 0.9051 +vn -0.8446 0.3280 0.4231 +vn -0.8453 0.3271 0.4225 +vn -0.8588 0.3353 0.3873 +vn -0.8490 0.3168 0.4229 +vn -0.8489 0.3171 0.4229 +vn -0.8281 0.3223 0.4586 +vn -0.8285 0.3646 0.4251 +vn 0.3834 -0.1813 0.9056 +vn -0.3842 0.1793 -0.9057 +vn 0.8445 -0.3294 -0.4224 +vn 0.8452 -0.3274 -0.4224 +vn -0.3838 0.1803 -0.9056 +vn 0.8490 -0.3169 -0.4229 +vn 0.8491 -0.3166 -0.4229 +vn 0.8285 -0.3222 -0.4580 +vn 0.8587 -0.3349 -0.3880 +vn 0.8285 -0.3645 -0.4252 +vn 0.4240 -0.0668 0.9032 +vn -0.4259 0.0617 -0.9027 +vn -0.8126 0.3972 0.4265 +vn -0.5948 -0.4821 -0.6433 +vn -0.5942 -0.4833 -0.6429 +vn -0.2490 -0.1503 -0.9568 +vn -0.4672 -0.1244 -0.8754 +vn -0.4655 -0.1208 -0.8768 +vn -0.6080 0.0270 -0.7935 +vn -0.3964 0.1473 -0.9062 +vn -0.8285 0.3655 0.4241 +vn 0.8151 -0.3782 -0.4387 +vn 0.5947 0.4856 0.6408 +vn 0.5954 0.4837 0.6415 +vn 0.8128 -0.3957 -0.4274 +vn 0.4615 0.1123 0.8800 +vn 0.4638 0.1173 0.8781 +vn 0.5855 -0.0320 0.8100 +vn 0.2717 0.1299 0.9536 +vn 0.3963 -0.1480 0.9061 +vn -0.7757 0.5474 0.3141 +vn 0.7759 -0.5463 -0.3155 +vn -0.7516 0.6573 0.0550 +vn -0.7512 0.6579 0.0540 +vn -0.4827 0.7392 0.4696 +vn -0.7415 0.6207 0.2548 +vn -0.7413 0.6202 0.2565 +vn -0.8083 0.5341 0.2478 +vn -0.8003 0.4627 0.3813 +vn 0.5767 0.5736 0.5818 +vn -0.5807 -0.5799 -0.5714 +vn 0.7512 -0.6577 -0.0560 +vn 0.7512 -0.6578 -0.0545 +vn -0.6133 -0.6331 -0.4723 +vn 0.7413 -0.6203 -0.2564 +vn 0.7415 -0.6207 -0.2549 +vn 0.8138 -0.5285 -0.2416 +vn 0.4389 -0.7532 -0.4899 +vn 0.8011 -0.4615 -0.3812 +vn 0.6529 0.7571 -0.0227 +vn -0.6536 -0.7566 0.0189 +vn -0.7478 0.6638 -0.0086 +vn -0.6167 -0.7065 0.3471 +vn -0.2788 -0.9592 0.0472 +vn -0.6377 -0.7481 0.1834 +vn -0.6375 -0.7475 0.1868 +vn -0.8245 -0.5583 0.0923 +vn -0.6550 -0.7193 -0.2316 +vn -0.7488 0.6625 0.0201 +vn 0.7462 -0.6650 -0.0302 +vn 0.7565 -0.6539 0.0119 +vn 0.6366 0.7453 -0.1981 +vn 0.6370 0.7462 -0.1935 +vn 0.7874 0.6059 -0.1137 +vn 0.3523 0.9333 -0.0691 +vn 0.6541 0.7222 0.2251 +vn 0.6222 0.7201 -0.3071 +vn -0.7573 0.6531 0.0041 +vn -0.7571 0.6532 0.0035 +vn -0.7671 0.6394 -0.0523 +vn -0.7636 0.6435 -0.0521 +vn -0.7636 0.6436 -0.0515 +vn -0.7620 0.6454 -0.0532 +vn -0.7657 0.6408 -0.0559 +vn 0.6235 0.7186 -0.3079 +vn -0.6213 -0.7190 0.3114 +vn 0.7571 -0.6533 -0.0036 +vn 0.7573 -0.6531 -0.0043 +vn -0.6225 -0.7205 0.3055 +vn 0.7636 -0.6436 0.0518 +vn 0.7637 -0.6435 0.0524 +vn 0.7621 -0.6453 0.0533 +vn 0.7670 -0.6395 0.0525 +vn 0.7656 -0.6408 0.0564 +vn 0.6439 0.7477 -0.1622 +vn -0.6442 -0.7481 0.1595 +vn -0.7566 0.6538 0.0108 +vn -0.6922 -0.7009 0.1722 +vn -0.6453 -0.7492 0.1494 +vn -0.6453 -0.7492 0.1495 +vn -0.5819 -0.7945 0.1738 +vn -0.7559 0.6547 -0.0005 +vn 0.7576 -0.6527 -0.0014 +vn 0.7566 -0.6538 -0.0107 +vn 0.6452 0.7491 -0.1501 +vn 0.6452 0.7492 -0.1499 +vn 0.5776 0.7973 -0.1754 +vn 0.6953 0.6973 -0.1739 +vn -0.7561 0.6543 0.0134 +vn -0.7563 0.6541 0.0133 +vn -0.7565 0.6538 0.0135 +vn 0.7563 -0.6541 -0.0133 +vn 0.7565 -0.6538 -0.0135 +vn 0.7561 -0.6543 -0.0134 +vn -0.6636 -0.7379 0.1230 +vn -0.6486 -0.7523 0.1158 +vn -0.6320 -0.7652 0.1225 +vn 0.6486 0.7523 -0.1158 +vn 0.6318 0.7654 -0.1225 +vn 0.6638 0.7378 -0.1230 +vn 0.6504 0.7541 -0.0907 +vn -0.7490 0.6626 -0.0005 +vn -0.7575 0.6528 -0.0036 +vn -0.7657 0.6432 0.0019 +vn -0.6503 -0.7539 0.0934 +vn 0.7576 -0.6527 0.0056 +vn -0.6504 -0.7541 0.0907 +vn 0.7575 -0.6528 0.0036 +vn 0.7575 -0.6528 0.0035 +vn 0.7657 -0.6432 -0.0019 +vn 0.7490 -0.6626 0.0004 +vn 0.6515 0.7557 -0.0662 +vn -0.6515 -0.7558 0.0662 +vn -0.7567 0.6537 0.0124 +vn -0.6541 -0.7564 -0.0032 +vn -0.6737 -0.7370 0.0542 +vn -0.6519 -0.7571 0.0436 +vn -0.6519 -0.7571 0.0435 +vn -0.6282 -0.7762 0.0531 +vn -0.6508 -0.7546 0.0839 +vn -0.7567 0.6538 0.0069 +vn 0.7567 -0.6538 -0.0064 +vn 0.6541 0.7564 0.0032 +vn 0.7566 -0.6538 -0.0126 +vn 0.6519 0.7571 -0.0435 +vn 0.6519 0.7571 -0.0436 +vn 0.6278 0.7765 -0.0530 +vn 0.6741 0.7367 -0.0541 +vn -0.7550 0.6530 0.0602 +vn 0.7550 -0.6530 -0.0601 +vn 0.6533 0.7548 0.0584 +vn -0.7488 0.6277 0.2129 +vn -0.7487 0.6280 0.2125 +vn -0.7851 0.6136 0.0843 +vn -0.7499 0.6529 0.1061 +vn -0.7500 0.6528 0.1071 +vn -0.7097 0.6985 0.0922 +vn -0.7562 0.6536 0.0327 +vn 0.6538 0.7556 0.0404 +vn -0.6509 -0.7583 -0.0373 +vn 0.7487 -0.6279 -0.2126 +vn 0.7488 -0.6276 -0.2130 +vn -0.6534 -0.7547 -0.0596 +vn 0.7499 -0.6529 -0.1065 +vn 0.7499 -0.6531 -0.1055 +vn 0.7114 -0.6969 -0.0914 +vn 0.7839 -0.6152 -0.0835 +vn 0.7561 -0.6536 -0.0327 +vn 0.6618 0.7238 0.1955 +vn -0.6618 -0.7235 -0.1965 +vn -0.7483 0.6233 0.2271 +vn -0.6580 -0.7418 -0.1294 +vn -0.6583 -0.7415 -0.1296 +vn -0.7006 -0.6901 -0.1817 +vn -0.6621 -0.7191 -0.2112 +vn -0.6621 -0.7191 -0.2110 +vn -0.6083 -0.7670 -0.2042 +vn -0.6590 -0.7407 -0.1305 +vn -0.7460 0.6320 0.2100 +vn 0.7490 -0.6274 -0.2130 +vn 0.6582 0.7416 0.1291 +vn 0.6583 0.7414 0.1302 +vn 0.6580 0.7417 0.1298 +vn 0.7483 -0.6233 -0.2269 +vn 0.6621 0.7192 0.2108 +vn 0.6621 0.7191 0.2110 +vn 0.6048 0.7699 0.2036 +vn 0.7034 0.6878 0.1794 +vn 0.6592 0.7407 0.1294 +vn -0.7502 0.6375 0.1754 +vn 0.7500 -0.6380 -0.1745 +vn 0.6420 0.7667 -0.0052 +vn -0.7706 0.6286 -0.1054 +vn -0.7704 0.6287 -0.1057 +vn -0.6416 0.7575 0.1204 +vn -0.7457 0.6615 0.0799 +vn -0.7454 0.6616 0.0812 +vn -0.8039 0.5823 0.1209 +vn -0.7482 0.6226 0.2294 +vn 0.6349 0.7703 0.0589 +vn -0.6362 -0.7703 -0.0443 +vn 0.7704 -0.6287 0.1054 +vn 0.7705 -0.6287 0.1052 +vn -0.6393 -0.7690 0.0045 +vn 0.7456 -0.6615 -0.0802 +vn 0.7458 -0.6614 -0.0792 +vn 0.8067 -0.5791 -0.1175 +vn 0.6355 -0.7630 -0.1183 +vn 0.7484 -0.6222 -0.2298 +vn 0.6282 0.7275 -0.2757 +vn -0.6284 -0.7274 0.2756 +vn -0.7710 0.6110 -0.1796 +vn -0.5762 -0.5263 0.6253 +vn -0.5766 -0.5264 0.6249 +vn -0.3988 -0.8438 0.3591 +vn -0.6038 -0.6925 0.3949 +vn -0.6038 -0.6931 0.3937 +vn -0.7292 -0.6097 0.3108 +vn -0.6392 -0.7533 0.1545 +vn -0.7602 0.6331 -0.1456 +vn 0.7602 -0.6332 0.1457 +vn 0.5766 0.5266 -0.6246 +vn 0.5762 0.5265 -0.6252 +vn 0.7708 -0.6115 0.1788 +vn 0.6038 0.6939 -0.3922 +vn 0.6038 0.6931 -0.3937 +vn 0.7135 0.6260 -0.3148 +vn 0.4308 0.8288 -0.3572 +vn 0.6380 0.7536 -0.1583 +vn -0.8037 0.4921 -0.3346 +vn 0.8037 -0.4912 0.3358 +vn 0.5448 0.4241 -0.7234 +vn -0.8393 0.1966 -0.5069 +vn -0.8392 0.1964 -0.5072 +vn -0.6169 0.5611 -0.5519 +vn -0.8104 0.4013 -0.4269 +vn -0.8107 0.3999 -0.4276 +vn -0.8693 0.3876 -0.3067 +vn -0.7883 0.5643 -0.2451 +vn 0.5401 0.4876 -0.6860 +vn -0.5396 -0.4921 0.6831 +vn 0.8391 -0.1966 0.5071 +vn 0.8393 -0.1968 0.5068 +vn -0.5449 -0.4226 0.7242 +vn 0.8107 -0.4002 0.4274 +vn 0.8104 -0.4014 0.4268 +vn 0.8760 -0.3800 0.2971 +vn 0.5902 -0.5711 0.5705 +vn 0.7885 -0.5642 0.2447 +vn 0.5396 0.2020 -0.8173 +vn -0.5397 -0.2023 0.8172 +vn -0.8393 0.1317 -0.5275 +vn -0.5289 0.0584 0.8467 +vn -0.5288 0.0585 0.8467 +vn -0.3597 -0.1989 0.9116 +vn -0.5296 -0.1202 0.8397 +vn -0.5296 -0.1204 0.8397 +vn -0.6283 -0.1442 0.7645 +vn -0.5458 -0.2998 0.7825 +vn -0.8340 0.1703 -0.5248 +vn 0.8334 -0.1745 0.5244 +vn 0.5288 -0.0588 -0.8467 +vn 0.5289 -0.0586 -0.8466 +vn 0.8393 -0.1319 0.5275 +vn 0.5296 0.1208 -0.8396 +vn 0.5296 0.1205 -0.8397 +vn 0.6181 0.1455 -0.7726 +vn 0.3787 0.1954 -0.9046 +vn 0.5462 0.3007 -0.7818 +vn -0.8477 -0.0123 -0.5303 +vn 0.8477 0.0120 0.5304 +vn 0.5254 -0.1323 -0.8405 +vn -0.8486 -0.1663 -0.5022 +vn -0.8485 -0.1665 -0.5023 +vn -0.7732 -0.0499 -0.6322 +vn -0.8471 -0.0738 -0.5262 +vn -0.8472 -0.0747 -0.5260 +vn -0.8856 -0.0355 -0.4630 +vn -0.8456 0.0615 -0.5303 +vn 0.5185 -0.0937 -0.8499 +vn -0.5225 0.0900 0.8479 +vn 0.8485 0.1664 0.5023 +vn 0.8486 0.1662 0.5023 +vn -0.5255 0.1333 0.8403 +vn 0.8471 0.0740 0.5262 +vn 0.8471 0.0732 0.5264 +vn 0.8882 0.0339 0.4582 +vn 0.7675 0.0498 0.6391 +vn 0.8455 -0.0614 0.5304 +vn 0.5286 -0.2398 -0.8143 +vn -0.5287 0.2395 0.8143 +vn -0.8480 -0.1829 -0.4975 +vn -0.5286 0.2438 0.8131 +vn -0.5287 0.2437 0.8131 +vn -0.4871 0.2471 0.8376 +vn -0.5290 0.2537 0.8098 +vn -0.5290 0.2539 0.8097 +vn -0.5618 0.2338 0.7935 +vn -0.5282 0.1987 0.8256 +vn -0.8486 -0.1709 -0.5008 +vn 0.8486 0.1694 0.5012 +vn 0.5287 -0.2436 -0.8131 +vn 0.5286 -0.2437 -0.8131 +vn 0.8483 0.1832 0.4968 +vn -0.0292 0.9489 -0.3143 +vn 0.5290 -0.2541 -0.8097 +vn 0.5290 -0.2539 -0.8097 +vn 0.5604 -0.2348 -0.7942 +vn 0.4888 -0.2475 -0.8366 +vn 0.5280 -0.1993 -0.8255 +vn -0.8482 -0.1865 -0.4958 +vn 0.5264 -0.2103 -0.8238 +vn -0.8504 -0.1111 -0.5143 +vn -0.8506 -0.1104 -0.5141 +vn -0.8593 -0.1689 -0.4827 +vn -0.8482 -0.1663 -0.5030 +vn -0.8482 -0.1661 -0.5030 +vn -0.8355 -0.1779 -0.5199 +vn -0.8480 -0.1944 -0.4931 +vn 0.5278 -0.2223 -0.8198 +vn -0.5262 0.2239 0.8203 +vn 0.8506 0.1116 0.5139 +vn 0.8504 0.1113 0.5143 +vn -0.5264 0.2099 0.8239 +vn 0.8482 0.1663 0.5030 +vn 0.8481 0.1665 0.5029 +vn 0.8357 0.1781 0.5196 +vn 0.8592 0.1693 0.4829 +vn 0.8480 0.1943 0.4931 +vn 0.5248 -0.1245 -0.8421 +vn -0.5246 0.1256 0.8420 +vn -0.8506 -0.0678 -0.5215 +vn -0.5199 -0.0549 0.8524 +vn -0.5199 -0.0548 0.8525 +vn -0.5860 0.0814 0.8063 +vn -0.5213 0.0594 0.8513 +vn -0.5213 0.0595 0.8513 +vn -0.4416 0.0956 0.8921 +vn -0.5263 0.1728 0.8326 +vn -0.8491 -0.0868 -0.5211 +vn 0.8491 0.0869 0.5211 +vn 0.5199 0.0549 -0.8525 +vn 0.8506 0.0679 0.5214 +vn 0.5213 -0.0595 -0.8513 +vn 0.5213 -0.0594 -0.8513 +vn 0.4373 -0.0958 -0.8942 +vn 0.5890 -0.0808 -0.8041 +vn 0.5262 -0.1724 -0.8327 +vn -0.8535 -0.0000 -0.5210 +vn 0.8536 -0.0002 0.5210 +vn 0.5173 0.1027 -0.8496 +vn -0.8560 0.0670 -0.5126 +vn -0.8559 0.0668 -0.5128 +vn -0.8702 0.0094 -0.4926 +vn -0.8538 0.0243 -0.5200 +vn -0.8538 0.0242 -0.5200 +vn -0.8293 0.0148 -0.5586 +vn -0.8527 -0.0259 -0.5217 +vn 0.5176 0.0783 -0.8520 +vn -0.5176 -0.0796 0.8519 +vn 0.8559 -0.0669 0.5127 +vn 0.8560 -0.0670 0.5126 +vn -0.5176 -0.1026 0.8494 +vn 0.8538 -0.0243 0.5200 +vn 0.8538 -0.0244 0.5200 +vn 0.8301 -0.0149 0.5574 +vn 0.8697 -0.0097 0.4935 +vn 0.8529 0.0263 0.5215 +vn -0.5153 -0.1901 0.8357 +vn -0.8562 0.0725 -0.5115 +vn -0.5148 -0.2024 0.8331 +vn -0.5148 -0.2025 0.8331 +vn -0.5487 -0.1882 0.8145 +vn -0.5147 -0.2042 0.8327 +vn -0.5147 -0.2041 0.8327 +vn -0.4779 -0.1929 0.8570 +vn -0.5169 -0.1490 0.8430 +vn -0.8555 0.0661 -0.5136 +vn 0.8559 -0.0665 0.5128 +vn 0.5148 0.2026 -0.8330 +vn 0.5147 0.2025 -0.8331 +vn 0.8562 -0.0724 0.5115 +vn 0.5147 0.2039 -0.8327 +vn 0.5147 0.2040 -0.8327 +vn 0.4768 0.1926 -0.8577 +vn 0.5498 0.1876 -0.8139 +vn -0.8560 0.0669 -0.5127 +vn 0.8559 -0.0668 0.5128 +vn 0.5160 0.1685 -0.8398 +vn -0.8519 -0.0118 -0.5236 +vn -0.8520 -0.0116 -0.5234 +vn -0.8427 0.0572 -0.5354 +vn -0.8541 0.0464 -0.5180 +vn -0.8541 0.0467 -0.5180 +vn -0.8657 0.0506 -0.4980 +vn 0.5141 0.1810 -0.8384 +vn -0.5143 -0.1788 0.8388 +vn 0.8520 0.0117 0.5234 +vn 0.8519 0.0119 0.5236 +vn -0.5152 -0.1689 0.8403 +vn 0.8541 -0.0465 0.5180 +vn 0.8541 -0.0462 0.5180 +vn 0.8658 -0.0503 0.4978 +vn 0.8425 -0.0570 0.5357 +vn 0.5209 0.0699 -0.8508 +vn -0.5209 -0.0688 0.8508 +vn -0.8482 -0.0544 -0.5269 +vn -0.5310 0.1665 0.8309 +vn -0.5306 0.1671 0.8310 +vn -0.4202 -0.0231 0.9072 +vn -0.5214 0.0056 0.8533 +vn -0.5213 0.0053 0.8533 +vn -0.5988 -0.0319 0.8003 +vn -0.5182 -0.1287 0.8455 +vn -0.8489 -0.0341 -0.5275 +vn 0.8477 0.0354 0.5293 +vn 0.5306 -0.1681 -0.8308 +vn 0.5310 -0.1674 -0.8307 +vn 0.8482 0.0542 0.5269 +vn 0.5213 -0.0048 -0.8534 +vn 0.5213 -0.0051 -0.8534 +vn 0.5944 0.0328 -0.8035 +vn 0.4263 0.0243 -0.9042 +vn 0.5183 0.1292 -0.8454 +vn -0.8466 -0.1455 -0.5120 +vn 0.8466 0.1446 0.5122 +vn 0.5304 -0.2273 -0.8167 +vn -0.8417 -0.2797 -0.4619 +vn -0.8419 -0.2793 -0.4618 +vn -0.8020 -0.1739 -0.5714 +vn -0.8431 -0.1799 -0.5069 +vn -0.8430 -0.1795 -0.5070 +vn -0.8699 -0.1496 -0.4701 +vn -0.8481 -0.0991 -0.5204 +vn 0.5254 -0.1923 -0.8288 +vn -0.5256 0.1935 0.8284 +vn 0.8419 0.2795 0.4617 +vn 0.8417 0.2798 0.4618 +vn -0.5292 0.2273 0.8175 +vn -0.0259 0.9065 -0.4215 +vn 0.8431 0.1798 0.5069 +vn 0.8431 0.1801 0.5068 +vn 0.8710 0.1493 0.4680 +vn 0.7998 0.1748 0.5743 +vn 0.8481 0.0992 0.5205 +vn 0.5370 -0.3995 -0.7430 +vn -0.5371 0.4006 0.7423 +vn -0.8319 -0.3616 -0.4210 +vn -0.5426 0.7204 0.4321 +vn -0.3024 0.5441 0.7826 +vn -0.5278 0.5316 0.6624 +vn -0.5277 0.5311 0.6629 +vn -0.6696 0.4126 0.6176 +vn -0.5348 0.2984 0.7906 +vn -0.8326 -0.3260 -0.4477 +vn 0.8268 0.3364 0.4507 +vn 0.5426 -0.7203 -0.4322 +vn 0.5425 -0.7203 -0.4322 +vn 0.8318 0.3614 0.4213 +vn 0.5275 -0.5300 -0.6639 +vn 0.5277 -0.5307 -0.6633 +vn 0.6566 -0.4154 -0.6296 +vn 0.3277 -0.5359 -0.7781 +vn 0.5349 -0.2977 -0.7907 +vn -0.8387 -0.4671 -0.2801 +vn 0.8386 0.4672 0.2801 +vn 0.5304 -0.7964 -0.2906 +vn -0.8439 -0.5364 -0.0121 +vn -0.8434 -0.5372 -0.0109 +vn -0.7021 -0.6417 -0.3088 +vn -0.8290 -0.5205 -0.2046 +vn -0.8287 -0.5202 -0.2065 +vn -0.8769 -0.4298 -0.2151 +vn 0.5153 -0.7733 -0.3696 +vn -0.5165 0.7761 0.3618 +vn 0.8434 0.5372 0.0115 +vn 0.8439 0.5364 0.0126 +vn -0.5261 0.7984 0.2928 +vn 0.0292 0.0575 -0.9979 +vn 0.8289 0.5204 0.2054 +vn 0.8291 0.5206 0.2037 +vn 0.8812 0.4232 0.2107 +vn 0.6854 0.6566 0.3149 +vn 0.8387 0.4189 0.3479 +vn 0.5336 -0.8447 0.0413 +vn -0.5344 0.8444 -0.0377 +vn -0.8427 -0.5380 0.0213 +vn -0.5336 0.8441 -0.0530 +vn -0.5335 0.8441 -0.0532 +vn -0.5335 0.8442 -0.0532 +vn -0.3504 0.9363 -0.0234 +vn -0.5332 0.8416 -0.0863 +vn -0.5331 0.8415 -0.0876 +vn -0.6431 0.7648 -0.0390 +vn -0.5377 0.8343 0.1219 +vn -0.8446 -0.5353 -0.0026 +vn 0.8442 0.5359 0.0111 +vn 0.5335 -0.8441 0.0534 +vn 0.5336 -0.8441 0.0532 +vn 0.8456 0.5333 -0.0236 +vn 0.5331 -0.8412 0.0901 +vn 0.5331 -0.8414 0.0887 +vn 0.6275 -0.7772 0.0470 +vn 0.3730 -0.9273 0.0313 +vn 0.5374 -0.8346 -0.1209 +vn -0.8455 -0.5335 0.0203 +vn 0.8456 0.5335 -0.0201 +vn 0.5334 -0.8449 0.0407 +vn -0.8455 -0.5319 0.0471 +vn -0.8536 -0.5203 0.0256 +vn -0.8455 -0.5336 0.0211 +vn -0.8455 -0.5336 0.0210 +vn -0.8359 -0.5482 0.0277 +vn -0.8460 -0.5315 0.0429 +vn 0.5339 -0.8435 0.0588 +vn -0.5339 0.8436 -0.0573 +vn 0.8455 0.5319 -0.0471 +vn -0.5338 0.8446 -0.0409 +vn 0.8455 0.5336 -0.0211 +vn 0.8360 0.5481 -0.0277 +vn 0.8536 0.5204 -0.0256 +vn 0.8459 0.5315 -0.0428 +vn -0.8453 -0.5311 0.0576 +vn -0.5339 0.8429 -0.0673 +vn -0.5167 0.8537 -0.0649 +vn -0.5340 0.8426 -0.0704 +vn -0.5494 0.8331 -0.0631 +vn -0.8455 -0.5316 0.0511 +vn 0.8455 0.5316 -0.0508 +vn 0.5339 -0.8429 0.0674 +vn 0.8454 0.5310 -0.0577 +vn 0.5340 -0.8426 0.0704 +vn 0.5492 -0.8333 0.0633 +vn 0.5170 -0.8535 0.0650 +vn 0.5332 -0.8447 0.0470 +vn -0.8510 -0.5223 0.0551 +vn -0.8454 -0.5317 0.0519 +vn -0.8394 -0.5407 0.0560 +vn 0.5336 -0.8440 0.0540 +vn -0.5332 0.8443 -0.0544 +vn -0.5332 0.8447 -0.0469 +vn 0.8454 0.5317 -0.0519 +vn 0.8454 0.5316 -0.0520 +vn 0.8394 0.5406 -0.0560 +vn 0.8509 0.5224 -0.0551 +vn -0.8462 -0.5329 -0.0014 +vn -0.5670 0.8234 0.0216 +vn -0.5311 0.8465 0.0366 +vn -0.5311 0.8465 0.0367 +vn -0.4913 0.8707 0.0213 +vn -0.8454 -0.5340 0.0081 +vn 0.8454 0.5341 -0.0083 +vn 0.8460 0.5333 0.0016 +vn 0.5311 -0.8465 -0.0369 +vn 0.5311 -0.8465 -0.0368 +vn 0.4899 -0.8715 -0.0216 +vn 0.5681 -0.8226 -0.0220 +vn 0.5291 -0.8356 -0.1479 +vn -0.8480 -0.5249 -0.0730 +vn -0.8481 -0.5249 -0.0730 +vn -0.8620 -0.5044 -0.0515 +vn -0.8478 -0.5263 -0.0649 +vn -0.8478 -0.5264 -0.0647 +vn -0.8287 -0.5566 -0.0587 +vn -0.8469 -0.5312 -0.0243 +vn 0.5298 -0.8383 -0.1291 +vn -0.5298 0.8380 0.1307 +vn 0.8481 0.5249 0.0730 +vn 0.8480 0.5249 0.0729 +vn -0.5296 0.8353 0.1477 +vn 0.8478 0.5263 0.0648 +vn 0.8478 0.5263 0.0650 +vn 0.8291 0.5561 0.0588 +vn 0.8617 0.5048 0.0518 +vn 0.8469 0.5312 0.0244 +vn 0.5293 -0.8328 -0.1624 +vn -0.8468 -0.5294 -0.0521 +vn -0.5319 0.8464 0.0268 +vn -0.5320 0.8463 0.0269 +vn -0.4998 0.8552 0.1371 +vn -0.5290 0.8394 0.1248 +vn -0.5290 0.8394 0.1251 +vn -0.5571 0.8195 0.1345 +vn -0.8476 -0.5273 -0.0590 +vn 0.8467 0.5289 0.0580 +vn 0.5320 -0.8463 -0.0272 +vn 0.5319 -0.8464 -0.0270 +vn 0.8468 0.5294 0.0523 +vn 0.5289 -0.8393 -0.1256 +vn 0.5290 -0.8393 -0.1253 +vn 0.5566 -0.8197 -0.1353 +vn 0.5003 -0.8548 -0.1378 +vn -0.8464 -0.5325 0.0025 +vn 0.8463 0.5327 -0.0029 +vn 0.5323 -0.8465 0.0057 +vn -0.8450 -0.5311 0.0630 +vn -0.8180 -0.5751 0.0144 +vn -0.8465 -0.5315 0.0317 +vn -0.8464 -0.5315 0.0326 +vn -0.8667 -0.4985 0.0192 +vn -0.8469 -0.5309 -0.0287 +vn 0.5303 -0.8477 -0.0150 +vn -0.5311 0.8471 0.0178 +vn 0.8450 0.5311 -0.0630 +vn -0.5324 0.8465 -0.0062 +vn 0.8464 0.5315 -0.0323 +vn 0.8465 0.5315 -0.0315 +vn 0.8672 0.4976 -0.0190 +vn 0.8172 0.5761 -0.0142 +vn 0.8470 0.5308 0.0288 +vn -0.5296 0.8473 0.0401 +vn -0.8438 -0.5315 0.0740 +vn -0.5319 0.8466 0.0175 +vn -0.5321 0.8465 0.0177 +vn -0.5708 0.8201 0.0399 +vn -0.5286 0.8472 0.0525 +vn -0.5286 0.8472 0.0526 +vn -0.4902 0.8710 0.0334 +vn -0.5326 0.8463 -0.0120 +vn -0.8449 -0.5304 0.0691 +vn 0.8442 0.5315 -0.0694 +vn 0.5321 -0.8465 -0.0178 +vn 0.5320 -0.8465 -0.0184 +vn 0.8438 0.5315 -0.0740 +vn 0.5286 -0.8472 -0.0523 +vn 0.4893 -0.8715 -0.0328 +vn 0.5718 -0.8194 -0.0395 +vn 0.5326 -0.8463 0.0118 +vn -0.8411 -0.5310 0.1028 +vn 0.8410 0.5312 -0.1030 +vn 0.5389 -0.8364 0.1004 +vn -0.8371 -0.5010 0.2197 +vn -0.8382 -0.5014 0.2145 +vn -0.8126 -0.5686 0.1278 +vn -0.8337 -0.5355 0.1348 +vn -0.8335 -0.5364 0.1325 +vn -0.8538 -0.5078 0.1150 +vn -0.8428 -0.5313 0.0858 +vn 0.5276 -0.8484 0.0430 +vn -0.5318 0.8437 -0.0732 +vn 0.8382 0.5009 -0.2157 +vn 0.8372 0.5007 -0.2200 +vn -0.5342 0.8401 -0.0935 +vn 0.8335 0.5362 -0.1330 +vn 0.8337 0.5354 -0.1352 +vn 0.8542 0.5069 -0.1156 +vn 0.8119 0.5696 -0.1282 +vn 0.8428 0.5313 -0.0857 +vn 0.5344 -0.7077 0.4622 +vn -0.5326 0.6897 -0.4906 +vn -0.8370 -0.4694 0.2811 +vn -0.3569 0.0921 -0.9296 +vn -0.0147 0.7426 -0.6695 +vn -0.4841 0.4680 -0.7394 +vn -0.4827 0.4623 -0.7438 +vn -0.7977 0.3359 -0.5009 +vn -0.5455 0.8017 -0.2443 +vn -0.8287 -0.4927 0.2657 +vn 0.8263 0.4975 -0.2640 +vn 0.8432 0.4611 -0.2763 +vn 0.3583 -0.8906 -0.2799 +vn 0.4787 -0.4467 0.7558 +vn 0.4809 -0.4551 0.7494 +vn 0.7523 -0.3772 0.5401 +vn 0.1046 -0.7275 0.6781 +vn 0.5456 -0.8021 0.2426 +vn -0.8465 -0.4532 0.2792 +vn 0.8466 0.4531 -0.2792 +vn 0.3281 -0.0256 0.9443 +vn -0.8226 -0.5012 0.2686 +vn -0.8225 -0.5015 0.2683 +vn -0.8671 -0.4576 0.1966 +vn -0.8331 -0.4830 0.2696 +vn -0.8329 -0.4832 0.2696 +vn -0.8254 -0.4710 0.3112 +vn -0.8606 -0.4187 0.2898 +vn 0.3420 -0.0580 0.9379 +vn -0.3497 0.0726 -0.9340 +vn 0.8225 0.5014 -0.2683 +vn 0.8226 0.5011 -0.2686 +vn -0.3250 0.0263 -0.9454 +vn 0.8327 0.4836 -0.2696 +vn 0.8328 0.4834 -0.2696 +vn 0.8254 0.4711 -0.3110 +vn 0.8671 0.4576 -0.1968 +vn 0.8609 0.4165 -0.2922 +vn 0.2374 0.1256 0.9633 +vn -0.2375 -0.1255 -0.9633 +vn -0.8355 -0.4782 0.2708 +vn -0.0771 -0.3900 -0.9176 +vn -0.0773 -0.3900 -0.9176 +vn -0.0723 -0.0931 -0.9930 +vn -0.1803 -0.2118 -0.9605 +vn -0.1807 -0.2110 -0.9606 +vn -0.3332 -0.2392 -0.9120 +vn -0.2870 -0.0419 -0.9570 +vn -0.8308 -0.4860 0.2711 +vn 0.8313 0.4843 -0.2726 +vn 0.0772 0.3901 0.9175 +vn 0.0775 0.3897 0.9177 +vn 0.8353 0.4784 -0.2708 +vn 0.1810 0.2106 0.9607 +vn 0.1805 0.2114 0.9606 +vn 0.3235 0.2322 0.9173 +vn 0.0848 0.0996 0.9914 +vn 0.2871 0.0414 0.9570 +vn -0.8717 -0.4198 0.2530 +vn 0.8720 0.4191 -0.2530 +vn 0.0237 0.4739 0.8802 +vn -0.9349 -0.3038 0.1836 +vn -0.9351 -0.3032 0.1837 +vn -0.8750 -0.3542 0.3300 +vn -0.8947 -0.3773 0.2390 +vn -0.8948 -0.3771 0.2389 +vn -0.8862 -0.4179 0.2002 +vn -0.8512 -0.4539 0.2634 +vn 0.0431 0.4309 0.9014 +vn -0.0440 -0.4289 -0.9023 +vn 0.9350 0.3034 -0.1838 +vn 0.9348 0.3040 -0.1838 +vn 0.8949 0.3771 -0.2389 +vn 0.8948 0.3772 -0.2390 +vn 0.8863 0.4186 -0.1982 +vn 0.8745 0.3520 -0.3336 +vn 0.8511 0.4542 -0.2633 +vn -0.0511 0.6249 0.7790 +vn 0.0501 -0.6236 -0.7801 +vn -0.9473 -0.2757 0.1632 +vn 0.0897 -0.7098 -0.6987 +vn 0.1868 -0.5969 -0.7803 +vn 0.0747 -0.6689 -0.7396 +vn 0.0747 -0.6689 -0.7395 +vn -0.0364 -0.6700 -0.7414 +vn 0.0177 -0.5597 -0.8285 +vn -0.9408 -0.2886 0.1778 +vn 0.9406 0.2890 -0.1782 +vn -0.0897 0.7098 0.6986 +vn 0.9473 0.2759 -0.1627 +vn -0.0748 0.6692 0.7393 +vn -0.0748 0.6691 0.7394 +vn 0.0273 0.6687 0.7430 +vn -0.1764 0.6019 0.7788 +vn -0.0189 0.5609 0.8276 +vt 0.625000 0.687500 +vt 0.562500 0.625000 +vt 0.625000 0.625000 +vt 0.937500 1.000000 +vt 0.062500 0.937500 +vt 0.937500 0.937500 +vt -0.000000 0.062500 +vt -0.000000 0.937500 +vt 0.937500 0.062500 +vt 1.000000 0.937500 +vt 0.562500 0.562500 +vt 0.437500 0.500000 +vt 0.562500 0.500000 +vt 0.437500 0.437500 +vt 0.562500 0.437500 +vt 0.562500 0.750000 +vt 0.562500 0.687500 +vt 1.000000 1.000000 +vt 0.937500 0.687500 +vt 0.937500 0.625000 +vt 0.062500 0.687500 +vt -0.000000 1.000000 +vt 0.062500 0.625000 +vt 1.000000 0.687500 +vt 1.000000 0.625000 +vt 1.000000 0.062500 +vt 0.062500 0.062500 +vt 0.562500 0.375000 +vt 0.375000 0.750000 +vt 0.437500 0.750000 +vt 1.000000 0.000000 +vt 0.062500 1.000000 +vt 0.062500 0.000000 +vt 0.937500 0.000000 +vt 0.500000 0.625000 +vt 0.500000 0.687500 +vt 0.437500 0.625000 +vt 0.437500 0.687500 +vt 0.375000 0.687500 +vt 0.375000 0.625000 +vt -0.000000 0.687500 +vt 0.375000 0.437500 +vt 0.375000 0.500000 +vt 0.437500 0.375000 +vt 0.500000 0.437500 +vt 0.500000 0.375000 +vt 0.625000 0.500000 +vt 0.437500 0.562500 +vt -0.000000 0.625000 +vt 0.000000 0.625000 +vt 0.812500 1.000000 +vt 0.187500 0.625000 +vt 0.625000 0.437500 +vt 0.500000 1.000000 +vt 0.312500 0.937500 +vt 0.312500 1.000000 +vt 0.750000 0.937500 +vt 0.750000 1.000000 +vt 0.250000 0.937500 +vt 0.250000 1.000000 +vt 0.250000 0.687500 +vt 0.250000 0.625000 +vt 0.062500 0.562500 +vt -0.000000 0.500000 +vt -0.000000 0.562500 +vt -0.000000 0.437500 +vt 0.062500 0.375000 +vt -0.000000 0.375000 +vt 0.187500 0.687500 +vt 0.812500 0.937500 +vt 0.812500 0.062500 +vt 0.812500 0.000000 +vt 0.812500 0.687500 +vt 0.812500 0.625000 +vt 0.500000 -0.000000 +vt 0.312500 0.062500 +vt 0.500000 0.062500 +vt 0.562500 0.000000 +vt -0.000000 0.000000 +vt 0.250000 0.062500 +vt 0.250000 0.000000 +vt 0.750000 0.625000 +vt 0.062500 0.312500 +vt -0.000000 0.312500 +vt 0.062500 0.500000 +vt 0.062500 0.437500 +vt 0.750000 0.687500 +vt 0.562500 0.062500 +vt 0.312500 0.000000 +vt 0.500000 0.937500 +vt 0.625000 0.562500 +vt 0.625000 0.750000 +vt 0.375000 0.562500 +s 0 +g Chest_chest-front +usemtl chest-front +f 18/1/1 52/2/1 94/3/1 +f 60/11/2 56/12/2 9/13/2 +f 23/13/2 72/14/2 103/15/2 +f 10/1/3 59/16/3 24/17/3 +f 3/18/2 67/19/2 50/20/2 +f 16/3/2 52/1/2 102/17/2 +f 57/27/2 100/9/2 70/28/2 +f 110/5/2 12/29/2 11/30/2 +f 52/3/3 115/19/3 94/1/3 +f 67/19/5 61/10/5 115/24/5 +f 59/17/5 102/35/5 24/36/5 +f 92/37/3 109/17/3 53/38/3 +f 11/36/1 92/37/1 53/35/1 +f 36/38/3 12/29/3 13/39/3 +f 13/39/5 37/37/5 38/40/5 +f 38/40/3 112/21/3 96/23/3 +f 110/5/1 96/41/1 112/21/1 +f 61/4/6 107/5/6 110/32/6 +f 88/21/6 14/40/6 39/23/6 +f 14/40/5 49/14/5 48/42/5 +f 26/12/6 48/42/6 49/43/6 +f 47/44/5 26/45/5 15/46/5 +f 15/14/6 54/28/6 47/44/6 +f 101/15/1 54/46/1 70/28/1 +f 35/47/6 103/15/6 101/13/6 +f 17/3/1 16/2/1 51/11/1 +f 17/1/6 50/20/6 16/3/6 +f 56/12/3 23/15/3 9/13/3 +f 66/11/5 9/47/5 23/13/5 +f 93/48/6 60/2/6 66/11/6 +f 25/48/1 34/43/1 56/12/1 +f 71/33/3 100/9/3 57/27/3 +f 57/27/1 39/49/1 71/7/1 +f 50/20/5 100/26/5 69/9/5 +f 18/1/1 10/17/1 52/2/1 +f 60/11/2 25/48/2 56/12/2 +f 23/13/2 34/12/2 72/14/2 +f 72/14/2 47/44/2 54/28/2 +f 103/15/2 55/53/2 23/13/2 +f 55/53/2 51/91/2 23/13/2 +f 72/14/2 54/28/2 103/15/2 +f 51/91/2 66/11/2 23/13/2 +f 10/1/3 18/92/3 59/16/3 +f 4/31/2 3/18/2 50/20/2 +f 3/18/2 28/4/2 68/6/2 +f 3/18/2 68/6/2 67/19/2 +f 69/9/2 21/34/2 4/31/2 +f 50/20/2 69/9/2 4/31/2 +f 68/6/2 28/4/2 107/5/2 +f 28/4/2 7/22/2 107/5/2 +f 7/22/2 8/79/2 39/23/2 +f 8/79/2 30/33/2 71/27/2 +f 30/33/2 21/34/2 69/9/2 +f 30/33/2 69/9/2 71/27/2 +f 96/21/2 107/5/2 7/22/2 +f 8/79/2 71/27/2 39/23/2 +f 96/21/2 7/22/2 39/23/2 +f 14/40/2 48/42/2 34/12/2 +f 48/42/2 72/14/2 34/12/2 +f 96/21/2 39/23/2 14/40/2 +f 36/30/2 13/29/2 38/39/2 +f 38/39/2 96/21/2 14/40/2 +f 14/40/2 34/12/2 93/48/2 +f 36/30/2 38/39/2 92/38/2 +f 38/39/2 14/40/2 92/38/2 +f 14/40/2 93/48/2 92/38/2 +f 93/48/2 66/11/2 102/17/2 +f 66/11/2 51/91/2 16/3/2 +f 16/3/2 50/20/2 67/19/2 +f 52/1/2 10/92/2 24/16/2 +f 16/3/2 67/19/2 52/1/2 +f 93/48/2 102/17/2 92/38/2 +f 66/11/2 16/3/2 102/17/2 +f 52/1/2 24/16/2 102/17/2 +f 15/44/2 26/14/2 49/42/2 +f 49/42/2 27/40/2 88/23/2 +f 100/9/2 43/20/2 35/53/2 +f 43/20/2 17/3/2 35/53/2 +f 35/53/2 101/15/2 70/28/2 +f 49/42/2 88/23/2 57/27/2 +f 15/44/2 49/42/2 57/27/2 +f 100/9/2 35/53/2 70/28/2 +f 70/28/2 15/44/2 57/27/2 +f 53/38/2 109/17/2 59/16/2 +f 18/92/2 94/1/2 115/19/2 +f 11/30/2 53/38/2 59/16/2 +f 18/92/2 115/19/2 61/6/2 +f 59/16/2 18/92/2 61/6/2 +f 61/6/2 110/5/2 11/30/2 +f 110/5/2 112/21/2 12/29/2 +f 112/21/2 37/39/2 12/29/2 +f 11/30/2 59/16/2 61/6/2 +f 52/3/3 67/20/3 115/19/3 +f 67/19/5 68/6/5 61/10/5 +f 59/17/5 109/2/5 102/35/5 +f 92/37/3 102/2/3 109/17/3 +f 11/36/1 36/38/1 92/37/1 +f 36/38/3 11/30/3 12/29/3 +f 13/39/5 12/38/5 37/37/5 +f 38/40/3 37/39/3 112/21/3 +f 110/5/1 107/8/1 96/41/1 +f 61/4/6 68/6/6 107/5/6 +f 88/21/6 27/39/6 14/40/6 +f 14/40/5 27/37/5 49/14/5 +f 26/12/6 72/14/6 48/42/6 +f 47/44/5 72/14/5 26/45/5 +f 15/14/6 70/15/6 54/28/6 +f 101/15/1 103/45/1 54/46/1 +f 35/47/6 55/53/6 103/15/6 +f 51/11/1 55/15/1 35/53/1 +f 35/53/1 17/3/1 51/11/1 +f 17/1/6 43/19/6 50/20/6 +f 56/12/3 34/14/3 23/15/3 +f 66/11/5 60/91/5 9/47/5 +f 93/48/6 25/37/6 60/2/6 +f 25/48/1 93/93/1 34/43/1 +f 71/33/3 69/34/3 100/9/3 +f 57/27/1 88/23/1 39/49/1 +f 50/20/5 43/25/5 100/26/5 +g Chest_chest-top +usemtl chest-top +f 91/4/2 58/5/2 78/6/2 +f 57/7/1 58/5/1 111/8/1 +f 64/6/3 65/9/3 29/10/3 +f 91/6/5 77/26/5 100/9/5 +f 58/5/6 79/27/6 19/7/6 +f 57/27/6 91/6/6 100/9/6 +f 110/27/3 62/6/3 108/5/3 +f 62/6/2 63/32/2 108/5/2 +f 61/26/5 64/6/5 62/10/5 +f 108/5/1 95/7/1 110/27/1 +f 110/33/4 65/9/4 61/34/4 +f 100/9/4 79/33/4 57/27/4 +f 33/26/6 77/9/6 78/6/6 +f 32/32/3 64/6/3 22/4/3 +f 91/4/1228 111/32/1228 58/5/1228 +f 57/7/1 79/27/1 58/5/1 +f 63/5/3 32/32/3 5/22/3 +f 31/7/3 7/79/3 95/27/3 +f 7/79/3 28/34/3 95/27/3 +f 63/5/3 5/22/3 31/7/3 +f 95/27/3 63/5/3 31/7/3 +f 28/34/3 3/31/3 65/9/3 +f 95/27/3 28/34/3 65/9/3 +f 29/10/3 1/18/3 22/4/3 +f 3/31/3 29/10/3 65/9/3 +f 29/10/3 22/4/3 64/6/3 +f 91/6/5 78/10/5 77/26/5 +f 79/27/6 30/33/6 8/79/6 +f 19/7/6 6/22/6 58/5/6 +f 6/22/6 20/32/6 58/5/6 +f 79/27/6 8/79/6 19/7/6 +f 57/27/1229 111/5/1229 91/6/1229 +f 110/27/3 61/9/3 62/6/3 +f 62/6/2 64/4/2 63/32/2 +f 61/26/5 65/9/5 64/6/5 +f 108/5/1 63/8/1 95/7/1 +f 110/33/4 95/27/4 65/9/4 +f 100/9/4 77/34/4 79/33/4 +f 33/26/6 4/31/6 21/34/6 +f 21/34/6 30/33/6 79/27/6 +f 21/34/6 79/27/6 77/9/6 +f 2/18/6 33/26/6 78/6/6 +f 33/26/6 21/34/6 77/9/6 +f 58/5/6 20/32/6 78/6/6 +f 20/32/6 2/18/6 78/6/6 +f 32/32/3 63/5/3 64/6/3 +g Chest_chest-side +usemtl chest-side +f 99/21/4 1/22/4 42/23/4 +f 7/4/5 73/24/5 46/25/5 +f 98/21/1 3/22/1 41/23/1 +f 45/20/1 82/9/1 2/31/1 +f 5/4/4 84/24/4 44/25/4 +f 106/5/6 110/4/6 74/6/6 +f 76/33/7 57/9/7 111/27/7 +f 73/19/4 110/10/4 112/24/4 +f 57/26/4 46/20/4 88/25/4 +f 5/22/5 40/23/5 97/21/5 +f 73/20/3 113/21/3 97/23/3 +f 84/20/3 114/21/3 99/23/3 +f 80/20/3 115/21/3 98/23/3 +f 40/23/6 88/19/6 46/20/6 +f 42/23/6 89/19/6 44/20/6 +f 41/23/6 86/19/6 45/20/6 +f 40/50/2 111/27/2 89/23/2 +f 97/41/2 108/5/2 106/8/2 +f 113/19/5 110/5/5 108/6/5 +f 85/10/1 113/19/1 84/24/1 +f 44/25/1 111/9/1 87/26/1 +f 111/33/8 90/9/8 87/27/8 +f 42/23/5 91/7/5 86/49/5 +f 111/27/4 86/20/4 91/9/4 +f 114/41/5 104/5/5 99/21/5 +f 62/32/6 85/6/6 104/5/6 +f 108/5/4 114/19/4 113/21/4 +f 82/34/3 100/27/3 83/33/3 +f 45/25/2 91/9/2 82/26/2 +f 43/49/4 83/27/4 100/7/4 +f 100/27/1 86/20/1 43/23/1 +f 62/6/2 80/24/2 81/10/2 +f 62/4/6 105/5/6 61/32/6 +f 105/5/4 115/41/4 61/8/4 +f 62/6/1 115/21/1 114/19/1 +f 111/9/5 88/23/5 89/20/5 +f 22/32/4 1/22/4 104/5/4 +f 1/22/4 2/79/4 42/23/4 +f 104/5/4 1/22/4 99/21/4 +f 2/79/4 20/34/4 90/27/4 +f 20/34/4 87/9/4 90/27/4 +f 85/6/4 32/4/4 22/32/4 +f 104/5/4 85/6/4 22/32/4 +f 2/79/4 90/27/4 42/23/4 +f 42/23/4 44/20/4 84/19/4 +f 42/23/4 84/19/4 99/21/4 +f 8/34/5 7/4/5 46/25/5 +f 7/4/5 31/18/5 74/10/5 +f 7/4/5 74/10/5 73/24/5 +f 75/26/5 19/31/5 8/34/5 +f 46/25/5 75/26/5 8/34/5 +f 41/23/1 45/20/1 80/19/1 +f 41/23/1 80/19/1 98/21/1 +f 4/79/1 33/33/1 83/27/1 +f 4/79/1 83/27/1 41/23/1 +f 81/6/1 29/4/1 105/5/1 +f 29/4/1 3/22/1 105/5/1 +f 3/22/1 4/79/1 41/23/1 +f 98/21/1 105/5/1 3/22/1 +f 2/31/1 1/18/1 45/20/1 +f 1/18/1 29/4/1 81/6/1 +f 1/18/1 81/6/1 80/19/1 +f 83/27/1 33/33/1 82/9/1 +f 33/33/1 2/31/1 82/9/1 +f 1/18/1 80/19/1 45/20/1 +f 6/34/4 5/4/4 44/25/4 +f 5/4/4 32/18/4 85/10/4 +f 5/4/4 85/10/4 84/24/4 +f 87/26/4 20/31/4 6/34/4 +f 44/25/4 87/26/4 6/34/4 +f 106/5/6 108/32/6 110/4/6 +f 76/33/3 75/34/3 57/9/3 +f 73/19/4 74/6/4 110/10/4 +f 57/26/4 75/9/4 46/20/4 +f 6/79/5 19/34/5 76/27/5 +f 19/34/5 75/9/5 76/27/5 +f 74/6/5 31/4/5 106/5/5 +f 31/4/5 5/22/5 106/5/5 +f 5/22/5 6/79/5 40/23/5 +f 6/79/5 76/27/5 40/23/5 +f 40/23/5 46/20/5 73/19/5 +f 97/21/5 106/5/5 5/22/5 +f 40/23/5 73/19/5 97/21/5 +f 73/20/3 112/19/3 113/21/3 +f 84/20/3 113/19/3 114/21/3 +f 80/20/3 114/19/3 115/21/3 +f 40/23/6 89/21/6 88/19/6 +f 42/23/6 86/21/6 89/19/6 +f 41/23/6 43/21/6 86/19/6 +f 40/50/1230 76/7/1230 111/27/1230 +f 97/41/2 113/21/2 108/5/2 +f 113/19/5 112/21/5 110/5/5 +f 85/10/1 108/6/1 113/19/1 +f 44/25/1 89/20/1 111/9/1 +f 111/33/1231 91/34/1231 90/9/1231 +f 42/23/5 90/27/5 91/7/5 +f 111/27/4 89/23/4 86/20/4 +f 114/41/5 62/8/5 104/5/5 +f 62/32/6 108/4/6 85/6/6 +f 108/5/4 62/6/4 114/19/4 +f 82/34/3 91/9/3 100/27/3 +f 45/25/2 86/20/2 91/9/2 +f 43/49/4 41/23/4 83/27/4 +f 100/27/1 91/9/1 86/20/1 +f 62/6/2 114/19/2 80/24/2 +f 62/4/6 81/6/6 105/5/6 +f 105/5/4 98/21/4 115/41/4 +f 62/6/1 61/5/1 115/21/1 +f 111/9/5 57/27/5 88/23/5 +g Chest_chain +usemtl chain +f 125/51/9 116/10/9 119/18/9 +f 122/41/10 141/52/10 126/49/10 +f 141/11/11 132/13/11 129/53/11 +f 128/54/12 129/55/12 127/56/12 +f 124/12/11 126/48/11 125/40/11 +f 121/57/10 116/54/10 117/58/10 +f 120/22/13 134/59/13 130/60/13 +f 118/11/14 127/53/14 131/13/14 +f 123/37/13 132/61/13 131/62/13 +f 131/63/15 121/64/15 117/65/15 +f 118/66/15 134/67/15 141/68/15 +f 118/17/15 132/35/15 131/36/15 +f 116/42/14 120/40/14 123/12/14 +f 122/61/15 124/52/15 123/69/15 +f 129/70/16 117/58/16 127/51/16 +f 130/60/17 133/55/17 128/56/17 +f 142/31/9 135/71/9 138/72/9 +f 137/25/18 118/73/18 131/74/18 +f 147/3/19 148/2/19 155/11/19 +f 147/75/20 143/76/20 144/77/20 +f 141/12/13 118/48/13 142/40/13 +f 140/71/21 135/78/21 136/72/21 +f 139/79/22 148/80/22 146/81/22 +f 144/3/23 156/13/23 137/11/23 +f 141/17/24 156/82/24 132/2/24 +f 156/68/25 140/83/25 136/84/25 +f 137/66/25 148/85/25 155/86/25 +f 137/87/26 158/74/26 155/73/26 +f 135/42/10 139/40/10 132/12/10 +f 140/77/27 143/78/27 145/88/27 +f 148/80/28 144/89/28 146/81/28 +f 157/51/29 149/10/29 152/18/29 +f 155/41/30 166/52/30 158/49/30 +f 164/3/31 166/11/31 163/13/31 +f 164/90/32 159/56/32 160/54/32 +f 157/40/33 152/42/33 158/48/33 +f 154/57/34 149/54/34 150/58/34 +f 153/22/35 165/59/35 162/60/35 +f 160/3/36 173/13/36 151/11/36 +f 137/37/37 163/61/37 173/62/37 +f 173/63/38 154/64/38 150/65/38 +f 151/66/38 165/67/38 166/68/38 +f 151/17/38 163/35/38 173/36/38 +f 155/48/39 137/12/39 149/42/39 +f 154/57/40 159/51/40 161/70/40 +f 165/59/41 160/56/41 162/60/41 +f 174/31/42 167/71/42 170/72/42 +f 173/74/43 187/24/43 151/73/43 +f 187/11/44 179/13/44 177/53/44 +f 176/77/45 177/89/45 175/76/45 +f 166/12/46 151/48/46 174/40/46 +f 172/71/47 167/78/47 168/72/47 +f 171/79/48 181/80/48 178/81/48 +f 169/11/49 175/53/49 188/13/49 +f 163/2/50 179/87/50 188/82/50 +f 168/84/51 179/67/51 172/83/51 +f 178/64/51 187/86/51 169/66/51 +f 169/87/52 179/74/52 187/73/52 +f 167/42/53 171/40/53 163/12/53 +f 172/77/54 175/78/54 177/88/54 +f 181/80/55 176/89/55 178/81/55 +f 184/18/56 185/70/56 182/10/56 +f 187/41/57 203/52/57 179/49/57 +f 196/3/58 197/2/58 203/11/58 +f 196/90/59 190/56/59 191/54/59 +f 189/40/60 184/42/60 179/48/60 +f 186/57/61 182/54/61 183/58/61 +f 185/22/62 197/59/62 193/60/62 +f 191/3/63 194/13/63 205/11/63 +f 169/37/64 195/61/64 194/62/64 +f 194/63/65 186/64/65 183/65/65 +f 205/66/65 197/67/65 203/68/65 +f 205/17/65 195/35/65 194/36/65 +f 187/48/66 169/12/66 182/42/66 +f 192/70/67 183/58/67 190/51/67 +f 193/60/68 196/55/68 191/56/68 +f 204/31/69 198/71/69 200/72/69 +f 219/25/70 205/73/70 194/74/70 +f 211/3/71 212/2/71 213/11/71 +f 207/77/72 208/89/72 206/76/72 +f 203/12/73 205/48/73 204/40/73 +f 200/88/74 199/72/74 202/71/74 +f 204/7/75 209/81/75 201/79/75 +f 206/53/76 199/15/76 220/13/76 +f 203/17/77 220/82/77 195/2/77 +f 220/68/78 202/83/78 199/84/78 +f 209/64/78 213/86/78 219/66/78 +f 220/82/79 213/73/79 219/87/79 +f 198/42/80 201/40/80 195/12/80 +f 208/88/81 199/75/81 206/78/81 +f 209/81/82 211/76/82 207/89/82 +f 221/51/83 214/10/83 216/18/83 +f 238/69/84 210/49/84 213/41/84 +f 227/3/85 229/11/85 236/13/85 +f 227/90/86 222/56/86 223/54/86 +f 220/12/87 210/48/87 221/40/87 +f 218/57/88 214/54/88 215/58/88 +f 221/8/89 225/60/89 217/22/89 +f 222/53/90 215/15/90 226/13/90 +f 219/37/91 236/61/91 226/62/91 +f 226/63/92 218/64/92 215/65/92 +f 225/86/92 229/68/92 238/66/92 +f 229/2/92 226/36/92 238/17/92 +f 214/42/93 217/40/93 219/12/93 +f 218/57/94 222/51/94 224/70/94 +f 228/59/95 223/56/95 225/60/95 +f 237/31/96 230/71/96 233/72/96 +f 226/74/97 253/24/97 238/73/97 +f 245/3/98 246/2/98 253/11/98 +f 245/75/99 239/76/99 240/77/99 +f 229/12/100 238/48/100 237/40/100 +f 235/71/101 230/78/101 231/72/101 +f 234/79/102 246/80/102 242/81/102 +f 240/3/103 243/13/103 232/11/103 +f 236/2/104 244/87/104 243/82/104 +f 231/84/105 244/67/105 235/83/105 +f 242/64/105 253/86/105 232/66/105 +f 232/87/106 244/74/106 253/73/106 +f 230/42/107 234/40/107 236/12/107 +f 241/88/108 231/75/108 239/78/108 +f 242/81/109 245/76/109 240/89/109 +f 254/51/110 247/10/110 250/18/110 +f 249/69/111 244/49/111 253/41/111 +f 268/11/112 267/13/112 257/53/112 +f 259/90/113 255/56/113 256/54/113 +f 243/12/114 244/48/114 254/40/114 +f 250/90/115 248/58/115 252/57/115 +f 254/8/116 258/60/116 251/22/116 +f 249/11/117 255/53/117 266/13/117 +f 243/38/118 266/62/118 232/37/118 +f 266/63/119 252/64/119 248/65/119 +f 249/66/119 260/67/119 268/68/119 +f 268/2/119 266/36/119 249/17/119 +f 247/42/120 251/40/120 232/12/120 +f 257/70/121 248/58/121 255/51/121 +f 258/60/122 259/55/122 256/56/122 +f 263/72/123 264/26/123 261/71/123 +f 282/25/124 249/73/124 266/74/124 +f 274/3/125 275/2/125 281/11/125 +f 274/75/126 270/76/126 271/77/126 +f 269/40/127 263/42/127 249/48/127 +f 263/88/128 262/72/128 265/71/128 +f 269/7/129 273/81/129 264/79/129 +f 271/3/130 283/13/130 282/11/130 +f 268/17/131 283/82/131 267/2/131 +f 262/84/132 285/67/132 265/83/132 +f 273/64/132 281/86/132 282/66/132 +f 266/48/133 267/12/133 261/42/133 +f 272/88/134 262/75/134 270/78/134 +f 273/81/135 274/76/135 271/89/135 +f 278/18/136 279/70/136 276/10/136 +f 302/69/137 285/49/137 281/41/137 +f 300/11/134 299/13/134 288/53/134 +f 291/90/138 286/56/138 287/54/138 +f 283/12/139 285/48/139 284/40/139 +f 278/90/140 277/58/140 280/57/140 +f 284/8/141 289/60/141 279/22/141 +f 286/53/135 277/15/135 290/13/135 +f 283/38/142 290/62/142 282/37/142 +f 277/65/143 299/85/143 280/64/143 +f 302/66/143 292/67/143 300/68/143 +f 302/17/143 299/35/143 290/36/143 +f 276/42/144 279/40/144 282/12/144 +f 281/61/132 283/52/132 282/69/132 +f 280/57/145 286/51/145 288/70/145 +f 292/59/146 287/56/146 289/60/146 +f 296/72/147 297/26/147 293/71/147 +f 295/25/134 302/73/134 290/74/134 +f 309/3/148 310/2/148 311/11/148 +f 304/77/149 305/89/149 303/76/149 +f 301/40/150 296/42/150 302/48/150 +f 298/71/134 293/78/134 294/72/134 +f 297/79/135 310/80/135 306/81/135 +f 304/3/151 307/13/151 295/11/151 +f 300/17/135 307/82/135 299/2/135 +f 307/68/152 298/83/152 294/84/152 +f 295/66/152 310/85/152 311/86/152 +f 307/82/153 311/73/153 295/87/153 +f 290/48/154 299/12/154 293/42/154 +f 298/77/155 303/78/155 305/88/155 +f 310/80/156 304/89/156 306/81/156 +f 317/51/157 312/10/157 314/18/157 +f 334/69/158 308/49/158 311/41/158 +f 324/11/159 332/13/159 320/53/159 +f 319/54/160 320/55/160 318/56/160 +f 317/40/161 314/42/161 308/48/161 +f 314/90/162 313/58/162 316/57/162 +f 317/8/163 321/60/163 315/22/163 +f 318/53/164 313/15/164 331/13/164 +f 307/38/165 331/62/165 295/37/165 +f 313/65/166 332/85/166 316/64/166 +f 334/66/166 323/67/166 324/68/166 +f 334/17/166 332/35/166 331/36/166 +f 311/48/167 295/12/167 312/42/167 +f 316/57/168 318/51/168 320/70/168 +f 323/59/169 319/56/169 321/60/169 +f 328/72/170 329/26/170 325/71/170 +f 331/74/171 343/24/171 334/73/171 +f 343/11/172 340/13/172 337/53/172 +f 336/77/173 337/89/173 335/76/173 +f 333/40/174 328/42/174 334/48/174 +f 330/71/175 325/78/175 326/72/175 +f 329/79/176 342/80/176 338/81/176 +f 327/11/177 335/53/177 339/13/177 +f 332/2/178 340/87/178 339/82/178 +f 339/68/179 330/83/179 326/84/179 +f 338/64/179 343/86/179 327/66/179 +f 339/82/180 343/73/180 327/87/180 +f 331/48/181 332/12/181 325/42/181 +f 337/88/182 326/75/182 335/78/182 +f 338/81/183 341/76/183 336/89/183 +f 349/51/184 344/10/184 346/18/184 +f 366/69/185 340/49/185 343/41/185 +f 356/11/186 364/13/186 352/53/186 +f 351/54/187 352/55/187 350/56/187 +f 349/40/188 346/42/188 340/48/188 +f 346/90/189 345/58/189 348/57/189 +f 349/8/190 353/60/190 347/22/190 +f 366/11/191 350/53/191 363/13/191 +f 339/38/192 363/62/192 327/37/192 +f 363/63/193 348/64/193 345/65/193 +f 366/66/193 355/67/193 356/68/193 +f 356/2/193 363/36/193 366/17/193 +f 343/48/194 327/12/194 344/42/194 +f 352/70/195 345/58/195 350/51/195 +f 353/60/196 354/55/196 351/56/196 +f 365/31/197 357/71/197 360/72/197 +f 359/25/198 366/73/198 363/74/198 +f 371/3/199 373/11/199 382/13/199 +f 368/77/200 369/89/200 367/76/200 +f 365/40/201 360/42/201 366/48/201 +f 360/88/202 358/72/202 362/71/202 +f 365/7/203 370/81/203 361/79/203 +f 380/13/204 359/11/204 368/3/204 +f 356/17/205 380/82/205 364/2/205 +f 358/84/206 382/67/206 362/83/206 +f 370/64/206 373/86/206 359/66/206 +f 380/82/207 373/73/207 359/87/207 +f 363/48/208 364/12/208 357/42/208 +f 362/77/209 367/78/209 369/88/209 +f 372/80/210 368/89/210 370/81/210 +f 377/18/211 378/70/211 374/10/211 +f 373/41/212 396/52/212 382/49/212 +f 388/3/213 389/2/213 396/11/213 +f 388/90/214 383/56/214 384/54/214 +f 380/12/215 382/48/215 381/40/215 +f 379/57/216 374/54/216 375/58/216 +f 378/22/217 389/59/217 386/60/217 +f 384/3/218 387/13/218 376/11/218 +f 359/37/219 395/61/219 387/62/219 +f 375/65/220 395/85/220 379/64/220 +f 386/86/220 396/68/220 376/66/220 +f 376/17/220 395/35/220 387/36/220 +f 374/42/221 378/40/221 359/12/221 +f 379/57/222 383/51/222 385/70/222 +f 389/59/223 384/56/223 386/60/223 +f 392/72/224 393/26/224 390/71/224 +f 413/25/225 376/73/225 387/74/225 +f 404/3/226 405/2/226 406/11/226 +f 399/77/227 400/89/227 398/76/227 +f 396/12/228 376/48/228 397/40/228 +f 392/88/229 391/72/229 394/71/229 +f 397/7/230 401/81/230 393/79/230 +f 399/3/231 402/13/231 413/11/231 +f 396/17/232 402/82/232 395/2/232 +f 402/68/233 394/83/233 391/84/233 +f 413/66/233 405/85/233 406/86/233 +f 402/82/234 406/73/234 413/87/234 +f 390/42/235 393/40/235 395/12/235 +f 394/77/236 398/78/236 400/88/236 +f 405/80/237 399/89/237 401/81/237 +f 410/18/238 411/70/238 407/10/238 +f 409/69/239 403/49/239 406/41/239 +f 420/3/240 421/2/240 429/11/240 +f 416/54/241 417/55/241 415/56/241 +f 402/12/242 403/48/242 414/40/242 +f 412/57/243 407/54/243 408/58/243 +f 411/22/244 421/59/244 418/60/244 +f 416/3/245 428/13/245 409/11/245 +f 402/38/246 428/62/246 413/37/246 +f 408/65/247 419/85/247 412/64/247 +f 418/86/247 429/68/247 409/66/247 +f 409/17/248 419/35/248 428/36/248 +f 407/42/249 411/40/249 413/12/249 +f 412/57/250 415/51/250 417/70/250 +f 421/59/251 416/56/251 418/60/251 +f 425/72/252 426/26/252 422/71/252 +f 424/25/253 409/73/253 428/74/253 +f 436/3/254 437/2/254 443/11/254 +f 432/77/255 433/89/255 431/76/255 +f 429/12/256 409/48/256 430/40/256 +f 427/71/257 422/78/257 423/72/257 +f 426/79/258 437/80/258 434/81/258 +f 444/13/259 424/11/259 432/3/259 +f 429/17/260 444/82/260 419/2/260 +f 423/84/261 435/67/261 427/83/261 +f 424/66/261 437/85/261 443/86/261 +f 424/87/262 435/74/262 443/73/262 +f 422/42/263 426/40/263 419/12/263 +f 433/88/264 423/75/264 431/78/264 +f 434/81/265 436/76/265 432/89/265 +f 440/18/266 441/70/266 438/10/266 +f 461/69/267 435/49/267 443/41/267 +f 450/3/268 451/2/268 459/11/268 +f 447/54/269 448/55/269 446/56/269 +f 444/12/270 435/48/270 445/40/270 +f 440/90/271 439/58/271 442/57/271 +f 445/8/272 449/60/272 441/22/272 +f 447/3/273 457/13/273 461/11/273 +f 444/38/274 457/62/274 424/37/274 +f 439/65/275 458/85/275 442/64/275 +f 461/66/275 451/67/275 459/68/275 +f 438/42/276 441/40/276 424/12/276 +f 442/57/277 446/51/277 448/70/277 +f 451/59/278 447/56/278 449/60/278 +f 454/72/279 455/26/279 452/71/279 +f 457/74/280 475/24/280 461/73/280 +f 475/11/281 467/13/281 464/53/281 +f 468/75/282 462/76/282 463/77/282 +f 459/12/283 461/48/283 460/40/283 +f 456/71/284 452/78/284 453/72/284 +f 455/79/285 469/80/285 465/81/285 +f 476/11/286 462/53/286 466/13/286 +f 458/2/287 467/87/287 466/82/287 +f 453/84/288 467/67/288 456/83/288 +f 476/66/288 469/85/288 475/86/288 +f 476/87/289 467/74/289 475/73/289 +f 452/42/290 455/40/290 458/12/290 +f 457/49/275 459/63/275 458/65/275 +f 464/88/291 453/75/291 462/78/291 +f 465/81/292 468/76/292 463/89/292 +f 477/51/293 470/10/293 472/18/293 +f 494/69/294 467/49/294 475/41/294 +f 492/11/295 491/13/295 480/53/295 +f 483/90/296 478/56/296 479/54/296 +f 477/40/297 472/42/297 467/48/297 +f 472/90/298 471/58/298 474/57/298 +f 477/8/299 481/60/299 473/22/299 +f 494/11/300 478/53/300 482/13/300 +f 466/38/301 482/62/301 476/37/301 +f 471/65/302 491/85/302 474/64/302 +f 481/86/302 492/68/302 494/66/302 +f 492/2/302 482/36/302 494/17/302 +f 475/48/303 476/12/303 470/42/303 +f 474/57/304 478/51/304 480/70/304 +f 484/59/305 479/56/305 481/60/305 +f 493/31/306 485/71/306 488/72/306 +f 482/74/307 507/24/307 494/73/307 +f 499/3/308 500/2/308 507/11/308 +f 496/77/309 497/89/309 495/76/309 +f 493/40/310 488/42/310 494/48/310 +f 490/71/311 485/78/311 486/72/311 +f 489/79/312 500/80/312 498/81/312 +f 495/53/313 486/15/313 508/13/313 +f 491/2/314 510/87/314 508/82/314 +f 486/84/315 510/67/315 490/83/315 +f 498/64/315 507/86/315 487/66/315 +f 487/87/316 510/74/316 507/73/316 +f 482/48/317 491/12/317 485/42/317 +f 490/77/318 495/78/318 497/88/318 +f 500/80/319 496/89/319 498/81/319 +f 509/51/320 501/10/320 504/18/320 +f 507/41/321 519/52/321 510/49/321 +f 519/11/322 516/13/322 513/53/322 +f 517/90/323 511/56/323 512/54/323 +f 509/40/324 504/42/324 510/48/324 +f 506/57/325 501/54/325 502/58/325 +f 505/22/326 518/59/326 514/60/326 +f 503/11/327 511/53/327 515/13/327 +f 487/37/328 516/61/328 515/62/328 +f 502/65/329 516/85/329 506/64/329 +f 503/66/329 518/67/329 519/68/329 +f 519/2/329 515/36/329 503/17/329 +f 507/48/330 487/12/330 501/42/330 +f 513/70/331 502/58/331 511/51/331 +f 514/60/332 517/55/332 512/56/332 +f 526/31/333 520/71/333 523/72/333 +f 522/25/334 503/73/334 515/74/334 +f 533/3/335 535/11/335 532/13/335 +f 533/75/336 527/76/336 528/77/336 +f 526/40/337 523/42/337 503/48/337 +f 523/88/338 521/72/338 525/71/338 +f 526/7/339 530/81/339 524/79/339 +f 528/3/340 531/13/340 522/11/340 +f 519/17/341 531/82/341 516/2/341 +f 521/84/342 532/67/342 525/83/342 +f 530/64/342 535/86/342 522/66/342 +f 522/87/343 532/74/343 535/73/343 +f 515/48/344 516/12/344 520/42/344 +f 525/77/345 527/78/345 529/88/345 +f 534/80/346 528/89/346 530/81/346 +f 541/51/347 536/10/347 538/18/347 +f 535/41/348 549/52/348 532/49/348 +f 547/3/349 548/2/349 549/11/349 +f 543/54/350 544/55/350 542/56/350 +f 531/12/351 532/48/351 541/40/351 +f 540/57/352 536/54/352 537/58/352 +f 539/22/353 548/59/353 545/60/353 +f 542/53/354 537/15/354 556/13/354 +f 522/37/355 546/61/355 556/62/355 +f 537/65/356 546/85/356 540/64/356 +f 545/86/356 549/68/356 558/66/356 +f 549/2/356 556/36/356 558/17/356 +f 536/42/357 539/40/357 522/12/357 +f 544/70/358 537/58/358 542/51/358 +f 545/60/359 547/55/359 543/56/359 +f 553/72/360 554/26/360 550/71/360 +f 552/25/361 558/73/361 556/74/361 +f 563/3/362 565/11/362 573/13/362 +f 563/75/363 559/76/363 560/77/363 +f 549/12/364 558/48/364 557/40/364 +f 553/88/365 551/72/365 555/71/365 +f 557/7/366 562/81/366 554/79/366 +f 559/53/367 551/15/367 571/13/367 +f 549/17/368 571/82/368 546/2/368 +f 571/68/369 555/83/369 551/84/369 +f 562/64/369 565/86/369 552/66/369 +f 552/87/370 573/74/370 565/73/370 +f 550/42/371 554/40/371 546/12/371 +f 561/88/372 551/75/372 559/78/372 +f 562/81/373 563/76/373 560/89/373 +f 568/18/374 569/70/374 566/10/374 +f 565/41/375 582/52/375 573/49/375 +f 580/3/376 581/2/376 582/11/376 +f 580/90/377 574/56/377 575/54/377 +f 571/12/378 573/48/378 572/40/378 +f 570/57/379 566/54/379 567/58/379 +f 569/22/380 581/59/380 577/60/380 +f 574/53/381 567/15/381 578/13/381 +f 552/37/382 579/61/382 578/62/382 +f 578/63/383 570/64/383 567/65/383 +f 577/86/383 582/68/383 590/66/383 +f 582/2/383 578/36/383 590/17/383 +f 566/42/384 569/40/384 552/12/384 +f 576/70/385 567/58/385 574/51/385 +f 577/60/386 580/55/386 575/56/386 +f 589/31/387 583/71/387 586/72/387 +f 585/25/388 590/73/388 578/74/388 +f 595/3/389 602/11/389 605/13/389 +f 592/77/390 593/89/390 591/76/390 +f 582/12/391 590/48/391 589/40/391 +f 586/88/392 584/72/392 588/71/392 +f 589/7/393 594/81/393 587/79/393 +f 591/53/394 584/15/394 603/13/394 +f 582/17/395 603/82/395 579/2/395 +f 603/68/396 588/83/396 584/84/396 +f 594/64/396 602/86/396 585/66/396 +f 585/87/397 605/74/397 602/73/397 +f 583/42/398 587/40/398 579/12/398 +f 588/77/399 591/78/399 593/88/399 +f 596/80/400 592/89/400 594/81/400 +f 599/18/401 600/70/401 597/10/401 +f 602/41/402 614/52/402 605/49/402 +f 612/3/403 614/11/403 611/13/403 +f 607/54/404 608/55/404 606/56/404 +f 603/12/405 605/48/405 604/40/405 +f 601/57/406 597/54/406 598/58/406 +f 600/22/407 613/59/407 609/60/407 +f 610/13/408 622/11/408 607/3/408 +f 585/37/409 611/61/409 610/62/409 +f 598/65/410 611/85/410 601/64/410 +f 609/86/410 614/68/410 622/66/410 +f 614/2/410 610/36/410 622/17/410 +f 597/42/411 600/40/411 585/12/411 +f 601/57/412 606/51/412 608/70/412 +f 613/59/413 607/56/413 609/60/413 +f 621/31/414 615/71/414 618/72/414 +f 610/74/415 631/24/415 622/73/415 +f 631/11/416 628/13/416 625/53/416 +f 624/77/417 625/89/417 623/76/417 +f 614/12/418 622/48/418 621/40/418 +f 620/71/419 615/78/419 616/72/419 +f 619/79/420 630/80/420 626/81/420 +f 617/11/421 623/53/421 627/13/421 +f 611/2/422 628/87/422 627/82/422 +f 627/68/423 620/83/423 616/84/423 +f 617/66/423 630/85/423 631/86/423 +f 617/87/424 628/74/424 631/73/424 +f 615/42/425 619/40/425 611/12/425 +f 620/77/426 623/78/426 625/88/426 +f 630/80/427 624/89/427 626/81/427 +f 638/51/428 632/10/428 635/18/428 +f 631/41/429 653/52/429 628/49/429 +f 643/3/430 644/2/430 653/11/430 +f 640/54/431 641/55/431 639/56/431 +f 638/40/432 635/42/432 628/48/432 +f 637/57/433 632/54/433 633/58/433 +f 636/22/434 644/59/434 642/60/434 +f 640/3/435 651/13/435 634/11/435 +f 617/37/436 652/61/436 651/62/436 +f 651/63/437 637/64/437 633/65/437 +f 634/66/437 644/67/437 653/68/437 +f 653/2/437 651/36/437 634/17/437 +f 631/48/438 617/12/438 632/42/438 +f 637/57/439 639/51/439 641/70/439 +f 644/59/440 640/56/440 642/60/440 +f 648/72/441 649/26/441 645/71/441 +f 651/74/442 668/24/442 634/73/442 +f 668/11/443 670/13/443 657/53/443 +f 656/77/444 657/89/444 655/76/444 +f 653/12/445 634/48/445 654/40/445 +f 650/71/446 645/78/446 646/72/446 +f 649/79/447 661/80/447 658/81/447 +f 647/11/448 655/53/448 659/13/448 +f 652/2/449 670/87/449 659/82/449 +f 659/68/450 650/83/450 646/84/450 +f 658/64/450 668/86/450 647/66/450 +f 647/87/451 670/74/451 668/73/451 +f 645/42/452 649/40/452 652/12/452 +f 657/88/453 646/75/453 655/78/453 +f 658/81/454 660/76/454 656/89/454 +f 669/51/455 662/10/455 665/18/455 +f 664/69/456 670/49/456 668/41/456 +f 677/11/457 685/13/457 673/53/457 +f 672/54/458 673/55/458 671/56/458 +f 669/40/459 665/42/459 670/48/459 +f 665/90/460 663/58/460 667/57/460 +f 669/8/461 674/60/461 666/22/461 +f 664/11/462 671/53/462 684/13/462 +f 659/38/463 684/62/463 647/37/463 +f 663/65/464 685/85/464 667/64/464 +f 674/86/464 677/68/464 664/66/464 +f 677/2/464 684/36/464 664/17/464 +f 668/48/465 647/12/465 662/42/465 +f 667/57/466 671/51/466 673/70/466 +f 676/59/467 672/56/467 674/60/467 +f 681/72/468 682/26/468 678/71/468 +f 684/74/469 693/24/469 664/73/469 +f 691/3/470 692/2/470 693/11/470 +f 691/75/471 687/76/471 688/77/471 +f 686/40/472 681/42/472 664/48/472 +f 683/71/473 678/78/473 679/72/473 +f 682/79/474 692/80/474 690/81/474 +f 680/11/475 687/53/475 699/13/475 +f 685/2/476 701/87/476 699/82/476 +f 699/68/477 683/83/477 679/84/477 +f 680/66/477 692/85/477 693/86/477 +f 699/82/478 693/73/478 680/87/478 +f 684/48/479 685/12/479 678/42/479 +f 683/77/480 687/78/480 689/88/480 +f 692/80/481 688/89/481 690/81/481 +f 700/51/482 694/10/482 696/18/482 +f 693/41/483 709/52/483 701/49/483 +f 707/3/484 708/2/484 709/11/484 +f 703/54/485 704/55/485 702/56/485 +f 700/40/486 696/42/486 701/48/486 +f 698/57/487 694/54/487 695/58/487 +f 697/22/488 708/59/488 705/60/488 +f 703/3/489 716/13/489 718/11/489 +f 680/37/490 706/61/490 716/62/490 +f 695/65/491 706/85/491 698/64/491 +f 718/66/491 708/67/491 709/68/491 +f 709/2/491 716/36/491 718/17/491 +f 693/48/492 680/12/492 694/42/492 +f 704/70/493 695/58/493 702/51/493 +f 705/60/494 707/55/494 703/56/494 +f 717/31/495 710/71/495 713/72/495 +f 712/25/496 718/73/496 716/74/496 +f 725/3/497 733/11/497 724/13/497 +f 720/77/498 721/89/498 719/76/498 +f 717/40/499 713/42/499 718/48/499 +f 713/88/500 711/72/500 715/71/500 +f 717/7/501 722/81/501 714/79/501 +f 719/53/502 711/15/502 723/13/502 +f 709/17/503 723/82/503 706/2/503 +f 723/68/504 715/83/504 711/84/504 +f 722/64/504 733/86/504 712/66/504 +f 712/87/505 724/74/505 733/73/505 +f 716/48/506 706/12/506 710/42/506 +f 715/77/507 719/78/507 721/88/507 +f 726/80/508 720/89/508 722/81/508 +f 734/51/509 727/10/509 730/18/509 +f 729/69/510 724/49/510 733/41/510 +f 748/11/511 740/13/511 737/53/511 +f 741/90/512 735/56/512 736/54/512 +f 723/12/513 724/48/513 734/40/513 +f 730/90/514 728/58/514 732/57/514 +f 734/8/515 738/60/515 731/22/515 +f 729/11/516 735/53/516 739/13/516 +f 723/38/517 739/62/517 712/37/517 +f 728/65/518 740/85/518 732/64/518 +f 738/86/518 748/68/518 729/66/518 +f 729/17/519 740/35/519 739/36/519 +f 727/42/520 731/40/520 712/12/520 +f 737/70/521 728/58/521 735/51/521 +f 738/60/522 741/55/522 736/56/522 +f 749/31/523 743/71/523 745/72/523 +f 765/25/524 729/73/524 739/74/524 +f 756/3/525 764/11/525 755/13/525 +f 751/77/526 752/89/526 750/76/526 +f 748/12/527 729/48/527 749/40/527 +f 745/88/528 744/72/528 747/71/528 +f 749/7/529 753/81/529 746/79/529 +f 750/53/530 744/15/530 754/13/530 +f 748/17/531 754/82/531 740/2/531 +f 744/84/532 755/67/532 747/83/532 +f 765/66/532 757/85/532 764/86/532 +f 765/87/533 755/74/533 764/73/533 +f 743/42/534 746/40/534 740/12/534 +f 747/77/535 750/78/535 752/88/535 +f 757/80/536 751/89/536 753/81/536 +f 766/51/537 758/10/537 761/18/537 +f 764/41/538 780/52/538 755/49/538 +f 780/11/539 779/13/539 772/3/539 +f 772/90/540 767/56/540 768/54/540 +f 754/12/541 755/48/541 766/40/541 +f 763/57/542 758/54/542 759/58/542 +f 762/22/543 773/59/543 770/60/543 +f 771/13/544 760/11/544 768/3/544 +f 765/37/545 779/61/545 771/62/545 +f 759/65/546 779/85/546 763/64/546 +f 770/86/546 780/68/546 760/66/546 +f 760/17/546 779/35/546 771/36/546 +f 758/42/547 762/40/547 765/12/547 +f 769/70/548 759/58/548 767/51/548 +f 770/60/549 772/55/549 768/56/549 +f 776/72/550 777/26/550 774/71/550 +f 771/74/551 789/24/551 760/73/551 +f 787/3/552 788/2/552 789/11/552 +f 783/77/553 784/89/553 782/76/553 +f 780/12/554 760/48/554 781/40/554 +f 778/71/555 774/78/555 775/72/555 +f 777/79/556 788/80/556 785/81/556 +f 782/53/557 775/15/557 796/13/557 +f 779/2/558 786/87/558 796/82/558 +f 775/84/559 786/67/559 778/83/559 +f 795/66/559 788/85/559 789/86/559 +f 795/87/560 786/74/560 789/73/560 +f 774/42/561 777/40/561 779/12/561 +f 784/88/562 775/75/562 782/78/562 +f 785/81/563 787/76/563 783/89/563 +f 797/51/564 790/10/564 792/18/564 +f 789/41/565 805/52/565 786/49/565 +f 803/3/566 804/2/566 805/11/566 +f 799/54/567 800/55/567 798/56/567 +f 796/12/568 786/48/568 797/40/568 +f 794/57/569 790/54/569 791/58/569 +f 797/8/570 801/60/570 793/22/570 +f 799/3/571 812/13/571 814/11/571 +f 795/37/572 802/61/572 812/62/572 +f 812/63/573 794/64/573 791/65/573 +f 801/86/573 805/68/573 814/66/573 +f 805/2/573 812/36/573 814/17/573 +f 790/42/574 793/40/574 795/12/574 +f 800/70/575 791/58/575 798/51/575 +f 801/60/576 803/55/576 799/56/576 +f 813/31/577 806/71/577 809/72/577 +f 808/25/578 814/73/578 812/74/578 +f 820/3/579 821/2/579 822/11/579 +f 820/75/580 815/76/580 816/77/580 +f 813/40/581 809/42/581 814/48/581 +f 809/88/582 807/72/582 811/71/582 +f 813/7/583 818/81/583 810/79/583 +f 816/3/584 819/13/584 808/11/584 +f 805/17/585 819/82/585 802/2/585 +f 819/68/586 811/83/586 807/84/586 +f 808/66/586 821/85/586 822/86/586 +f 819/82/587 822/73/587 808/87/587 +f 812/48/588 802/12/588 806/42/588 +f 811/77/589 815/78/589 817/88/589 +f 821/80/590 816/89/590 818/81/590 +f 826/18/591 827/70/591 823/10/591 +f 822/41/592 838/52/592 830/49/592 +f 836/3/593 838/11/593 835/13/593 +f 836/90/594 831/56/594 832/54/594 +f 819/12/595 830/48/595 829/40/595 +f 828/57/596 823/54/596 824/58/596 +f 827/22/597 837/59/597 834/60/597 +f 831/53/598 824/15/598 845/13/598 +f 808/37/599 835/61/599 845/62/599 +f 845/63/600 828/64/600 824/65/600 +f 834/86/600 838/68/600 825/66/600 +f 838/2/600 845/36/600 825/17/600 +f 823/42/601 827/40/601 808/12/601 +f 828/57/602 831/51/602 833/70/602 +f 837/59/603 832/56/603 834/60/603 +f 846/31/604 839/71/604 842/72/604 +f 845/74/605 855/24/605 825/73/605 +f 855/11/606 852/13/606 849/53/606 +f 853/75/607 847/76/607 848/77/607 +f 838/12/608 825/48/608 846/40/608 +f 844/71/609 839/78/609 840/72/609 +f 843/79/610 854/80/610 850/81/610 +f 847/53/611 840/15/611 851/13/611 +f 835/2/612 852/87/612 851/82/612 +f 840/84/607 852/67/607 844/83/607 +f 841/66/607 854/85/607 855/86/607 +f 851/82/613 855/73/613 841/87/613 +f 839/42/614 843/40/614 835/12/614 +f 844/77/615 847/78/615 849/88/615 +f 854/80/616 848/89/616 850/81/616 +f 856/10/617 865/51/617 859/18/617 +f 862/41/618 880/52/618 858/69/618 +f 880/11/619 873/2/619 872/3/619 +f 868/54/620 869/55/620 872/90/620 +f 865/40/619 864/12/619 859/42/619 +f 861/57/618 856/54/618 859/90/618 +f 860/22/621 873/59/621 865/8/621 +f 868/3/622 870/2/622 858/11/622 +f 863/37/621 871/61/621 864/38/621 +f 861/64/623 879/63/623 857/65/623 +f 880/68/623 870/86/623 858/66/623 +f 858/17/623 871/35/623 880/2/623 +f 863/12/622 862/48/622 860/40/622 +f 863/69/623 866/62/623 862/61/623 +f 869/70/624 857/58/624 861/57/624 +f 870/60/625 872/55/625 873/59/625 +f 876/72/617 877/26/617 881/31/617 +f 858/73/626 895/25/626 879/74/626 +f 889/11/627 888/2/627 887/3/627 +f 883/77/628 884/89/628 887/75/628 +f 881/40/621 880/12/621 876/42/621 +f 878/71/629 874/78/629 876/88/629 +f 877/79/630 888/80/630 881/7/630 +f 883/3/631 885/2/631 895/11/631 +f 886/82/632 880/17/632 871/2/632 +f 878/83/633 886/68/633 875/84/633 +f 895/66/633 888/85/633 885/64/633 +f 889/73/634 886/82/634 895/87/634 +f 871/12/618 879/48/618 877/40/618 +f 882/78/635 878/77/635 884/88/635 +f 883/89/636 888/80/636 885/81/636 +f 890/10/637 896/51/637 892/18/637 +f 889/41/638 912/52/638 914/69/638 +f 912/11/639 904/2/639 903/3/639 +f 898/56/640 903/90/640 899/54/640 +f 897/48/641 886/12/641 892/42/641 +f 894/57/642 890/54/642 892/90/642 +f 893/22/643 904/59/643 896/8/643 +f 899/3/644 901/2/644 914/11/644 +f 895/37/645 911/61/645 886/38/645 +f 891/65/646 911/85/646 902/63/646 +f 914/66/646 904/67/646 901/86/646 +f 902/36/646 912/2/646 914/17/646 +f 889/48/647 893/40/647 890/42/647 +f 898/51/648 894/57/648 900/70/648 +f 899/56/649 904/59/649 901/60/649 +f 908/72/650 909/26/650 913/31/650 +f 902/74/651 922/24/651 907/25/651 +f 922/11/652 921/2/652 920/3/652 +f 915/76/653 920/75/653 916/77/653 +f 913/40/654 912/12/654 908/42/654 +f 910/71/655 905/78/655 908/88/655 +f 909/79/656 921/80/656 913/7/656 +f 916/3/657 918/2/657 907/11/657 +f 911/2/658 929/87/658 912/17/658 +f 910/83/659 919/68/659 906/84/659 +f 907/66/659 921/85/659 918/64/659 +f 922/73/660 919/82/660 907/87/660 +f 911/12/661 902/48/661 909/40/661 +f 915/78/662 910/77/662 917/88/662 +f 916/89/663 921/80/663 918/81/663 +f 923/10/664 928/51/664 925/18/664 +f 922/41/665 943/52/665 945/69/665 +f 943/11/666 936/2/666 935/3/666 +f 931/54/667 932/55/667 935/90/667 +f 929/48/668 919/12/668 925/42/668 +f 927/57/669 923/54/669 925/90/669 +f 926/22/670 936/59/670 928/8/670 +f 930/53/671 931/3/671 942/13/671 +f 907/37/672 934/61/672 919/38/672 +f 927/64/673 942/63/673 924/65/673 +f 943/68/673 933/86/673 945/66/673 +f 945/17/673 934/35/673 943/2/673 +f 922/48/674 926/40/674 923/42/674 +f 932/70/675 924/58/675 927/57/675 +f 933/60/676 935/55/676 936/59/676 +f 937/71/677 944/31/677 939/72/677 +f 945/73/678 959/25/678 942/74/678 +f 953/11/679 952/2/679 951/3/679 +f 947/77/680 948/89/680 951/75/680 +f 944/40/681 943/12/681 939/42/681 +f 938/72/682 939/88/682 941/71/682 +f 949/81/683 944/7/683 940/79/683 +f 947/3/684 949/2/684 959/11/684 +f 950/82/685 943/17/685 934/2/685 +f 938/84/686 961/67/686 950/68/686 +f 953/86/686 949/64/686 959/66/686 +f 959/87/687 961/74/687 950/82/687 +f 934/12/688 942/48/688 940/40/688 +f 948/88/689 938/75/689 941/77/689 +f 949/81/690 951/76/690 952/80/690 +f 956/18/691 957/70/691 960/51/691 +f 961/49/692 977/69/692 953/41/692 +f 968/11/693 967/2/693 966/3/693 +f 962/56/694 966/90/694 963/54/694 +f 960/40/695 950/12/695 956/42/695 +f 958/57/696 954/54/696 956/90/696 +f 965/60/697 960/8/697 957/22/697 +f 962/53/698 963/3/698 974/13/698 +f 959/37/699 975/61/699 950/38/699 +f 955/65/700 975/85/700 974/63/700 +f 968/68/700 965/86/700 977/66/700 +f 977/17/700 975/35/700 968/2/700 +f 959/12/701 953/48/701 957/40/701 +f 962/51/702 958/57/702 964/70/702 +f 963/56/703 967/59/703 965/60/703 +f 971/72/704 972/26/704 976/31/704 +f 974/74/705 991/24/705 992/25/705 +f 991/11/706 985/2/706 984/3/706 +f 978/76/707 984/75/707 979/77/707 +f 976/40/708 968/12/708 971/42/708 +f 973/71/709 969/78/709 971/88/709 +f 972/79/710 985/80/710 976/7/710 +f 979/3/711 981/2/711 992/11/711 +f 975/2/712 983/87/712 968/17/712 +f 970/84/713 983/67/713 982/68/713 +f 991/86/713 981/64/713 992/66/713 +f 991/73/714 982/82/714 992/87/714 +f 975/12/715 974/48/715 972/40/715 +f 980/88/716 970/75/716 973/77/716 +f 981/81/717 984/76/717 985/80/717 +f 988/18/718 989/70/718 993/51/718 +f 983/49/719 1010/69/719 991/41/719 +f 1001/11/720 1000/2/720 999/3/720 +f 994/56/721 999/90/721 995/54/721 +f 993/40/722 982/12/722 988/42/722 +f 987/58/723 988/90/723 990/57/723 +f 997/60/724 993/8/724 989/22/724 +f 995/3/725 997/2/725 1010/11/725 +f 1008/62/726 982/38/726 992/37/726 +f 990/64/727 1008/63/727 987/65/727 +f 1010/66/727 1000/67/727 997/86/727 +f 1010/17/727 998/35/727 1001/2/727 +f 992/12/728 991/48/728 989/40/728 +f 996/70/729 987/58/729 990/57/729 +f 997/60/730 999/55/730 1000/59/730 +f 1005/72/731 1006/26/731 1009/31/731 +f 1010/73/732 1004/25/732 1008/74/732 +f 1024/11/733 1018/2/733 1017/3/733 +f 1011/76/734 1017/75/734 1012/77/734 +f 1010/48/735 1001/12/735 1005/42/735 +f 1003/72/736 1005/88/736 1007/71/736 +f 1014/81/737 1009/7/737 1006/79/737 +f 1012/3/738 1014/2/738 1004/11/738 +f 1015/82/739 1001/17/739 998/2/739 +f 1003/84/740 1016/67/740 1015/68/740 +f 1004/66/740 1018/85/740 1014/64/740 +f 1024/73/741 1015/82/741 1004/87/741 +f 1008/48/742 1006/40/742 1002/42/742 +f 1013/88/743 1003/75/743 1007/77/743 +f 1014/81/744 1017/76/744 1018/80/744 +f 1019/10/745 1025/51/745 1021/18/745 +f 1016/49/746 1041/69/746 1024/41/746 +f 1033/11/747 1032/2/747 1031/3/747 +f 1026/56/748 1031/90/748 1027/54/748 +f 1025/40/749 1015/12/749 1021/42/749 +f 1020/58/750 1021/90/750 1023/57/750 +f 1029/60/751 1025/8/751 1022/22/751 +f 1039/13/752 1020/15/752 1026/53/752 +f 1039/62/753 1015/38/753 1004/37/753 +f 1020/65/754 1030/85/754 1039/63/754 +f 1033/68/754 1029/86/754 1041/66/754 +f 1041/17/754 1030/35/754 1033/2/754 +f 1004/12/755 1024/48/755 1022/40/755 +f 1026/51/756 1023/57/756 1028/70/756 +f 1027/56/757 1032/59/757 1029/60/757 +f 1034/71/758 1040/31/758 1036/72/758 +f 1041/73/759 1055/25/759 1039/74/759 +f 1057/13/760 1054/11/760 1047/3/760 +f 1042/76/761 1047/75/761 1043/77/761 +f 1041/48/762 1033/12/762 1036/42/762 +f 1038/71/747 1034/78/747 1036/88/747 +f 1037/79/752 1048/80/752 1040/7/752 +f 1043/3/763 1045/2/763 1055/11/763 +f 1046/82/764 1033/17/764 1030/2/764 +f 1035/84/765 1057/67/765 1046/68/765 +f 1055/66/765 1048/85/765 1045/64/765 +f 1054/73/766 1046/82/766 1055/87/766 +f 1039/48/767 1037/40/767 1034/42/767 +f 1042/78/768 1038/77/768 1044/88/768 +f 1043/89/769 1048/80/769 1045/81/769 +f 1051/18/770 1052/70/770 1056/51/770 +f 1057/49/771 1073/69/771 1054/41/771 +f 1071/11/772 1064/2/772 1063/3/772 +f 1058/56/773 1063/90/773 1059/54/773 +f 1057/48/747 1046/12/747 1051/42/747 +f 1050/58/774 1051/90/774 1053/57/774 +f 1061/60/775 1056/8/775 1052/22/775 +f 1070/13/776 1050/15/776 1058/53/776 +f 1070/62/777 1046/38/777 1055/37/777 +f 1050/65/778 1062/85/778 1070/63/778 +f 1071/68/778 1061/86/778 1073/66/778 +f 1073/17/778 1062/35/778 1071/2/778 +f 1054/48/752 1052/40/752 1049/42/752 +f 1058/51/779 1053/57/779 1060/70/779 +f 1059/56/780 1064/59/780 1061/60/780 +f 1067/72/781 1068/26/781 1072/31/781 +f 1070/74/782 1087/24/782 1088/25/782 +f 1087/11/783 1081/2/783 1080/3/783 +f 1075/77/784 1076/89/784 1080/75/784 +f 1073/48/785 1071/12/785 1067/42/785 +f 1069/71/786 1065/78/786 1067/88/786 +f 1068/79/787 1081/80/787 1072/7/787 +f 1075/3/788 1077/2/788 1088/11/788 +f 1062/2/789 1079/87/789 1071/17/789 +f 1066/84/790 1079/67/790 1078/68/790 +f 1087/86/790 1077/64/790 1088/66/790 +f 1087/73/791 1078/82/791 1088/87/791 +f 1070/48/792 1068/40/792 1065/42/792 +f 1076/88/793 1066/75/793 1069/77/793 +f 1077/81/794 1080/76/794 1081/80/794 +f 1084/18/795 1085/70/795 1089/51/795 +f 1079/49/796 1105/69/796 1087/41/796 +f 1098/11/797 1097/2/797 1096/3/797 +f 1091/54/798 1092/55/798 1096/90/798 +f 1079/48/799 1078/12/799 1084/42/799 +f 1083/58/800 1084/90/800 1086/57/800 +f 1093/60/801 1089/8/801 1085/22/801 +f 1091/3/802 1093/2/802 1105/11/802 +f 1094/62/803 1078/38/803 1088/37/803 +f 1086/64/804 1094/63/804 1083/65/804 +f 1098/68/804 1093/86/804 1105/66/804 +f 1094/36/804 1098/2/804 1105/17/804 +f 1087/48/805 1085/40/805 1082/42/805 +f 1092/70/806 1083/58/806 1086/57/806 +f 1093/60/807 1096/55/807 1097/59/807 +f 1101/72/808 1102/26/808 1104/31/808 +f 1105/73/809 1121/25/809 1094/74/809 +f 1120/11/810 1113/2/810 1112/3/810 +f 1106/76/811 1112/75/811 1107/77/811 +f 1105/48/812 1098/12/812 1101/42/812 +f 1100/72/813 1101/88/813 1103/71/813 +f 1109/81/814 1104/7/814 1102/79/814 +f 1107/3/815 1109/2/815 1121/11/815 +f 1110/82/816 1098/17/816 1095/2/816 +f 1100/84/817 1111/67/817 1110/68/817 +f 1120/86/817 1109/64/817 1121/66/817 +f 1121/87/818 1111/74/818 1110/82/818 +f 1094/48/819 1102/40/819 1099/42/819 +f 1106/78/820 1103/77/820 1108/88/820 +f 1107/89/821 1113/80/821 1109/81/821 +f 1114/10/822 1122/51/822 1117/18/822 +f 1120/41/823 1130/52/823 1116/69/823 +f 1130/11/824 1129/2/824 1128/3/824 +f 1124/54/825 1125/55/825 1128/90/825 +f 1122/40/826 1110/12/826 1117/42/826 +f 1119/57/827 1114/54/827 1117/90/827 +f 1118/22/828 1129/59/828 1122/8/828 +f 1124/3/829 1126/2/829 1116/11/829 +f 1121/37/830 1136/61/830 1110/38/830 +f 1119/64/831 1127/63/831 1115/65/831 +f 1130/68/831 1126/86/831 1116/66/831 +f 1127/36/831 1130/2/831 1116/17/831 +f 1121/12/832 1120/48/832 1118/40/832 +f 1123/51/833 1119/57/833 1125/70/833 +f 1124/56/834 1129/59/834 1126/60/834 +f 1131/71/835 1137/31/835 1133/72/835 +f 1116/73/836 1150/25/836 1127/74/836 +f 1149/11/837 1143/2/837 1142/3/837 +f 1138/76/838 1142/75/838 1139/77/838 +f 1137/40/839 1130/12/839 1133/42/839 +f 1132/72/840 1133/88/840 1135/71/840 +f 1141/81/841 1137/7/841 1134/79/841 +f 1139/3/842 1141/2/842 1150/11/842 +f 1151/82/843 1130/17/843 1136/2/843 +f 1135/83/844 1151/68/844 1132/84/844 +f 1149/86/844 1141/64/844 1150/66/844 +f 1136/12/845 1127/48/845 1134/40/845 +f 1138/78/846 1135/77/846 1140/88/846 +f 1139/89/847 1143/80/847 1141/81/847 +f 1144/10/848 1152/51/848 1146/18/848 +f 1153/49/849 1170/69/849 1149/41/849 +f 1168/11/850 1161/2/850 1160/3/850 +f 1154/56/851 1160/90/851 1155/54/851 +f 1152/40/852 1151/12/852 1146/42/852 +f 1148/57/853 1144/54/853 1146/90/853 +f 1147/22/854 1161/59/854 1152/8/854 +f 1170/11/855 1158/13/855 1155/3/855 +f 1158/62/856 1151/38/856 1150/37/856 +f 1145/65/857 1159/85/857 1158/63/857 +f 1170/66/857 1161/67/857 1157/86/857 +f 1170/17/857 1159/35/857 1168/2/857 +f 1150/12/858 1149/48/858 1147/40/858 +f 1149/61/844 1151/52/844 1153/62/844 +f 1154/51/859 1148/57/859 1156/70/859 +f 1155/56/860 1161/59/860 1157/60/860 +f 1162/71/861 1169/31/861 1165/72/861 +f 1170/73/862 1164/25/862 1158/74/862 +f 1183/11/863 1177/2/863 1176/3/863 +f 1172/77/864 1173/89/864 1176/75/864 +f 1169/40/865 1168/12/865 1165/42/865 +f 1167/71/866 1162/78/866 1165/88/866 +f 1166/79/867 1177/80/867 1169/7/867 +f 1164/11/868 1184/13/868 1172/3/868 +f 1184/82/869 1168/17/869 1159/2/869 +f 1167/83/870 1184/68/870 1163/84/870 +f 1183/86/870 1174/64/870 1164/66/870 +f 1164/87/871 1175/74/871 1184/82/871 +f 1159/12/872 1158/48/872 1166/40/872 +f 1173/88/873 1163/75/873 1167/77/873 +f 1174/81/874 1176/76/874 1177/80/874 +f 1180/18/875 1181/70/875 1185/51/875 +f 1175/49/876 1202/69/876 1183/41/876 +f 1200/11/877 1193/2/877 1192/3/877 +f 1187/54/878 1188/55/878 1192/90/878 +f 1185/40/879 1184/12/879 1180/42/879 +f 1179/58/880 1180/90/880 1182/57/880 +f 1189/60/881 1185/8/881 1181/22/881 +f 1187/3/882 1189/2/882 1202/11/882 +f 1190/62/883 1184/38/883 1164/37/883 +f 1182/64/884 1190/63/884 1179/65/884 +f 1200/68/884 1189/86/884 1202/66/884 +f 1202/17/884 1191/35/884 1200/2/884 +f 1164/12/885 1183/48/885 1181/40/885 +f 1186/51/886 1182/57/886 1188/70/886 +f 1187/56/887 1193/59/887 1189/60/887 +f 1194/71/888 1201/31/888 1197/72/888 +f 1190/74/889 1215/24/889 1196/25/889 +f 1215/11/890 1209/2/890 1208/3/890 +f 1203/76/891 1208/75/891 1204/77/891 +f 1201/40/892 1200/12/892 1197/42/892 +f 1199/71/893 1194/78/893 1197/88/893 +f 1198/79/894 1209/80/894 1201/7/894 +f 1204/3/895 1206/2/895 1196/11/895 +f 1191/2/896 1217/87/896 1200/17/896 +f 1199/83/897 1207/68/897 1195/84/897 +f 1196/66/897 1209/85/897 1206/64/897 +f 1196/87/898 1217/74/898 1207/82/898 +f 1191/12/899 1190/48/899 1198/40/899 +f 1205/88/900 1195/75/900 1199/77/900 +f 1206/81/901 1208/76/901 1209/80/901 +f 1210/10/902 1216/51/902 1212/18/902 +f 1217/49/903 1233/69/903 1215/41/903 +f 1225/11/904 1224/2/904 1223/3/904 +f 1219/54/905 1220/55/905 1223/90/905 +f 1217/48/906 1207/12/906 1212/42/906 +f 1211/58/907 1212/90/907 1214/57/907 +f 1221/60/908 1216/8/908 1213/22/908 +f 1222/13/909 1211/15/909 1218/53/909 +f 1222/62/910 1207/38/910 1196/37/910 +f 1214/64/911 1222/63/911 1211/65/911 +f 1225/68/912 1221/86/912 1233/66/912 +f 1233/17/911 1231/35/911 1225/2/911 +f 1215/48/913 1213/40/913 1210/42/913 +f 1218/51/914 1214/57/914 1220/70/914 +f 1219/56/915 1224/59/915 1221/60/915 +f 1226/71/916 1232/31/916 1228/72/916 +f 1222/74/917 1247/24/917 1248/25/917 +f 1247/11/918 1241/2/918 1240/3/918 +f 1235/77/919 1236/89/919 1240/75/919 +f 1233/48/920 1225/12/920 1228/42/920 +f 1230/71/921 1226/78/921 1228/88/921 +f 1229/79/922 1241/80/922 1232/7/922 +f 1248/11/923 1238/13/923 1234/53/923 +f 1231/2/924 1239/87/924 1225/17/924 +f 1230/83/925 1238/68/925 1227/84/925 +f 1248/66/925 1241/85/925 1237/64/925 +f 1247/73/926 1238/82/926 1248/87/926 +f 1222/48/927 1229/40/927 1226/42/927 +f 1234/78/928 1230/77/928 1236/88/928 +f 1235/89/929 1241/80/929 1237/81/929 +f 1244/18/930 1245/70/930 1249/51/930 +f 1247/41/931 1263/52/931 1265/69/931 +f 1263/11/932 1256/2/932 1255/3/932 +f 1250/56/933 1255/90/933 1251/54/933 +f 1239/48/934 1238/12/934 1244/42/934 +f 1246/57/935 1242/54/935 1244/90/935 +f 1245/22/936 1256/59/936 1249/8/936 +f 1251/3/937 1253/2/937 1265/11/937 +f 1248/37/938 1254/61/938 1238/38/938 +f 1246/64/939 1262/63/939 1243/65/939 +f 1263/68/939 1253/86/939 1265/66/939 +f 1262/36/939 1263/2/939 1265/17/939 +f 1247/48/940 1245/40/940 1242/42/940 +f 1252/70/941 1243/58/941 1246/57/941 +f 1253/60/942 1255/55/942 1256/59/942 +f 1257/71/943 1264/31/943 1259/72/943 +f 1265/73/944 1280/25/944 1262/74/944 +f 1273/11/945 1272/2/945 1271/3/945 +f 1267/77/946 1268/89/946 1271/75/946 +f 1265/48/947 1263/12/947 1259/42/947 +f 1258/72/948 1259/88/948 1261/71/948 +f 1269/81/949 1264/7/949 1260/79/949 +f 1280/11/950 1270/13/950 1267/3/950 +f 1270/82/951 1263/17/951 1254/2/951 +f 1261/83/952 1270/68/952 1258/84/952 +f 1280/66/952 1272/85/952 1269/64/952 +f 1280/87/953 1282/74/953 1270/82/953 +f 1262/48/954 1260/40/954 1257/42/954 +f 1266/78/955 1261/77/955 1268/88/955 +f 1267/89/956 1272/80/956 1269/81/956 +f 1277/18/957 1278/70/957 1281/51/957 +f 1273/41/958 1289/52/958 1276/69/958 +f 1289/11/959 1288/2/959 1287/3/959 +f 1284/54/960 1285/55/960 1287/90/960 +f 1281/40/961 1270/12/961 1277/42/961 +f 1279/57/962 1274/54/962 1277/90/962 +f 1278/22/963 1288/59/963 1281/8/963 +f 1284/3/964 1286/2/964 1276/11/964 +f 1280/37/965 1296/61/965 1270/38/965 +f 1275/65/966 1296/85/966 1295/63/966 +f 1289/68/966 1286/86/966 1276/66/966 +f 1295/36/966 1289/2/966 1276/17/966 +f 1280/12/967 1273/48/967 1278/40/967 +f 1285/70/968 1275/58/968 1279/57/968 +f 1286/60/969 1287/55/969 1288/59/969 +f 1292/72/970 1293/26/970 1297/31/970 +f 1276/73/971 1312/25/971 1295/74/971 +f 1311/11/972 1305/2/972 1304/3/972 +f 1298/76/973 1304/75/973 1299/77/973 +f 1297/40/974 1289/12/974 1292/42/974 +f 1291/72/975 1292/88/975 1294/71/975 +f 1301/81/976 1297/7/976 1293/79/976 +f 1299/3/977 1301/2/977 1312/11/977 +f 1302/82/978 1289/17/978 1296/2/978 +f 1291/84/979 1303/67/979 1302/68/979 +f 1312/66/979 1305/85/979 1301/64/979 +f 1311/73/980 1302/82/980 1312/87/980 +f 1296/12/981 1295/48/981 1293/40/981 +f 1300/88/982 1291/75/982 1294/77/982 +f 1301/81/983 1304/76/983 1305/80/983 +f 1308/18/984 1309/70/984 1313/51/984 +f 1311/41/985 1328/52/985 1330/69/985 +f 1328/11/986 1321/2/986 1320/3/986 +f 1314/56/987 1320/90/987 1315/54/987 +f 1313/40/988 1302/12/988 1308/42/988 +f 1310/57/989 1306/54/989 1308/90/989 +f 1309/22/990 1321/59/990 1313/8/990 +f 1315/3/991 1317/2/991 1330/11/991 +f 1312/37/992 1319/61/992 1302/38/992 +f 1310/64/993 1318/63/993 1307/65/993 +f 1328/68/993 1317/86/993 1330/66/993 +f 1330/17/993 1319/35/993 1328/2/993 +f 1312/12/994 1311/48/994 1309/40/994 +f 1316/70/995 1307/58/995 1310/57/995 +f 1317/60/996 1320/55/996 1321/59/996 +f 1322/71/997 1329/31/997 1325/72/997 +f 1330/73/998 1324/25/998 1318/74/998 +f 1338/11/999 1337/2/999 1336/3/999 +f 1332/77/1000 1333/89/1000 1336/75/1000 +f 1329/40/1001 1328/12/1001 1325/42/1001 +f 1323/72/1002 1325/88/1002 1327/71/1002 +f 1334/81/1003 1329/7/1003 1326/79/1003 +f 1324/11/1004 1345/13/1004 1332/3/1004 +f 1345/82/1005 1328/17/1005 1319/2/1005 +f 1323/84/1006 1335/67/1006 1345/68/1006 +f 1338/86/1006 1334/64/1006 1324/66/1006 +f 1338/73/1007 1345/82/1007 1324/87/1007 +f 1319/12/1008 1318/48/1008 1326/40/1008 +f 1331/78/1009 1327/77/1009 1333/88/1009 +f 1332/89/1010 1337/80/1010 1334/81/1010 +f 1339/10/1011 1346/51/1011 1342/18/1011 +f 1338/41/1012 1361/52/1012 1341/69/1012 +f 1361/11/1013 1352/2/1013 1351/3/1013 +f 1348/54/1014 1349/55/1014 1351/90/1014 +f 1346/40/1015 1345/12/1015 1342/42/1015 +f 1344/57/1016 1339/54/1016 1342/90/1016 +f 1343/22/1017 1352/59/1017 1346/8/1017 +f 1348/3/1018 1350/2/1018 1341/11/1018 +f 1324/37/1019 1360/61/1019 1345/38/1019 +f 1344/64/1020 1359/63/1020 1340/65/1020 +f 1361/68/1020 1350/86/1020 1341/66/1020 +f 1341/17/1020 1360/35/1020 1361/2/1020 +f 1324/12/1021 1338/48/1021 1343/40/1021 +f 1347/51/1022 1344/57/1022 1349/70/1022 +f 1348/56/1023 1352/59/1023 1350/60/1023 +f 1353/71/1024 1362/31/1024 1356/72/1024 +f 1359/74/1025 1375/24/1025 1355/25/1025 +f 1375/11/1026 1369/2/1026 1368/3/1026 +f 1363/76/1027 1368/75/1027 1364/77/1027 +f 1362/40/1028 1361/12/1028 1356/42/1028 +f 1358/71/1029 1353/78/1029 1356/88/1029 +f 1357/79/1030 1369/80/1030 1362/7/1030 +f 1364/3/1031 1366/2/1031 1355/11/1031 +f 1360/2/1032 1377/87/1032 1361/17/1032 +f 1354/84/1033 1377/67/1033 1367/68/1033 +f 1375/86/1033 1366/64/1033 1355/66/1033 +f 1375/73/1034 1367/82/1034 1355/87/1034 +f 1360/12/1035 1359/48/1035 1357/40/1035 +f 1363/78/1036 1358/77/1036 1365/88/1036 +f 1364/89/1037 1369/80/1037 1366/81/1037 +f 1370/10/1038 1376/51/1038 1372/18/1038 +f 1375/41/1039 1385/52/1039 1394/69/1039 +f 1385/11/1040 1384/2/1040 1383/3/1040 +f 1379/54/1041 1380/55/1041 1383/90/1041 +f 1377/48/1042 1367/12/1042 1372/42/1042 +f 1374/57/1043 1370/54/1043 1372/90/1043 +f 1373/22/1044 1384/59/1044 1376/8/1044 +f 1379/3/1045 1381/2/1045 1394/11/1045 +f 1355/37/1046 1392/61/1046 1367/38/1046 +f 1374/64/1047 1382/63/1047 1371/65/1047 +f 1385/68/1047 1381/86/1047 1394/66/1047 +f 1382/36/1047 1385/2/1047 1394/17/1047 +f 1375/48/1048 1373/40/1048 1370/42/1048 +f 1378/51/1049 1374/57/1049 1380/70/1049 +f 1379/56/1050 1384/59/1050 1381/60/1050 +f 1386/71/1051 1393/31/1051 1389/72/1051 +f 1382/74/1052 1402/24/1052 1388/25/1052 +f 1402/11/1053 1401/2/1053 1400/3/1053 +f 1395/76/1054 1400/75/1054 1396/77/1054 +f 1393/40/1055 1385/12/1055 1389/42/1055 +f 1391/71/1056 1386/78/1056 1389/88/1056 +f 1390/79/1057 1401/80/1057 1393/7/1057 +f 1388/11/1058 1399/13/1058 1395/53/1058 +f 1392/2/1059 1409/87/1059 1385/17/1059 +f 1387/84/1060 1409/67/1060 1399/68/1060 +f 1402/86/1060 1398/64/1060 1388/66/1060 +f 1388/87/1061 1409/74/1061 1399/82/1061 +f 1392/12/1062 1382/48/1062 1390/40/1062 +f 1397/88/1063 1387/75/1063 1391/77/1063 +f 1398/81/1064 1400/76/1064 1401/80/1064 +f 1405/18/1065 1406/70/1065 1408/51/1065 +f 1409/49/1066 1426/69/1066 1402/41/1066 +f 1424/11/1067 1415/2/1067 1414/3/1067 +f 1411/54/1068 1412/55/1068 1414/90/1068 +f 1409/48/1069 1399/12/1069 1405/42/1069 +f 1404/58/1070 1405/90/1070 1407/57/1070 +f 1413/60/1071 1408/8/1071 1406/22/1071 +f 1411/3/1072 1413/2/1072 1426/11/1072 +f 1422/62/1073 1399/38/1073 1388/37/1073 +f 1407/64/1074 1422/63/1074 1404/65/1074 +f 1426/66/1074 1415/67/1074 1413/86/1074 +f 1402/48/1075 1406/40/1075 1403/42/1075 +f 1410/51/1076 1407/57/1076 1412/70/1076 +f 1411/56/1077 1415/59/1077 1413/60/1077 +f 1416/71/1078 1425/31/1078 1419/72/1078 +f 1422/74/1079 1439/24/1079 1418/25/1079 +f 1439/11/1080 1433/2/1080 1432/3/1080 +f 1428/77/1081 1429/89/1081 1432/75/1081 +f 1426/48/1082 1424/12/1082 1419/42/1082 +f 1421/71/1083 1416/78/1083 1419/88/1083 +f 1420/79/1084 1433/80/1084 1425/7/1084 +f 1428/3/1085 1430/2/1085 1418/11/1085 +f 1423/2/1086 1441/87/1086 1424/17/1086 +f 1417/84/1087 1441/67/1087 1431/68/1087 +f 1439/86/1087 1430/64/1087 1418/66/1087 +f 1439/73/1088 1431/82/1088 1418/87/1088 +f 1422/48/1089 1420/40/1089 1416/42/1089 +f 1422/49/1074 1424/63/1074 1426/23/1074 +f 1427/78/1090 1421/77/1090 1429/88/1090 +f 1428/89/1091 1433/80/1091 1430/81/1091 +f 1434/10/1092 1440/51/1092 1436/18/1092 +f 1439/41/1093 1456/52/1093 1458/69/1093 +f 1456/11/1094 1448/2/1094 1447/3/1094 +f 1443/54/1095 1444/55/1095 1447/90/1095 +f 1441/48/1096 1431/12/1096 1436/42/1096 +f 1438/57/1097 1434/54/1097 1436/90/1097 +f 1437/22/1098 1448/59/1098 1440/8/1098 +f 1443/3/1099 1445/2/1099 1458/11/1099 +f 1418/37/1100 1455/61/1100 1431/38/1100 +f 1438/64/1101 1446/63/1101 1435/65/1101 +f 1458/66/1101 1448/67/1101 1445/86/1101 +f 1446/36/1101 1456/2/1101 1458/17/1101 +f 1439/48/1102 1437/40/1102 1434/42/1102 +f 1444/70/1103 1435/58/1103 1438/57/1103 +f 1445/60/1104 1447/55/1104 1448/59/1104 +f 1452/72/1105 1453/26/1105 1457/31/1105 +f 1458/73/1106 1451/25/1106 1446/74/1106 +f 1466/11/1107 1465/2/1107 1464/3/1107 +f 1459/76/1108 1464/75/1108 1460/77/1108 +f 1458/48/1109 1456/12/1109 1452/42/1109 +f 1450/72/1110 1452/88/1110 1454/71/1110 +f 1462/81/1111 1457/7/1111 1453/79/1111 +f 1460/3/1112 1462/2/1112 1451/11/1112 +f 1463/82/1113 1456/17/1113 1455/2/1113 +f 1450/84/1114 1474/67/1114 1463/68/1114 +f 1451/66/1114 1465/85/1114 1462/64/1114 +f 1451/87/1115 1474/74/1115 1463/82/1115 +f 1446/48/1116 1453/40/1116 1449/42/1116 +f 1459/78/1117 1454/77/1117 1461/88/1117 +f 1460/89/1118 1465/80/1118 1462/81/1118 +f 1470/18/1119 1471/70/1119 1473/51/1119 +f 1474/49/1120 1469/69/1120 1466/41/1120 +f 1488/11/1121 1481/2/1121 1480/3/1121 +f 1475/56/1122 1480/90/1122 1476/54/1122 +f 1473/40/1123 1463/12/1123 1470/42/1123 +f 1468/58/1124 1470/90/1124 1472/57/1124 +f 1478/60/1125 1473/8/1125 1471/22/1125 +f 1476/3/1126 1478/2/1126 1469/11/1126 +f 1479/62/1127 1463/38/1127 1451/37/1127 +f 1468/65/1128 1487/85/1128 1479/63/1128 +f 1469/66/1128 1481/67/1128 1478/86/1128 +f 1479/36/1128 1488/2/1128 1469/17/1128 +f 1451/12/1129 1466/48/1129 1471/40/1129 +f 1477/70/1130 1468/58/1130 1472/57/1130 +f 1478/60/1131 1480/55/1131 1481/59/1131 +f 1482/71/1132 1489/31/1132 1484/72/1132 +f 1469/73/1133 1504/25/1133 1479/74/1133 +f 1497/11/1134 1496/2/1134 1495/3/1134 +f 1490/76/1135 1495/75/1135 1491/77/1135 +f 1489/40/1136 1488/12/1136 1484/42/1136 +f 1483/72/1137 1484/88/1137 1486/71/1137 +f 1493/81/1138 1489/7/1138 1485/79/1138 +f 1490/53/1139 1491/3/1139 1494/13/1139 +f 1494/82/1140 1488/17/1140 1487/2/1140 +f 1486/83/1141 1494/68/1141 1483/84/1141 +f 1504/66/1141 1496/85/1141 1493/64/1141 +f 1504/87/1142 1506/74/1142 1494/82/1142 +f 1487/12/1143 1479/48/1143 1485/40/1143 +f 1490/78/1144 1486/77/1144 1492/88/1144 +f 1491/89/1145 1496/80/1145 1493/81/1145 +f 1501/18/1146 1502/70/1146 1505/51/1146 +f 1497/41/1147 1513/52/1147 1500/69/1147 +f 1513/11/1148 1512/2/1148 1511/3/1148 +f 1507/56/1149 1511/90/1149 1508/54/1149 +f 1505/40/1150 1494/12/1150 1501/42/1150 +f 1503/57/1151 1498/54/1151 1501/90/1151 +f 1502/22/1152 1512/59/1152 1505/8/1152 +f 1508/3/1153 1510/2/1153 1500/11/1153 +f 1504/37/1154 1521/61/1154 1494/38/1154 +f 1499/65/1155 1521/85/1155 1520/63/1155 +f 1513/68/1155 1510/86/1155 1500/66/1155 +f 1500/17/1155 1521/35/1155 1513/2/1155 +f 1504/12/1156 1497/48/1156 1502/40/1156 +f 1509/70/1157 1499/58/1157 1503/57/1157 +f 1510/60/1158 1511/55/1158 1512/59/1158 +f 1517/72/1159 1518/26/1159 1522/31/1159 +f 1520/74/1160 1537/24/1160 1516/25/1160 +f 1537/11/1161 1530/2/1161 1529/3/1161 +f 1523/76/1162 1529/75/1162 1524/77/1162 +f 1522/40/1163 1513/12/1163 1517/42/1163 +f 1519/71/1164 1514/78/1164 1517/88/1164 +f 1518/79/1165 1530/80/1165 1522/7/1165 +f 1524/3/1166 1526/2/1166 1516/11/1166 +f 1521/2/1167 1528/87/1167 1513/17/1167 +f 1519/83/1168 1527/68/1168 1515/84/1168 +f 1537/86/1168 1526/64/1168 1516/66/1168 +f 1516/87/1169 1528/74/1169 1527/82/1169 +f 1521/12/1170 1520/48/1170 1518/40/1170 +f 1525/88/1171 1515/75/1171 1519/77/1171 +f 1526/81/1172 1529/76/1172 1530/80/1172 +f 1531/10/1173 1538/51/1173 1534/18/1173 +f 1537/41/1174 1546/52/1174 1533/69/1174 +f 1546/11/1175 1545/2/1175 1544/3/1175 +f 1540/54/1176 1541/55/1176 1544/90/1176 +f 1538/40/1177 1527/12/1177 1534/42/1177 +f 1536/57/1178 1531/54/1178 1534/90/1178 +f 1542/60/1179 1538/8/1179 1535/22/1179 +f 1540/3/1180 1542/2/1180 1533/11/1180 +f 1516/37/1181 1543/61/1181 1527/38/1181 +f 1536/64/1182 1552/63/1182 1532/65/1182 +f 1533/66/1182 1545/67/1182 1542/86/1182 +f 1552/36/1183 1546/2/1183 1533/17/1183 +f 1516/12/1184 1537/48/1184 1535/40/1184 +f 1541/70/1185 1532/58/1185 1536/57/1185 +f 1542/60/1186 1544/55/1186 1545/59/1186 +f 1547/71/1187 1553/31/1187 1549/72/1187 +f 1533/73/1188 1568/25/1188 1552/74/1188 +f 1567/11/1189 1561/2/1189 1560/3/1189 +f 1555/77/1190 1556/89/1190 1560/75/1190 +f 1533/48/1191 1546/12/1191 1549/42/1191 +f 1548/72/1192 1549/88/1192 1551/71/1192 +f 1557/81/1193 1553/7/1193 1550/79/1193 +f 1554/53/1194 1555/3/1194 1558/13/1194 +f 1558/82/1195 1546/17/1195 1543/2/1195 +f 1548/84/1196 1559/67/1196 1558/68/1196 +f 1568/66/1196 1561/85/1196 1557/64/1196 +f 1568/87/1197 1559/74/1197 1558/82/1197 +f 1552/48/1198 1550/40/1198 1547/42/1198 +f 1554/78/1199 1551/77/1199 1556/88/1199 +f 1555/89/1200 1561/80/1200 1557/81/1200 +f 1562/10/1201 1569/51/1201 1564/18/1201 +f 1567/41/1202 1584/52/1202 1586/69/1202 +f 1584/11/1203 1577/2/1203 1576/3/1203 +f 1571/54/1204 1572/55/1204 1576/90/1204 +f 1569/40/1205 1558/12/1205 1564/42/1205 +f 1566/57/1206 1562/54/1206 1564/90/1206 +f 1565/22/1207 1577/59/1207 1569/8/1207 +f 1571/3/1208 1573/2/1208 1586/11/1208 +f 1568/37/1209 1575/61/1209 1558/38/1209 +f 1563/65/1210 1575/85/1210 1574/63/1210 +f 1584/68/1210 1573/86/1210 1586/66/1210 +f 1574/36/1210 1584/2/1210 1586/17/1210 +f 1568/12/1211 1567/48/1211 1565/40/1211 +f 1570/51/1212 1566/57/1212 1572/70/1212 +f 1571/56/1213 1577/59/1213 1573/60/1213 +f 1578/71/1214 1585/31/1214 1581/72/1214 +f 1574/74/1215 1595/24/1215 1580/25/1215 +f 1595/11/1216 1594/2/1216 1593/3/1216 +f 1587/76/1217 1593/75/1217 1588/77/1217 +f 1585/40/1218 1584/12/1218 1581/42/1218 +f 1583/71/1219 1578/78/1219 1581/88/1219 +f 1582/79/1220 1594/80/1220 1585/7/1220 +f 1591/13/1221 1579/15/1221 1587/53/1221 +f 1575/2/1222 1592/87/1222 1584/17/1222 +f 1583/83/1223 1591/68/1223 1579/84/1223 +f 1580/66/1223 1594/85/1223 1590/64/1223 +f 1580/87/1224 1592/74/1224 1591/82/1224 +f 1575/12/1225 1574/48/1225 1582/40/1225 +f 1587/78/1226 1583/77/1226 1589/88/1226 +f 1588/89/1227 1594/80/1227 1590/81/1227 +f 125/51/9 120/70/9 116/10/9 +f 122/41/10 118/69/10 141/52/10 +f 121/15/11 129/53/11 132/13/11 +f 129/53/11 133/3/11 141/11/11 +f 133/3/11 134/2/11 141/11/11 +f 128/54/12 133/90/12 129/55/12 +f 119/42/11 121/53/11 124/12/11 +f 121/53/11 132/47/11 124/12/11 +f 141/91/11 134/3/11 126/48/11 +f 134/3/11 125/40/11 126/48/11 +f 119/42/11 124/12/11 125/40/11 +f 121/57/10 119/90/10 116/54/10 +f 120/22/13 125/8/13 134/59/13 +f 118/11/14 130/2/14 128/3/14 +f 128/3/14 127/53/14 118/11/14 +f 127/53/14 117/15/14 131/13/14 +f 123/37/13 124/38/13 132/61/13 +f 131/63/15 132/85/15 121/64/15 +f 118/66/15 130/86/15 134/67/15 +f 118/17/15 141/2/15 132/35/15 +f 123/12/14 131/47/14 117/53/14 +f 120/40/14 130/3/14 122/48/14 +f 130/3/14 118/91/14 122/48/14 +f 123/12/14 117/53/14 116/42/14 +f 120/40/14 122/48/14 123/12/14 +f 122/61/15 126/62/15 124/52/15 +f 129/70/16 121/57/16 117/58/16 +f 130/60/17 134/59/17 133/55/17 +f 142/31/9 139/26/9 135/71/9 +f 137/25/18 155/24/18 118/73/18 +f 140/15/19 145/53/19 158/13/19 +f 145/53/19 147/3/19 158/13/19 +f 158/13/19 147/3/19 155/11/19 +f 147/75/20 145/89/20 143/76/20 +f 138/42/1232 140/53/1232 141/12/1232 +f 140/53/1233 158/47/1233 141/12/1233 +f 155/91/1234 148/3/1234 118/48/1234 +f 148/3/1235 142/40/1235 118/48/1235 +f 138/42/13 141/12/13 142/40/13 +f 140/71/21 138/88/21 135/78/21 +f 139/79/22 142/7/22 148/80/22 +f 137/11/23 146/2/23 144/3/23 +f 144/3/23 143/53/23 156/13/23 +f 143/53/23 136/15/23 156/13/23 +f 141/17/24 158/87/24 156/82/24 +f 156/68/25 158/67/25 140/83/25 +f 137/66/25 146/64/25 148/85/25 +f 137/87/26 156/82/26 158/74/26 +f 132/12/1236 156/47/1236 136/53/1236 +f 139/40/1237 146/3/1237 131/48/1237 +f 146/3/1236 137/91/1236 131/48/1236 +f 132/12/1238 136/53/1238 135/42/1238 +f 139/40/10 131/48/10 132/12/10 +f 140/77/27 136/75/27 143/78/27 +f 148/80/28 147/76/28 144/89/28 +f 157/51/29 153/70/29 149/10/29 +f 155/41/1239 151/69/1239 166/52/1239 +f 154/15/31 161/53/31 163/13/31 +f 161/53/1240 164/3/1240 163/13/1240 +f 164/3/31 165/2/31 166/11/31 +f 164/90/32 161/55/32 159/56/32 +f 152/42/1241 154/53/1241 156/12/1241 +f 154/53/1242 163/47/1242 156/12/1242 +f 166/91/1243 165/3/1243 158/48/1243 +f 165/3/1244 157/40/1244 158/48/1244 +f 152/42/33 156/12/33 158/48/33 +f 154/57/1245 152/90/1245 149/54/1245 +f 153/22/1246 157/8/1246 165/59/1246 +f 151/11/1247 162/2/1247 160/3/1247 +f 160/3/1247 159/53/1247 173/13/1247 +f 159/53/36 150/15/36 173/13/36 +f 137/37/37 156/38/37 163/61/37 +f 173/63/38 163/85/38 154/64/38 +f 151/66/38 162/86/38 165/67/38 +f 151/17/38 166/2/38 163/35/38 +f 137/12/1248 173/47/1248 150/53/1248 +f 153/40/1249 162/3/1249 155/48/1249 +f 162/3/1250 151/91/1250 155/48/1250 +f 137/12/1251 150/53/1251 149/42/1251 +f 153/40/39 155/48/39 149/42/39 +f 154/57/40 150/58/40 159/51/40 +f 165/59/41 164/55/41 160/56/41 +f 174/31/42 171/26/42 167/71/42 +f 173/74/1252 169/25/1252 187/24/1252 +f 172/15/1253 177/53/1253 179/13/1253 +f 177/53/1254 180/3/1254 187/11/1254 +f 180/3/1255 181/2/1255 187/11/1255 +f 176/77/45 180/75/45 177/89/45 +f 170/42/1256 172/53/1256 166/12/1256 +f 172/53/1257 179/47/1257 166/12/1257 +f 187/91/1258 181/3/1258 151/48/1258 +f 181/3/1259 174/40/1259 151/48/1259 +f 170/42/1260 166/12/1260 174/40/1260 +f 172/71/1261 170/88/1261 167/78/1261 +f 171/79/1262 174/7/1262 181/80/1262 +f 169/11/1263 178/2/1263 176/3/1263 +f 176/3/1264 175/53/1264 169/11/1264 +f 175/53/49 168/15/49 188/13/49 +f 163/2/1265 166/17/1265 179/87/1265 +f 168/84/51 188/68/51 179/67/51 +f 178/64/51 181/85/51 187/86/51 +f 169/87/52 188/82/52 179/74/52 +f 163/12/1266 188/47/1266 168/53/1266 +f 171/40/1267 178/3/1267 173/48/1267 +f 178/3/1268 169/91/1268 173/48/1268 +f 163/12/1269 168/53/1269 167/42/1269 +f 171/40/1270 173/48/1270 163/12/1270 +f 172/77/1271 168/75/1271 175/78/1271 +f 181/80/1272 180/76/1272 176/89/1272 +f 184/18/56 189/51/56 185/70/56 +f 187/41/1273 205/69/1273 203/52/1273 +f 186/15/1274 192/53/1274 195/13/1274 +f 192/53/1275 196/3/1275 195/13/1275 +f 195/13/58 196/3/58 203/11/58 +f 196/90/59 192/55/59 190/56/59 +f 184/42/1276 186/53/1276 188/12/1276 +f 186/53/1277 195/47/1277 188/12/1277 +f 203/91/1278 197/3/1278 179/48/1278 +f 197/3/1279 189/40/1279 179/48/1279 +f 184/42/1280 188/12/1280 179/48/1280 +f 186/57/1281 184/90/1281 182/54/1281 +f 185/22/1282 189/8/1282 197/59/1282 +f 205/11/63 193/2/63 191/3/63 +f 191/3/1283 190/53/1283 194/13/1283 +f 190/53/1284 183/15/1284 194/13/1284 +f 169/37/1285 188/38/1285 195/61/1285 +f 194/63/65 195/85/65 186/64/65 +f 205/66/65 193/86/65 197/67/65 +f 205/17/65 203/2/65 195/35/65 +f 169/12/1286 194/47/1286 183/53/1286 +f 185/40/1287 193/3/1287 187/48/1287 +f 193/3/1288 205/91/1288 187/48/1288 +f 169/12/1289 183/53/1289 182/42/1289 +f 185/40/1290 187/48/1290 182/42/1290 +f 192/70/1291 186/57/1291 183/58/1291 +f 193/60/1292 197/59/1292 196/55/1292 +f 204/31/69 201/26/69 198/71/69 +f 219/25/1293 213/24/1293 205/73/1293 +f 202/15/1294 208/53/1294 210/13/1294 +f 208/53/1295 211/3/1295 210/13/1295 +f 210/13/71 211/3/71 213/11/71 +f 207/77/72 211/75/72 208/89/72 +f 200/42/1296 202/53/1296 203/12/1296 +f 202/53/1297 210/47/1297 203/12/1297 +f 213/91/1298 212/3/1298 205/48/1298 +f 212/3/1299 204/40/1299 205/48/1299 +f 200/42/1300 203/12/1300 204/40/1300 +f 200/88/1301 198/78/1301 199/72/1301 +f 204/7/1302 212/80/1302 209/81/1302 +f 220/13/1303 219/11/1303 207/3/1303 +f 219/11/1303 209/2/1303 207/3/1303 +f 207/3/1304 206/53/1304 220/13/1304 +f 203/17/1305 210/87/1305 220/82/1305 +f 220/68/78 210/67/78 202/83/78 +f 209/64/78 212/85/78 213/86/78 +f 220/82/79 210/74/79 213/73/79 +f 195/12/1306 220/47/1306 199/53/1306 +f 201/40/1307 209/3/1307 194/48/1307 +f 209/3/1308 219/91/1308 194/48/1308 +f 195/12/1309 199/53/1309 198/42/1309 +f 201/40/1310 194/48/1310 195/12/1310 +f 208/88/1311 202/77/1311 199/75/1311 +f 209/81/1312 212/80/1312 211/76/1312 +f 221/51/83 217/70/83 214/10/83 +f 238/69/1313 229/52/1313 210/49/1313 +f 218/15/1314 224/53/1314 236/13/1314 +f 224/53/1315 227/3/1315 236/13/1315 +f 227/3/85 228/2/85 229/11/85 +f 227/90/86 224/55/86 222/56/86 +f 216/42/1316 218/53/1316 220/12/1316 +f 218/53/1317 236/47/1317 220/12/1317 +f 229/91/1318 228/3/1318 210/48/1318 +f 228/3/1319 221/40/1319 210/48/1319 +f 216/42/1320 220/12/1320 221/40/1320 +f 218/57/1321 216/90/1321 214/54/1321 +f 221/8/1322 228/59/1322 225/60/1322 +f 226/13/1323 238/11/1323 223/3/1323 +f 238/11/1323 225/2/1323 223/3/1323 +f 223/3/1324 222/53/1324 226/13/1324 +f 219/37/1325 220/38/1325 236/61/1325 +f 226/63/92 236/85/92 218/64/92 +f 225/86/92 228/67/92 229/68/92 +f 229/2/92 236/35/92 226/36/92 +f 219/12/1326 226/47/1326 215/53/1326 +f 217/40/1327 225/3/1327 213/48/1327 +f 225/3/1328 238/91/1328 213/48/1328 +f 219/12/1329 215/53/1329 214/42/1329 +f 217/40/1330 213/48/1330 219/12/1330 +f 218/57/1331 215/58/1331 222/51/1331 +f 228/59/1332 227/55/1332 223/56/1332 +f 237/31/96 234/26/96 230/71/96 +f 226/74/1333 232/25/1333 253/24/1333 +f 235/15/98 241/53/98 244/13/98 +f 241/53/98 245/3/98 244/13/98 +f 244/13/98 245/3/98 253/11/98 +f 245/75/99 241/89/99 239/76/99 +f 233/42/1334 235/53/1334 229/12/1334 +f 235/53/1335 244/47/1335 229/12/1335 +f 253/91/1336 246/3/1336 238/48/1336 +f 246/3/1337 237/40/1337 238/48/1337 +f 233/42/1338 229/12/1338 237/40/1338 +f 235/71/1339 233/88/1339 230/78/1339 +f 234/79/1340 237/7/1340 246/80/1340 +f 232/11/103 242/2/103 240/3/103 +f 240/3/103 239/53/103 243/13/103 +f 239/53/1341 231/15/1341 243/13/1341 +f 236/2/1342 229/17/1342 244/87/1342 +f 231/84/105 243/68/105 244/67/105 +f 242/64/105 246/85/105 253/86/105 +f 232/87/106 243/82/106 244/74/106 +f 236/12/1343 243/47/1343 231/53/1343 +f 234/40/1344 242/3/1344 226/48/1344 +f 242/3/1345 232/91/1345 226/48/1345 +f 236/12/1346 231/53/1346 230/42/1346 +f 234/40/1347 226/48/1347 236/12/1347 +f 241/88/108 235/77/108 231/75/108 +f 242/81/109 246/80/109 245/76/109 +f 254/51/110 251/70/110 247/10/110 +f 249/69/1348 268/52/1348 244/49/1348 +f 252/15/112 257/53/112 267/13/112 +f 257/53/1349 259/3/1349 268/11/1349 +f 259/3/1350 260/2/1350 268/11/1350 +f 259/90/113 257/55/113 255/56/113 +f 250/42/1351 252/53/1351 243/12/1351 +f 252/53/1352 267/47/1352 243/12/1352 +f 268/91/1353 260/3/1353 244/48/1353 +f 260/3/1354 254/40/1354 244/48/1354 +f 250/42/1355 243/12/1355 254/40/1355 +f 250/90/1356 247/54/1356 248/58/1356 +f 254/8/1357 260/59/1357 258/60/1357 +f 249/11/1358 258/2/1358 256/3/1358 +f 256/3/1359 255/53/1359 249/11/1359 +f 255/53/117 248/15/117 266/13/117 +f 243/38/1360 267/61/1360 266/62/1360 +f 266/63/119 267/85/119 252/64/119 +f 249/66/119 258/86/119 260/67/119 +f 268/2/119 267/35/119 266/36/119 +f 232/12/1361 266/47/1361 248/53/1361 +f 251/40/1362 258/3/1362 253/48/1362 +f 258/3/1363 249/91/1363 253/48/1363 +f 232/12/1364 248/53/1364 247/42/1364 +f 251/40/1365 253/48/1365 232/12/1365 +f 257/70/1366 252/57/1366 248/58/1366 +f 258/60/1367 260/59/1367 259/55/1367 +f 263/72/123 269/31/123 264/26/123 +f 282/25/1368 281/24/1368 249/73/1368 +f 265/15/125 272/53/125 285/13/125 +f 272/53/125 274/3/125 285/13/125 +f 285/13/125 274/3/125 281/11/125 +f 274/75/126 272/89/126 270/76/126 +f 263/42/1369 265/53/1369 268/12/1369 +f 265/53/1370 285/47/1370 268/12/1370 +f 281/91/1371 275/3/1371 249/48/1371 +f 275/3/1372 269/40/1372 249/48/1372 +f 263/42/127 268/12/127 249/48/127 +f 263/88/1373 261/78/1373 262/72/1373 +f 269/7/1374 275/80/1374 273/81/1374 +f 282/11/130 273/2/130 271/3/130 +f 271/3/130 270/53/130 283/13/130 +f 270/53/130 262/15/130 283/13/130 +f 268/17/1375 285/87/1375 283/82/1375 +f 262/84/132 283/68/132 285/67/132 +f 273/64/132 275/85/132 281/86/132 +f 267/12/1376 283/47/1376 262/53/1376 +f 264/40/1377 273/3/1377 266/48/1377 +f 273/3/1378 282/91/1378 266/48/1378 +f 267/12/1379 262/53/1379 261/42/1379 +f 264/40/133 266/48/133 261/42/133 +f 272/88/134 265/77/134 262/75/134 +f 273/81/135 275/80/135 274/76/135 +f 278/18/136 284/51/136 279/70/136 +f 302/69/137 300/52/137 285/49/137 +f 280/15/134 288/53/134 299/13/134 +f 288/53/134 291/3/134 300/11/134 +f 291/3/134 292/2/134 300/11/134 +f 291/90/138 288/55/138 286/56/138 +f 278/42/1380 280/53/1380 283/12/1380 +f 280/53/161 299/47/161 283/12/161 +f 300/91/161 292/3/161 285/48/161 +f 292/3/1381 284/40/1381 285/48/1381 +f 278/42/139 283/12/139 284/40/139 +f 278/90/140 276/54/140 277/58/140 +f 284/8/141 292/59/141 289/60/141 +f 290/13/135 302/11/135 286/53/135 +f 302/11/135 289/2/135 287/3/135 +f 287/3/135 286/53/135 302/11/135 +f 283/38/1382 299/61/1382 290/62/1382 +f 277/65/143 290/63/143 299/85/143 +f 302/66/143 289/86/143 292/67/143 +f 302/17/143 300/2/143 299/35/143 +f 282/12/167 290/47/167 277/53/167 +f 279/40/1383 289/3/1383 281/48/1383 +f 289/3/167 302/91/167 281/48/167 +f 282/12/1384 277/53/1384 276/42/1384 +f 279/40/144 281/48/144 282/12/144 +f 281/61/132 285/62/132 283/52/132 +f 280/57/145 277/58/145 286/51/145 +f 292/59/146 291/55/146 287/56/146 +f 296/72/147 301/31/147 297/26/147 +f 295/25/134 311/24/134 302/73/134 +f 298/15/148 305/53/148 308/13/148 +f 305/53/148 309/3/148 308/13/148 +f 308/13/148 309/3/148 311/11/148 +f 304/77/1385 309/75/1385 305/89/1385 +f 296/42/1386 298/53/1386 300/12/1386 +f 298/53/1387 308/47/1387 300/12/1387 +f 311/91/1387 310/3/1387 302/48/1387 +f 310/3/1388 301/40/1388 302/48/1388 +f 296/42/150 300/12/150 302/48/150 +f 298/71/134 296/88/134 293/78/134 +f 297/79/135 301/7/135 310/80/135 +f 295/11/151 306/2/151 304/3/151 +f 304/3/151 303/53/151 307/13/151 +f 303/53/151 294/15/151 307/13/151 +f 300/17/135 308/87/135 307/82/135 +f 307/68/152 308/67/152 298/83/152 +f 295/66/152 306/64/152 310/85/152 +f 307/82/153 308/74/153 311/73/153 +f 299/12/1389 307/47/1389 294/53/1389 +f 297/40/1390 306/3/1390 290/48/1390 +f 306/3/1389 295/91/1389 290/48/1389 +f 299/12/1391 294/53/1391 293/42/1391 +f 297/40/154 290/48/154 293/42/154 +f 298/77/155 294/75/155 303/78/155 +f 310/80/156 309/76/156 304/89/156 +f 317/51/157 315/70/157 312/10/157 +f 334/69/1392 324/52/1392 308/49/1392 +f 316/15/159 320/53/159 332/13/159 +f 320/53/159 322/3/159 324/11/159 +f 322/3/159 323/2/159 324/11/159 +f 319/54/160 322/90/160 320/55/160 +f 314/42/1393 316/53/1393 307/12/1393 +f 316/53/1394 332/47/1394 307/12/1394 +f 324/91/1394 323/3/1394 308/48/1394 +f 323/3/1395 317/40/1395 308/48/1395 +f 314/42/161 307/12/161 308/48/161 +f 314/90/162 312/54/162 313/58/162 +f 317/8/163 323/59/163 321/60/163 +f 331/13/164 334/11/164 318/53/164 +f 334/11/1396 321/2/1396 319/3/1396 +f 319/3/164 318/53/164 334/11/164 +f 307/38/1397 332/61/1397 331/62/1397 +f 313/65/166 331/63/166 332/85/166 +f 334/66/166 321/86/166 323/67/166 +f 334/17/166 324/2/166 332/35/166 +f 295/12/1398 331/47/1398 313/53/1398 +f 315/40/1399 321/3/1399 311/48/1399 +f 321/3/1398 334/91/1398 311/48/1398 +f 295/12/1400 313/53/1400 312/42/1400 +f 315/40/167 311/48/167 312/42/167 +f 316/57/168 313/58/168 318/51/168 +f 323/59/169 322/55/169 319/56/169 +f 328/72/170 333/31/170 329/26/170 +f 331/74/1401 327/25/1401 343/24/1401 +f 330/15/1402 337/53/1402 340/13/1402 +f 337/53/1403 341/3/1403 343/11/1403 +f 341/3/1404 342/2/1404 343/11/1404 +f 336/77/173 341/75/173 337/89/173 +f 328/42/1405 330/53/1405 324/12/1405 +f 330/53/1406 340/47/1406 324/12/1406 +f 343/91/1407 342/3/1407 334/48/1407 +f 342/3/1408 333/40/1408 334/48/1408 +f 328/42/174 324/12/174 334/48/174 +f 330/71/1409 328/88/1409 325/78/1409 +f 329/79/1410 333/7/1410 342/80/1410 +f 327/11/1411 338/2/1411 336/3/1411 +f 336/3/1412 335/53/1412 327/11/1412 +f 335/53/177 326/15/177 339/13/177 +f 332/2/1413 324/17/1413 340/87/1413 +f 339/68/179 340/67/179 330/83/179 +f 338/64/179 342/85/179 343/86/179 +f 339/82/180 340/74/180 343/73/180 +f 332/12/1414 339/47/1414 326/53/1414 +f 329/40/1415 338/3/1415 331/48/1415 +f 338/3/1416 327/91/1416 331/48/1416 +f 332/12/1417 326/53/1417 325/42/1417 +f 329/40/1418 331/48/1418 325/42/1418 +f 337/88/1419 330/77/1419 326/75/1419 +f 338/81/1420 342/80/1420 341/76/1420 +f 349/51/184 347/70/184 344/10/184 +f 366/69/1421 356/52/1421 340/49/1421 +f 348/15/186 352/53/186 364/13/186 +f 352/53/1422 354/3/1422 356/11/1422 +f 354/3/1423 355/2/1423 356/11/1423 +f 351/54/187 354/90/187 352/55/187 +f 346/42/1424 348/53/1424 339/12/1424 +f 348/53/1425 364/47/1425 339/12/1425 +f 356/91/1426 355/3/1426 340/48/1426 +f 355/3/1427 349/40/1427 340/48/1427 +f 346/42/188 339/12/188 340/48/188 +f 346/90/1428 344/54/1428 345/58/1428 +f 349/8/1429 355/59/1429 353/60/1429 +f 366/11/1430 353/2/1430 351/3/1430 +f 351/3/1431 350/53/1431 366/11/1431 +f 350/53/191 345/15/191 363/13/191 +f 339/38/1432 364/61/1432 363/62/1432 +f 363/63/193 364/85/193 348/64/193 +f 366/66/193 353/86/193 355/67/193 +f 356/2/193 364/35/193 363/36/193 +f 327/12/1433 363/47/1433 345/53/1433 +f 347/40/1434 353/3/1434 343/48/1434 +f 353/3/1435 366/91/1435 343/48/1435 +f 327/12/1436 345/53/1436 344/42/1436 +f 347/40/1437 343/48/1437 344/42/1437 +f 352/70/1438 348/57/1438 345/58/1438 +f 353/60/1439 355/59/1439 354/55/1439 +f 365/31/197 361/26/197 357/71/197 +f 359/25/1440 373/24/1440 366/73/1440 +f 362/15/1441 369/53/1441 382/13/1441 +f 369/53/1442 371/3/1442 382/13/1442 +f 371/3/199 372/2/199 373/11/199 +f 368/77/200 371/75/200 369/89/200 +f 360/42/1443 362/53/1443 356/12/1443 +f 362/53/1444 382/47/1444 356/12/1444 +f 373/91/1445 372/3/1445 366/48/1445 +f 372/3/1446 365/40/1446 366/48/1446 +f 360/42/1447 356/12/1447 366/48/1447 +f 360/88/1448 357/78/1448 358/72/1448 +f 365/7/1449 372/80/1449 370/81/1449 +f 359/11/204 370/2/204 368/3/204 +f 368/3/1450 367/53/1450 380/13/1450 +f 367/53/1451 358/15/1451 380/13/1451 +f 356/17/1452 382/87/1452 380/82/1452 +f 358/84/206 380/68/206 382/67/206 +f 370/64/206 372/85/206 373/86/206 +f 380/82/207 382/74/207 373/73/207 +f 364/12/1453 380/47/1453 358/53/1453 +f 361/40/1454 370/3/1454 363/48/1454 +f 370/3/1455 359/91/1455 363/48/1455 +f 364/12/1456 358/53/1456 357/42/1456 +f 361/40/1457 363/48/1457 357/42/1457 +f 362/77/1458 358/75/1458 367/78/1458 +f 372/80/1459 371/76/1459 368/89/1459 +f 377/18/211 381/51/211 378/70/211 +f 373/41/1460 376/69/1460 396/52/1460 +f 379/15/1461 385/53/1461 395/13/1461 +f 385/53/1462 388/3/1462 395/13/1462 +f 395/13/213 388/3/213 396/11/213 +f 388/90/214 385/55/214 383/56/214 +f 377/42/1463 379/53/1463 380/12/1463 +f 379/53/1464 395/47/1464 380/12/1464 +f 396/91/1465 389/3/1465 382/48/1465 +f 389/3/1466 381/40/1466 382/48/1466 +f 377/42/1467 380/12/1467 381/40/1467 +f 379/57/1468 377/90/1468 374/54/1468 +f 378/22/1469 381/8/1469 389/59/1469 +f 376/11/218 386/2/218 384/3/218 +f 384/3/1470 383/53/1470 387/13/1470 +f 383/53/1471 375/15/1471 387/13/1471 +f 359/37/1472 380/38/1472 395/61/1472 +f 375/65/220 387/63/220 395/85/220 +f 386/86/220 389/67/220 396/68/220 +f 376/17/220 396/2/220 395/35/220 +f 359/12/1473 387/47/1473 375/53/1473 +f 378/40/1474 386/3/1474 373/48/1474 +f 386/3/1475 376/91/1475 373/48/1475 +f 359/12/1476 375/53/1476 374/42/1476 +f 378/40/1477 373/48/1477 359/12/1477 +f 379/57/1478 375/58/1478 383/51/1478 +f 389/59/1479 388/55/1479 384/56/1479 +f 392/72/224 397/31/224 393/26/224 +f 413/25/1480 406/24/1480 376/73/1480 +f 394/15/1481 400/53/1481 403/13/1481 +f 400/53/1482 404/3/1482 403/13/1482 +f 403/13/226 404/3/226 406/11/226 +f 399/77/227 404/75/227 400/89/227 +f 392/42/1483 394/53/1483 396/12/1483 +f 394/53/1484 403/47/1484 396/12/1484 +f 406/91/1485 405/3/1485 376/48/1485 +f 405/3/1486 397/40/1486 376/48/1486 +f 392/42/1487 396/12/1487 397/40/1487 +f 392/88/1488 390/78/1488 391/72/1488 +f 397/7/1489 405/80/1489 401/81/1489 +f 413/11/231 401/2/231 399/3/231 +f 399/3/1490 398/53/1490 402/13/1490 +f 398/53/1491 391/15/1491 402/13/1491 +f 396/17/1492 403/87/1492 402/82/1492 +f 402/68/233 403/67/233 394/83/233 +f 413/66/233 401/64/233 405/85/233 +f 402/82/234 403/74/234 406/73/234 +f 395/12/1493 402/47/1493 391/53/1493 +f 393/40/1494 401/3/1494 387/48/1494 +f 401/3/1495 413/91/1495 387/48/1495 +f 395/12/1496 391/53/1496 390/42/1496 +f 393/40/1497 387/48/1497 395/12/1497 +f 394/77/1498 391/75/1498 398/78/1498 +f 405/80/1499 404/76/1499 399/89/1499 +f 410/18/238 414/51/238 411/70/238 +f 409/69/1500 429/52/1500 403/49/1500 +f 412/15/1501 417/53/1501 419/13/1501 +f 417/53/1502 420/3/1502 419/13/1502 +f 419/13/240 420/3/240 429/11/240 +f 416/54/241 420/90/241 417/55/241 +f 410/42/1503 412/53/1503 402/12/1503 +f 412/53/1504 419/47/1504 402/12/1504 +f 429/91/1505 421/3/1505 403/48/1505 +f 421/3/1506 414/40/1506 403/48/1506 +f 410/42/1507 402/12/1507 414/40/1507 +f 412/57/1508 410/90/1508 407/54/1508 +f 411/22/1509 414/8/1509 421/59/1509 +f 409/11/245 418/2/245 416/3/245 +f 416/3/1510 415/53/1510 428/13/1510 +f 415/53/1511 408/15/1511 428/13/1511 +f 402/38/1512 419/61/1512 428/62/1512 +f 408/65/247 428/63/247 419/85/247 +f 418/86/247 421/67/247 429/68/247 +f 409/17/247 429/2/247 419/35/247 +f 413/12/1513 428/47/1513 408/53/1513 +f 411/40/1514 418/3/1514 406/48/1514 +f 418/3/1515 409/91/1515 406/48/1515 +f 413/12/1516 408/53/1516 407/42/1516 +f 411/40/1517 406/48/1517 413/12/1517 +f 412/57/1518 408/58/1518 415/51/1518 +f 421/59/1519 420/55/1519 416/56/1519 +f 425/72/252 430/31/252 426/26/252 +f 424/25/1520 443/24/1520 409/73/1520 +f 427/15/1521 433/53/1521 435/13/1521 +f 433/53/1522 436/3/1522 435/13/1522 +f 435/13/254 436/3/254 443/11/254 +f 432/77/255 436/75/255 433/89/255 +f 425/42/1523 427/53/1523 429/12/1523 +f 427/53/1524 435/47/1524 429/12/1524 +f 443/91/1525 437/3/1525 409/48/1525 +f 437/3/1526 430/40/1526 409/48/1526 +f 425/42/1527 429/12/1527 430/40/1527 +f 427/71/1528 425/88/1528 422/78/1528 +f 426/79/1529 430/7/1529 437/80/1529 +f 424/11/259 434/2/259 432/3/259 +f 432/3/1530 431/53/1530 444/13/1530 +f 431/53/1531 423/15/1531 444/13/1531 +f 429/17/1532 435/87/1532 444/82/1532 +f 423/84/261 444/68/261 435/67/261 +f 424/66/261 434/64/261 437/85/261 +f 424/87/1533 444/82/1533 435/74/1533 +f 419/12/1534 444/47/1534 423/53/1534 +f 426/40/1535 434/3/1535 428/48/1535 +f 434/3/1536 424/91/1536 428/48/1536 +f 419/12/1537 423/53/1537 422/42/1537 +f 426/40/1538 428/48/1538 419/12/1538 +f 433/88/1539 427/77/1539 423/75/1539 +f 434/81/1540 437/80/1540 436/76/1540 +f 440/18/266 445/51/266 441/70/266 +f 461/69/1541 459/52/1541 435/49/1541 +f 442/15/1542 448/53/1542 458/13/1542 +f 448/53/1543 450/3/1543 458/13/1543 +f 458/13/268 450/3/268 459/11/268 +f 447/54/269 450/90/269 448/55/269 +f 440/42/1544 442/53/1544 444/12/1544 +f 442/53/1545 458/47/1545 444/12/1545 +f 459/91/1546 451/3/1546 435/48/1546 +f 451/3/1547 445/40/1547 435/48/1547 +f 440/42/1548 444/12/1548 445/40/1548 +f 440/90/1549 438/54/1549 439/58/1549 +f 445/8/1550 451/59/1550 449/60/1550 +f 461/11/273 449/2/273 447/3/273 +f 447/3/1551 446/53/1551 457/13/1551 +f 446/53/1552 439/15/1552 457/13/1552 +f 444/38/1553 458/61/1553 457/62/1553 +f 439/65/275 457/63/275 458/85/275 +f 461/66/275 449/86/275 451/67/275 +f 424/12/1554 457/47/1554 439/53/1554 +f 441/40/1555 449/3/1555 443/48/1555 +f 449/3/1556 461/91/1556 443/48/1556 +f 424/12/1557 439/53/1557 438/42/1557 +f 441/40/1558 443/48/1558 424/12/1558 +f 442/57/1559 439/58/1559 446/51/1559 +f 451/59/1560 450/55/1560 447/56/1560 +f 454/72/279 460/31/279 455/26/279 +f 457/74/1561 476/25/1561 475/24/1561 +f 456/15/281 464/53/281 467/13/281 +f 464/53/1562 468/3/1562 475/11/1562 +f 468/3/1563 469/2/1563 475/11/1563 +f 468/75/282 464/89/282 462/76/282 +f 454/42/1564 456/53/1564 459/12/1564 +f 456/53/1565 467/47/1565 459/12/1565 +f 475/91/1566 469/3/1566 461/48/1566 +f 469/3/1567 460/40/1567 461/48/1567 +f 454/42/1568 459/12/1568 460/40/1568 +f 456/71/1569 454/88/1569 452/78/1569 +f 455/79/1570 460/7/1570 469/80/1570 +f 476/11/1571 465/2/1571 463/3/1571 +f 463/3/1572 462/53/1572 476/11/1572 +f 462/53/286 453/15/286 466/13/286 +f 458/2/1573 459/17/1573 467/87/1573 +f 453/84/288 466/68/288 467/67/288 +f 476/66/288 465/64/288 469/85/288 +f 476/87/289 466/82/289 467/74/289 +f 458/12/1574 466/47/1574 453/53/1574 +f 455/40/1575 465/3/1575 457/48/1575 +f 465/3/1576 476/91/1576 457/48/1576 +f 458/12/1577 453/53/1577 452/42/1577 +f 455/40/1578 457/48/1578 458/12/1578 +f 457/49/275 461/23/275 459/63/275 +f 464/88/1579 456/77/1579 453/75/1579 +f 465/81/292 469/80/292 468/76/292 +f 477/51/293 473/70/293 470/10/293 +f 494/69/1580 492/52/1580 467/49/1580 +f 474/15/1581 480/53/1581 491/13/1581 +f 480/53/1582 483/3/1582 492/11/1582 +f 483/3/1583 484/2/1583 492/11/1583 +f 483/90/296 480/55/296 478/56/296 +f 472/42/1584 474/53/1584 466/12/1584 +f 474/53/1585 491/47/1585 466/12/1585 +f 492/91/1586 484/3/1586 467/48/1586 +f 484/3/1587 477/40/1587 467/48/1587 +f 472/42/1588 466/12/1588 467/48/1588 +f 472/90/1589 470/54/1589 471/58/1589 +f 477/8/1590 484/59/1590 481/60/1590 +f 494/11/1591 481/2/1591 479/3/1591 +f 479/3/1592 478/53/1592 494/11/1592 +f 478/53/300 471/15/300 482/13/300 +f 466/38/1593 491/61/1593 482/62/1593 +f 471/65/302 482/63/302 491/85/302 +f 481/86/302 484/67/302 492/68/302 +f 492/2/302 491/35/302 482/36/302 +f 476/12/1594 482/47/1594 471/53/1594 +f 473/40/1595 481/3/1595 475/48/1595 +f 481/3/1596 494/91/1596 475/48/1596 +f 476/12/1597 471/53/1597 470/42/1597 +f 473/40/1598 475/48/1598 470/42/1598 +f 474/57/1599 471/58/1599 478/51/1599 +f 484/59/1600 483/55/1600 479/56/1600 +f 493/31/306 489/26/306 485/71/306 +f 482/74/1601 487/25/1601 507/24/1601 +f 490/15/1602 497/53/1602 510/13/1602 +f 497/53/308 499/3/308 507/11/308 +f 510/13/1602 497/53/1602 507/11/1602 +f 496/77/309 499/75/309 497/89/309 +f 488/42/1603 490/53/1603 492/12/1603 +f 490/53/1604 510/47/1604 492/12/1604 +f 507/91/1605 500/3/1605 494/48/1605 +f 500/3/1606 493/40/1606 494/48/1606 +f 488/42/1607 492/12/1607 494/48/1607 +f 490/71/1608 488/88/1608 485/78/1608 +f 489/79/1609 493/7/1609 500/80/1609 +f 508/13/313 487/11/313 495/53/313 +f 487/11/1610 498/2/1610 496/3/1610 +f 496/3/1611 495/53/1611 487/11/1611 +f 491/2/1612 492/17/1612 510/87/1612 +f 486/84/315 508/68/315 510/67/315 +f 498/64/315 500/85/315 507/86/315 +f 487/87/316 508/82/316 510/74/316 +f 491/12/1613 508/47/1613 486/53/1613 +f 489/40/1614 498/3/1614 482/48/1614 +f 498/3/1615 487/91/1615 482/48/1615 +f 491/12/1616 486/53/1616 485/42/1616 +f 489/40/1617 482/48/1617 485/42/1617 +f 490/77/1618 486/75/1618 495/78/1618 +f 500/80/1619 499/76/1619 496/89/1619 +f 509/51/320 505/70/320 501/10/320 +f 507/41/1620 503/69/1620 519/52/1620 +f 506/15/322 513/53/322 516/13/322 +f 513/53/1621 517/3/1621 519/11/1621 +f 517/3/1622 518/2/1622 519/11/1622 +f 517/90/323 513/55/323 511/56/323 +f 504/42/1623 506/53/1623 508/12/1623 +f 506/53/1624 516/47/1624 508/12/1624 +f 519/91/1625 518/3/1625 510/48/1625 +f 518/3/1626 509/40/1626 510/48/1626 +f 504/42/1627 508/12/1627 510/48/1627 +f 506/57/1628 504/90/1628 501/54/1628 +f 505/22/1629 509/8/1629 518/59/1629 +f 503/11/1630 514/2/1630 512/3/1630 +f 512/3/1631 511/53/1631 503/11/1631 +f 511/53/327 502/15/327 515/13/327 +f 487/37/1632 508/38/1632 516/61/1632 +f 502/65/329 515/63/329 516/85/329 +f 503/66/329 514/86/329 518/67/329 +f 519/2/329 516/35/329 515/36/329 +f 487/12/1633 515/47/1633 502/53/1633 +f 505/40/1634 514/3/1634 507/48/1634 +f 514/3/1635 503/91/1635 507/48/1635 +f 487/12/1636 502/53/1636 501/42/1636 +f 505/40/1637 507/48/1637 501/42/1637 +f 513/70/1638 506/57/1638 502/58/1638 +f 514/60/332 518/59/332 517/55/332 +f 526/31/333 524/26/333 520/71/333 +f 522/25/1639 535/24/1639 503/73/1639 +f 525/15/1640 529/53/1640 532/13/1640 +f 529/53/1641 533/3/1641 532/13/1641 +f 533/3/335 534/2/335 535/11/335 +f 533/75/336 529/89/336 527/76/336 +f 523/42/1642 525/53/1642 519/12/1642 +f 525/53/1643 532/47/1643 519/12/1643 +f 535/91/1644 534/3/1644 503/48/1644 +f 534/3/1645 526/40/1645 503/48/1645 +f 523/42/337 519/12/337 503/48/337 +f 523/88/1646 520/78/1646 521/72/1646 +f 526/7/1647 534/80/1647 530/81/1647 +f 522/11/340 530/2/340 528/3/340 +f 528/3/1648 527/53/1648 531/13/1648 +f 527/53/1649 521/15/1649 531/13/1649 +f 519/17/1650 532/87/1650 531/82/1650 +f 521/84/342 531/68/342 532/67/342 +f 530/64/342 534/85/342 535/86/342 +f 522/87/343 531/82/343 532/74/343 +f 516/12/1651 531/47/1651 521/53/1651 +f 524/40/1652 530/3/1652 515/48/1652 +f 530/3/1653 522/91/1653 515/48/1653 +f 516/12/1654 521/53/1654 520/42/1654 +f 524/40/344 515/48/344 520/42/344 +f 525/77/322 521/75/322 527/78/322 +f 534/80/1655 533/76/1655 528/89/1655 +f 541/51/347 539/70/347 536/10/347 +f 535/41/1656 558/69/1656 549/52/1656 +f 540/15/1657 544/53/1657 546/13/1657 +f 544/53/1658 547/3/1658 546/13/1658 +f 546/13/349 547/3/349 549/11/349 +f 543/54/350 547/90/350 544/55/350 +f 538/42/1659 540/53/1659 531/12/1659 +f 540/53/1660 546/47/1660 531/12/1660 +f 549/91/1661 548/3/1661 532/48/1661 +f 548/3/1662 541/40/1662 532/48/1662 +f 538/42/351 531/12/351 541/40/351 +f 540/57/1663 538/90/1663 536/54/1663 +f 539/22/1664 541/8/1664 548/59/1664 +f 556/13/1665 558/11/1665 543/3/1665 +f 558/11/1665 545/2/1665 543/3/1665 +f 543/3/1666 542/53/1666 556/13/1666 +f 522/37/1667 531/38/1667 546/61/1667 +f 537/65/356 556/63/356 546/85/356 +f 545/86/356 548/67/356 549/68/356 +f 549/2/356 546/35/356 556/36/356 +f 522/12/1668 556/47/1668 537/53/1668 +f 539/40/1669 545/3/1669 535/48/1669 +f 545/3/1670 558/91/1670 535/48/1670 +f 522/12/1671 537/53/1671 536/42/1671 +f 539/40/357 535/48/357 522/12/357 +f 544/70/1672 540/57/1672 537/58/1672 +f 545/60/1673 548/59/1673 547/55/1673 +f 553/72/360 557/31/360 554/26/360 +f 552/25/1674 565/24/1674 558/73/1674 +f 555/15/1675 561/53/1675 573/13/1675 +f 561/53/1676 563/3/1676 573/13/1676 +f 563/3/362 564/2/362 565/11/362 +f 563/75/363 561/89/363 559/76/363 +f 553/42/1677 555/53/1677 549/12/1677 +f 555/53/1678 573/47/1678 549/12/1678 +f 565/91/1679 564/3/1679 558/48/1679 +f 564/3/1680 557/40/1680 558/48/1680 +f 553/42/1681 549/12/1681 557/40/1681 +f 553/88/1682 550/78/1682 551/72/1682 +f 557/7/1683 564/80/1683 562/81/1683 +f 571/13/1684 552/11/1684 560/3/1684 +f 552/11/1684 562/2/1684 560/3/1684 +f 560/3/1685 559/53/1685 571/13/1685 +f 549/17/1686 573/87/1686 571/82/1686 +f 571/68/369 573/67/369 555/83/369 +f 562/64/369 564/85/369 565/86/369 +f 552/87/370 571/82/370 573/74/370 +f 546/12/1687 571/47/1687 551/53/1687 +f 554/40/1688 562/3/1688 556/48/1688 +f 562/3/1689 552/91/1689 556/48/1689 +f 546/12/1690 551/53/1690 550/42/1690 +f 554/40/1691 556/48/1691 546/12/1691 +f 561/88/1692 555/77/1692 551/75/1692 +f 562/81/1693 564/80/1693 563/76/1693 +f 568/18/374 572/51/374 569/70/374 +f 565/41/1694 590/69/1694 582/52/1694 +f 570/15/1695 576/53/1695 579/13/1695 +f 576/53/1696 580/3/1696 579/13/1696 +f 579/13/376 580/3/376 582/11/376 +f 580/90/377 576/55/377 574/56/377 +f 568/42/1697 570/53/1697 571/12/1697 +f 570/53/1698 579/47/1698 571/12/1698 +f 582/91/1699 581/3/1699 573/48/1699 +f 581/3/1700 572/40/1700 573/48/1700 +f 568/42/1701 571/12/1701 572/40/1701 +f 570/57/1702 568/90/1702 566/54/1702 +f 569/22/1703 572/8/1703 581/59/1703 +f 578/13/1704 590/11/1704 575/3/1704 +f 590/11/1704 577/2/1704 575/3/1704 +f 575/3/1705 574/53/1705 578/13/1705 +f 552/37/1706 571/38/1706 579/61/1706 +f 578/63/383 579/85/383 570/64/383 +f 577/86/383 581/67/383 582/68/383 +f 582/2/383 579/35/383 578/36/383 +f 552/12/1707 578/47/1707 567/53/1707 +f 569/40/1708 577/3/1708 565/48/1708 +f 577/3/1709 590/91/1709 565/48/1709 +f 552/12/1710 567/53/1710 566/42/1710 +f 569/40/1711 565/48/1711 552/12/1711 +f 576/70/1712 570/57/1712 567/58/1712 +f 577/60/1713 581/59/1713 580/55/1713 +f 589/31/387 587/26/387 583/71/387 +f 585/25/1714 602/24/1714 590/73/1714 +f 588/15/1715 593/53/1715 605/13/1715 +f 593/53/1716 595/3/1716 605/13/1716 +f 595/3/389 596/2/389 602/11/389 +f 592/77/390 595/75/390 593/89/390 +f 586/42/1717 588/53/1717 582/12/1717 +f 588/53/1718 605/47/1718 582/12/1718 +f 602/91/1719 596/3/1719 590/48/1719 +f 596/3/1720 589/40/1720 590/48/1720 +f 586/42/1721 582/12/1721 589/40/1721 +f 586/88/1722 583/78/1722 584/72/1722 +f 589/7/1723 596/80/1723 594/81/1723 +f 603/13/1724 585/11/1724 592/3/1724 +f 585/11/1724 594/2/1724 592/3/1724 +f 592/3/1725 591/53/1725 603/13/1725 +f 582/17/1726 605/87/1726 603/82/1726 +f 603/68/396 605/67/396 588/83/396 +f 594/64/396 596/85/396 602/86/396 +f 585/87/397 603/82/397 605/74/397 +f 579/12/1727 603/47/1727 584/53/1727 +f 587/40/1728 594/3/1728 578/48/1728 +f 594/3/1729 585/91/1729 578/48/1729 +f 579/12/1730 584/53/1730 583/42/1730 +f 587/40/1731 578/48/1731 579/12/1731 +f 588/77/399 584/75/399 591/78/399 +f 596/80/1732 595/76/1732 592/89/1732 +f 599/18/401 604/51/401 600/70/401 +f 602/41/1733 622/69/1733 614/52/1733 +f 601/15/1734 608/53/1734 611/13/1734 +f 608/53/1735 612/3/1735 611/13/1735 +f 612/3/403 613/2/403 614/11/403 +f 607/54/404 612/90/404 608/55/404 +f 599/42/1736 601/53/1736 603/12/1736 +f 601/53/1737 611/47/1737 603/12/1737 +f 614/91/1738 613/3/1738 605/48/1738 +f 613/3/1739 604/40/1739 605/48/1739 +f 599/42/405 603/12/405 604/40/405 +f 601/57/1740 599/90/1740 597/54/1740 +f 600/22/1741 604/8/1741 613/59/1741 +f 622/11/408 609/2/408 607/3/408 +f 607/3/1742 606/53/1742 610/13/1742 +f 606/53/1743 598/15/1743 610/13/1743 +f 585/37/1744 603/38/1744 611/61/1744 +f 598/65/410 610/63/410 611/85/410 +f 609/86/410 613/67/410 614/68/410 +f 614/2/410 611/35/410 610/36/410 +f 585/12/1745 610/47/1745 598/53/1745 +f 600/40/1746 609/3/1746 602/48/1746 +f 609/3/1747 622/91/1747 602/48/1747 +f 585/12/1748 598/53/1748 597/42/1748 +f 600/40/411 602/48/411 585/12/411 +f 601/57/1749 598/58/1749 606/51/1749 +f 613/59/1750 612/55/1750 607/56/1750 +f 621/31/414 619/26/414 615/71/414 +f 610/74/1751 617/25/1751 631/24/1751 +f 620/15/416 625/53/416 628/13/416 +f 625/53/1752 629/3/1752 631/11/1752 +f 629/3/1753 630/2/1753 631/11/1753 +f 624/77/417 629/75/417 625/89/417 +f 618/42/1754 620/53/1754 614/12/1754 +f 620/53/1755 628/47/1755 614/12/1755 +f 631/91/1756 630/3/1756 622/48/1756 +f 630/3/1757 621/40/1757 622/48/1757 +f 618/42/1758 614/12/1758 621/40/1758 +f 620/71/1759 618/88/1759 615/78/1759 +f 619/79/1760 621/7/1760 630/80/1760 +f 617/11/1761 626/2/1761 624/3/1761 +f 624/3/1762 623/53/1762 617/11/1762 +f 623/53/421 616/15/421 627/13/421 +f 611/2/1763 614/17/1763 628/87/1763 +f 627/68/423 628/67/423 620/83/423 +f 617/66/423 626/64/423 630/85/423 +f 617/87/424 627/82/424 628/74/424 +f 611/12/1764 627/47/1764 616/53/1764 +f 619/40/1765 626/3/1765 610/48/1765 +f 626/3/1766 617/91/1766 610/48/1766 +f 611/12/1767 616/53/1767 615/42/1767 +f 619/40/1768 610/48/1768 611/12/1768 +f 620/77/1769 616/75/1769 623/78/1769 +f 630/80/1770 629/76/1770 624/89/1770 +f 638/51/428 636/70/428 632/10/428 +f 631/41/1771 634/69/1771 653/52/1771 +f 637/15/1772 641/53/1772 652/13/1772 +f 641/53/430 643/3/430 652/13/430 +f 652/13/430 643/3/430 653/11/430 +f 640/54/431 643/90/431 641/55/431 +f 635/42/1773 637/53/1773 627/12/1773 +f 637/53/1774 652/47/1774 627/12/1774 +f 653/91/1774 644/3/1774 628/48/1774 +f 644/3/1775 638/40/1775 628/48/1775 +f 635/42/1776 627/12/1776 628/48/1776 +f 637/57/1777 635/90/1777 632/54/1777 +f 636/22/1778 638/8/1778 644/59/1778 +f 634/11/435 642/2/435 640/3/435 +f 640/3/435 639/53/435 651/13/435 +f 639/53/1779 633/15/1779 651/13/1779 +f 617/37/1780 627/38/1780 652/61/1780 +f 651/63/437 652/85/437 637/64/437 +f 634/66/437 642/86/437 644/67/437 +f 653/2/437 652/35/437 651/36/437 +f 617/12/1781 651/47/1781 633/53/1781 +f 636/40/1782 642/3/1782 631/48/1782 +f 642/3/1783 634/91/1783 631/48/1783 +f 617/12/1784 633/53/1784 632/42/1784 +f 636/40/1785 631/48/1785 632/42/1785 +f 637/57/1786 633/58/1786 639/51/1786 +f 644/59/1787 643/55/1787 640/56/1787 +f 648/72/441 654/31/441 649/26/441 +f 651/74/1788 647/25/1788 668/24/1788 +f 650/15/443 657/53/443 670/13/443 +f 657/53/1789 660/3/1789 668/11/1789 +f 660/3/443 661/2/443 668/11/443 +f 656/77/444 660/75/444 657/89/444 +f 648/42/1790 650/53/1790 653/12/1790 +f 650/53/1791 670/47/1791 653/12/1791 +f 668/91/1791 661/3/1791 634/48/1791 +f 661/3/1792 654/40/1792 634/48/1792 +f 648/42/1793 653/12/1793 654/40/1793 +f 650/71/1794 648/88/1794 645/78/1794 +f 649/79/1795 654/7/1795 661/80/1795 +f 647/11/1796 658/2/1796 656/3/1796 +f 656/3/1797 655/53/1797 647/11/1797 +f 655/53/448 646/15/448 659/13/448 +f 652/2/1798 653/17/1798 670/87/1798 +f 659/68/450 670/67/450 650/83/450 +f 658/64/450 661/85/450 668/86/450 +f 647/87/451 659/82/451 670/74/451 +f 652/12/1799 659/47/1799 646/53/1799 +f 649/40/1800 658/3/1800 651/48/1800 +f 658/3/1799 647/91/1799 651/48/1799 +f 652/12/1801 646/53/1801 645/42/1801 +f 649/40/452 651/48/452 652/12/452 +f 657/88/453 650/77/453 646/75/453 +f 658/81/1802 661/80/1802 660/76/1802 +f 669/51/455 666/70/455 662/10/455 +f 664/69/1803 677/52/1803 670/49/1803 +f 667/15/457 673/53/457 685/13/457 +f 673/53/1804 675/3/1804 677/11/1804 +f 675/3/1804 676/2/1804 677/11/1804 +f 672/54/458 675/90/458 673/55/458 +f 665/42/1805 667/53/1805 659/12/1805 +f 667/53/1806 685/47/1806 659/12/1806 +f 677/91/1806 676/3/1806 670/48/1806 +f 676/3/1807 669/40/1807 670/48/1807 +f 665/42/459 659/12/459 670/48/459 +f 665/90/1808 662/54/1808 663/58/1808 +f 669/8/1809 676/59/1809 674/60/1809 +f 664/11/1810 674/2/1810 672/3/1810 +f 672/3/1810 671/53/1810 664/11/1810 +f 671/53/462 663/15/462 684/13/462 +f 659/38/1811 685/61/1811 684/62/1811 +f 663/65/464 684/63/464 685/85/464 +f 674/86/464 676/67/464 677/68/464 +f 677/2/464 685/35/464 684/36/464 +f 647/12/1812 684/47/1812 663/53/1812 +f 666/40/1813 674/3/1813 668/48/1813 +f 674/3/1814 664/91/1814 668/48/1814 +f 647/12/1815 663/53/1815 662/42/1815 +f 666/40/465 668/48/465 662/42/465 +f 667/57/466 663/58/466 671/51/466 +f 676/59/467 675/55/467 672/56/467 +f 681/72/468 686/31/468 682/26/468 +f 684/74/1816 680/25/1816 693/24/1816 +f 683/15/470 689/53/470 701/13/470 +f 689/53/470 691/3/470 693/11/470 +f 701/13/470 689/53/470 693/11/470 +f 691/75/471 689/89/471 687/76/471 +f 681/42/1817 683/53/1817 677/12/1817 +f 683/53/1818 701/47/1818 677/12/1818 +f 693/91/1819 692/3/1819 664/48/1819 +f 692/3/1820 686/40/1820 664/48/1820 +f 681/42/472 677/12/472 664/48/472 +f 683/71/1821 681/88/1821 678/78/1821 +f 682/79/1822 686/7/1822 692/80/1822 +f 680/11/475 690/2/475 688/3/475 +f 688/3/475 687/53/475 680/11/475 +f 687/53/475 679/15/475 699/13/475 +f 685/2/1823 677/17/1823 701/87/1823 +f 699/68/477 701/67/477 683/83/477 +f 680/66/477 690/64/477 692/85/477 +f 699/82/478 701/74/478 693/73/478 +f 685/12/1824 699/47/1824 679/53/1824 +f 682/40/1825 690/3/1825 684/48/1825 +f 690/3/1826 680/91/1826 684/48/1826 +f 685/12/1827 679/53/1827 678/42/1827 +f 682/40/479 684/48/479 678/42/479 +f 683/77/480 679/75/480 687/78/480 +f 692/80/481 691/76/481 688/89/481 +f 700/51/482 697/70/482 694/10/482 +f 693/41/1828 718/69/1828 709/52/1828 +f 698/15/1829 704/53/1829 706/13/1829 +f 704/53/1829 707/3/1829 706/13/1829 +f 706/13/484 707/3/484 709/11/484 +f 703/54/485 707/90/485 704/55/485 +f 696/42/1830 698/53/1830 699/12/1830 +f 698/53/1831 706/47/1831 699/12/1831 +f 709/91/1832 708/3/1832 701/48/1832 +f 708/3/1833 700/40/1833 701/48/1833 +f 696/42/486 699/12/486 701/48/486 +f 698/57/1834 696/90/1834 694/54/1834 +f 697/22/1835 700/8/1835 708/59/1835 +f 718/11/489 705/2/489 703/3/489 +f 703/3/1836 702/53/1836 716/13/1836 +f 702/53/1837 695/15/1837 716/13/1837 +f 680/37/1838 699/38/1838 706/61/1838 +f 695/65/491 716/63/491 706/85/491 +f 718/66/491 705/86/491 708/67/491 +f 709/2/491 706/35/491 716/36/491 +f 680/12/1839 716/47/1839 695/53/1839 +f 697/40/1840 705/3/1840 693/48/1840 +f 705/3/1841 718/91/1841 693/48/1841 +f 680/12/1842 695/53/1842 694/42/1842 +f 697/40/492 693/48/492 694/42/492 +f 704/70/1843 698/57/1843 695/58/1843 +f 705/60/1844 708/59/1844 707/55/1844 +f 717/31/495 714/26/495 710/71/495 +f 712/25/1845 733/24/1845 718/73/1845 +f 715/15/1846 721/53/1846 724/13/1846 +f 721/53/1847 725/3/1847 724/13/1847 +f 725/3/497 726/2/497 733/11/497 +f 720/77/498 725/75/498 721/89/498 +f 713/42/1848 715/53/1848 709/12/1848 +f 715/53/1849 724/47/1849 709/12/1849 +f 733/91/1850 726/3/1850 718/48/1850 +f 726/3/1851 717/40/1851 718/48/1851 +f 713/42/499 709/12/499 718/48/499 +f 713/88/1852 710/78/1852 711/72/1852 +f 717/7/1853 726/80/1853 722/81/1853 +f 723/13/1854 712/11/1854 720/3/1854 +f 712/11/1854 722/2/1854 720/3/1854 +f 720/3/1855 719/53/1855 723/13/1855 +f 709/17/1856 724/87/1856 723/82/1856 +f 723/68/504 724/67/504 715/83/504 +f 722/64/504 726/85/504 733/86/504 +f 712/87/505 723/82/505 724/74/505 +f 706/12/1857 723/47/1857 711/53/1857 +f 714/40/1858 722/3/1858 716/48/1858 +f 722/3/1859 712/91/1859 716/48/1859 +f 706/12/1860 711/53/1860 710/42/1860 +f 714/40/506 716/48/506 710/42/506 +f 715/77/1861 711/75/1861 719/78/1861 +f 726/80/1862 725/76/1862 720/89/1862 +f 734/51/509 731/70/509 727/10/509 +f 729/69/1863 748/52/1863 724/49/1863 +f 732/15/511 737/53/511 740/13/511 +f 737/53/511 741/3/511 748/11/511 +f 741/3/1864 742/2/1864 748/11/1864 +f 741/90/512 737/55/512 735/56/512 +f 730/42/1865 732/53/1865 723/12/1865 +f 732/53/1866 740/47/1866 723/12/1866 +f 748/91/1867 742/3/1867 724/48/1867 +f 742/3/1868 734/40/1868 724/48/1868 +f 730/42/1869 723/12/1869 734/40/1869 +f 730/90/1870 727/54/1870 728/58/1870 +f 734/8/1871 742/59/1871 738/60/1871 +f 729/11/1872 738/2/1872 736/3/1872 +f 736/3/516 735/53/516 729/11/516 +f 735/53/516 728/15/516 739/13/516 +f 723/38/1873 740/61/1873 739/62/1873 +f 728/65/518 739/63/518 740/85/518 +f 738/86/518 742/67/518 748/68/518 +f 729/17/519 748/2/519 740/35/519 +f 712/12/1874 739/47/1874 728/53/1874 +f 731/40/1875 738/3/1875 733/48/1875 +f 738/3/1876 729/91/1876 733/48/1876 +f 712/12/1877 728/53/1877 727/42/1877 +f 731/40/1878 733/48/1878 712/12/1878 +f 737/70/521 732/57/521 728/58/521 +f 738/60/522 742/59/522 741/55/522 +f 749/31/523 746/26/523 743/71/523 +f 765/25/1879 764/24/1879 729/73/1879 +f 747/15/1880 752/53/1880 755/13/1880 +f 752/53/1881 756/3/1881 755/13/1881 +f 756/3/525 757/2/525 764/11/525 +f 751/77/526 756/75/526 752/89/526 +f 745/42/1882 747/53/1882 748/12/1882 +f 747/53/1883 755/47/1883 748/12/1883 +f 764/91/1884 757/3/1884 729/48/1884 +f 757/3/1885 749/40/1885 729/48/1885 +f 745/42/1886 748/12/1886 749/40/1886 +f 745/88/1887 743/78/1887 744/72/1887 +f 749/7/1888 757/80/1888 753/81/1888 +f 754/13/1889 765/11/1889 751/3/1889 +f 765/11/1889 753/2/1889 751/3/1889 +f 751/3/1890 750/53/1890 754/13/1890 +f 748/17/1891 755/87/1891 754/82/1891 +f 744/84/532 754/68/532 755/67/532 +f 765/66/532 753/64/532 757/85/532 +f 765/87/533 754/82/533 755/74/533 +f 740/12/1892 754/47/1892 744/53/1892 +f 746/40/1893 753/3/1893 739/48/1893 +f 753/3/1894 765/91/1894 739/48/1894 +f 740/12/1895 744/53/1895 743/42/1895 +f 746/40/1896 739/48/1896 740/12/1896 +f 747/77/1897 744/75/1897 750/78/1897 +f 757/80/1898 756/76/1898 751/89/1898 +f 766/51/537 762/70/537 758/10/537 +f 764/41/1899 760/69/1899 780/52/1899 +f 763/15/1900 769/53/1900 779/13/1900 +f 769/53/1901 772/3/1901 779/13/1901 +f 772/3/539 773/2/539 780/11/539 +f 772/90/540 769/55/540 767/56/540 +f 761/42/1902 763/53/1902 754/12/1902 +f 763/53/1903 779/47/1903 754/12/1903 +f 780/91/1904 773/3/1904 755/48/1904 +f 773/3/1905 766/40/1905 755/48/1905 +f 761/42/1906 754/12/1906 766/40/1906 +f 763/57/1907 761/90/1907 758/54/1907 +f 762/22/1908 766/8/1908 773/59/1908 +f 760/11/544 770/2/544 768/3/544 +f 768/3/1909 767/53/1909 771/13/1909 +f 767/53/1910 759/15/1910 771/13/1910 +f 765/37/1911 754/38/1911 779/61/1911 +f 759/65/1912 771/63/1912 779/85/1912 +f 770/86/546 773/67/546 780/68/546 +f 760/17/546 780/2/546 779/35/546 +f 765/12/1913 771/47/1913 759/53/1913 +f 762/40/1914 770/3/1914 764/48/1914 +f 770/3/1915 760/91/1915 764/48/1915 +f 765/12/1916 759/53/1916 758/42/1916 +f 762/40/1917 764/48/1917 765/12/1917 +f 769/70/1918 763/57/1918 759/58/1918 +f 770/60/1919 773/59/1919 772/55/1919 +f 776/72/550 781/31/550 777/26/550 +f 771/74/1920 795/25/1920 789/24/1920 +f 778/15/552 784/53/552 786/13/552 +f 784/53/552 787/3/552 789/11/552 +f 786/13/552 784/53/552 789/11/552 +f 783/77/553 787/75/553 784/89/553 +f 776/42/1921 778/53/1921 780/12/1921 +f 778/53/1922 786/47/1922 780/12/1922 +f 789/91/1923 788/3/1923 760/48/1923 +f 788/3/1924 781/40/1924 760/48/1924 +f 776/42/1925 780/12/1925 781/40/1925 +f 778/71/1926 776/88/1926 774/78/1926 +f 777/79/1927 781/7/1927 788/80/1927 +f 796/13/557 795/11/557 782/53/557 +f 795/11/557 785/2/557 783/3/557 +f 783/3/557 782/53/557 795/11/557 +f 779/2/1928 780/17/1928 786/87/1928 +f 775/84/559 796/68/559 786/67/559 +f 795/66/559 785/64/559 788/85/559 +f 795/87/560 796/82/560 786/74/560 +f 779/12/1929 796/47/1929 775/53/1929 +f 777/40/1930 785/3/1930 771/48/1930 +f 785/3/1931 795/91/1931 771/48/1931 +f 779/12/1932 775/53/1932 774/42/1932 +f 777/40/1933 771/48/1933 779/12/1933 +f 784/88/1934 778/77/1934 775/75/1934 +f 785/81/1935 788/80/1935 787/76/1935 +f 797/51/564 793/70/564 790/10/564 +f 789/41/1936 814/69/1936 805/52/1936 +f 794/15/1937 800/53/1937 802/13/1937 +f 800/53/1938 803/3/1938 802/13/1938 +f 802/13/566 803/3/566 805/11/566 +f 799/54/567 803/90/567 800/55/567 +f 792/42/1939 794/53/1939 796/12/1939 +f 794/53/1940 802/47/1940 796/12/1940 +f 805/91/1941 804/3/1941 786/48/1941 +f 804/3/1942 797/40/1942 786/48/1942 +f 792/42/1943 796/12/1943 797/40/1943 +f 794/57/1944 792/90/1944 790/54/1944 +f 797/8/1945 804/59/1945 801/60/1945 +f 814/11/571 801/2/571 799/3/571 +f 799/3/1946 798/53/1946 812/13/1946 +f 798/53/1947 791/15/1947 812/13/1947 +f 795/37/1948 796/38/1948 802/61/1948 +f 812/63/573 802/85/573 794/64/573 +f 801/86/573 804/67/573 805/68/573 +f 805/2/573 802/35/573 812/36/573 +f 795/12/1949 812/47/1949 791/53/1949 +f 793/40/1950 801/3/1950 789/48/1950 +f 801/3/1951 814/91/1951 789/48/1951 +f 795/12/1952 791/53/1952 790/42/1952 +f 793/40/1953 789/48/1953 795/12/1953 +f 800/70/1954 794/57/1954 791/58/1954 +f 801/60/1955 804/59/1955 803/55/1955 +f 813/31/577 810/26/577 806/71/577 +f 808/25/1956 822/24/1956 814/73/1956 +f 811/15/1957 817/53/1957 830/13/1957 +f 817/53/1958 820/3/1958 830/13/1958 +f 830/13/579 820/3/579 822/11/579 +f 820/75/580 817/89/580 815/76/580 +f 809/42/1959 811/53/1959 805/12/1959 +f 811/53/1960 830/47/1960 805/12/1960 +f 822/91/1961 821/3/1961 814/48/1961 +f 821/3/1962 813/40/1962 814/48/1962 +f 809/42/1963 805/12/1963 814/48/1963 +f 809/88/1964 806/78/1964 807/72/1964 +f 813/7/1965 821/80/1965 818/81/1965 +f 808/11/584 818/2/584 816/3/584 +f 816/3/1966 815/53/1966 819/13/1966 +f 815/53/1967 807/15/1967 819/13/1967 +f 805/17/1968 830/87/1968 819/82/1968 +f 819/68/586 830/67/586 811/83/586 +f 808/66/586 818/64/586 821/85/586 +f 819/82/587 830/74/587 822/73/587 +f 802/12/1969 819/47/1969 807/53/1969 +f 810/40/1970 818/3/1970 812/48/1970 +f 818/3/1971 808/91/1971 812/48/1971 +f 802/12/1972 807/53/1972 806/42/1972 +f 810/40/1973 812/48/1973 806/42/1973 +f 811/77/1974 807/75/1974 815/78/1974 +f 821/80/1975 820/76/1975 816/89/1975 +f 826/18/591 829/51/591 827/70/591 +f 822/41/1976 825/69/1976 838/52/1976 +f 828/15/1977 833/53/1977 835/13/1977 +f 833/53/1978 836/3/1978 835/13/1978 +f 836/3/593 837/2/593 838/11/593 +f 836/90/594 833/55/594 831/56/594 +f 826/42/1979 828/53/1979 819/12/1979 +f 828/53/1980 835/47/1980 819/12/1980 +f 838/91/1981 837/3/1981 830/48/1981 +f 837/3/1982 829/40/1982 830/48/1982 +f 826/42/1983 819/12/1983 829/40/1983 +f 828/57/1984 826/90/1984 823/54/1984 +f 827/22/1985 829/8/1985 837/59/1985 +f 845/13/1986 825/11/1986 832/3/1986 +f 825/11/1986 834/2/1986 832/3/1986 +f 832/3/1987 831/53/1987 845/13/1987 +f 808/37/1988 819/38/1988 835/61/1988 +f 845/63/600 835/85/600 828/64/600 +f 834/86/600 837/67/600 838/68/600 +f 838/2/600 835/35/600 845/36/600 +f 808/12/1989 845/47/1989 824/53/1989 +f 827/40/1990 834/3/1990 822/48/1990 +f 834/3/1991 825/91/1991 822/48/1991 +f 808/12/1992 824/53/1992 823/42/1992 +f 827/40/1993 822/48/1993 808/12/1993 +f 828/57/1994 824/58/1994 831/51/1994 +f 837/59/1995 836/55/1995 832/56/1995 +f 846/31/604 843/26/604 839/71/604 +f 845/74/1996 841/25/1996 855/24/1996 +f 844/15/606 849/53/606 852/13/606 +f 849/53/606 853/3/606 855/11/606 +f 853/3/606 854/2/606 855/11/606 +f 853/75/607 849/89/607 847/76/607 +f 842/42/1997 844/53/1997 838/12/1997 +f 844/53/1998 852/47/1998 838/12/1998 +f 855/91/1999 854/3/1999 825/48/1999 +f 854/3/2000 846/40/2000 825/48/2000 +f 842/42/2001 838/12/2001 846/40/2001 +f 844/71/2002 842/88/2002 839/78/2002 +f 843/79/2003 846/7/2003 854/80/2003 +f 851/13/611 841/11/611 847/53/611 +f 841/11/611 850/2/611 848/3/611 +f 848/3/611 847/53/611 841/11/611 +f 835/2/2004 838/17/2004 852/87/2004 +f 840/84/607 851/68/607 852/67/607 +f 841/66/607 850/64/607 854/85/607 +f 851/82/613 852/74/613 855/73/613 +f 835/12/2005 851/47/2005 840/53/2005 +f 843/40/2006 850/3/2006 845/48/2006 +f 850/3/2007 841/91/2007 845/48/2007 +f 835/12/2008 840/53/2008 839/42/2008 +f 843/40/2009 845/48/2009 835/12/2009 +f 844/77/615 840/75/615 847/78/615 +f 854/80/616 853/76/616 848/89/616 +f 856/10/617 860/70/617 865/51/617 +f 862/41/618 866/49/618 880/52/618 +f 872/3/619 869/53/619 880/11/619 +f 869/53/619 861/15/619 871/13/619 +f 871/13/619 880/11/619 869/53/619 +f 868/54/620 867/56/620 869/55/620 +f 865/40/619 873/3/619 866/48/619 +f 873/3/619 880/91/619 866/48/619 +f 871/47/619 861/53/619 864/12/619 +f 861/53/619 859/42/619 864/12/619 +f 865/40/619 866/48/619 864/12/619 +f 861/57/618 857/58/618 856/54/618 +f 860/22/621 870/60/621 873/59/621 +f 858/11/622 879/13/622 867/53/622 +f 879/13/622 857/15/622 867/53/622 +f 867/53/622 868/3/622 858/11/622 +f 863/37/621 879/62/621 871/61/621 +f 861/64/623 871/85/623 879/63/623 +f 880/68/623 873/67/623 870/86/623 +f 858/17/623 879/36/623 871/35/623 +f 857/53/622 879/47/622 863/12/622 +f 862/48/622 858/91/622 870/3/622 +f 856/42/622 857/53/622 863/12/622 +f 862/48/622 870/3/622 860/40/622 +f 856/42/622 863/12/622 860/40/622 +f 863/69/623 864/52/623 866/62/623 +f 869/70/624 867/51/624 857/58/624 +f 870/60/625 868/56/625 872/55/625 +f 876/72/617 874/71/617 877/26/617 +f 858/73/2010 889/24/2010 895/25/2010 +f 887/3/627 884/53/627 897/13/627 +f 884/53/627 878/15/627 897/13/627 +f 887/3/627 897/13/627 889/11/627 +f 883/77/628 882/76/628 884/89/628 +f 881/40/2011 888/3/2011 858/48/2011 +f 888/3/2012 889/91/2012 858/48/2012 +f 897/47/2012 878/53/2012 880/12/2012 +f 878/53/2013 876/42/2013 880/12/2013 +f 881/40/621 858/48/621 880/12/621 +f 878/71/629 875/72/629 874/78/629 +f 877/79/630 885/81/630 888/80/630 +f 895/11/631 886/13/631 883/3/631 +f 886/13/631 875/15/631 882/53/631 +f 882/53/631 883/3/631 886/13/631 +f 886/82/2014 897/87/2014 880/17/2014 +f 878/83/633 897/67/633 886/68/633 +f 895/66/633 889/86/633 888/85/633 +f 889/73/634 897/74/634 886/82/634 +f 875/53/2015 886/47/2015 871/12/2015 +f 879/48/2016 895/91/2016 885/3/2016 +f 874/42/2017 875/53/2017 871/12/2017 +f 879/48/2018 885/3/2018 877/40/2018 +f 874/42/618 871/12/618 877/40/618 +f 882/78/635 875/75/635 878/77/635 +f 883/89/636 887/76/636 888/80/636 +f 890/10/637 893/70/637 896/51/637 +f 889/41/2019 897/49/2019 912/52/2019 +f 903/3/639 900/53/639 911/13/639 +f 900/53/639 894/15/639 911/13/639 +f 903/3/639 911/13/639 912/11/639 +f 898/56/640 900/55/640 903/90/640 +f 896/40/2020 904/3/2020 897/48/2020 +f 904/3/2021 912/91/2021 897/48/2021 +f 911/47/2021 894/53/2021 886/12/2021 +f 894/53/2022 892/42/2022 886/12/2022 +f 896/40/641 897/48/641 892/42/641 +f 894/57/2023 891/58/2023 890/54/2023 +f 893/22/2024 901/60/2024 904/59/2024 +f 914/11/644 902/13/644 899/3/644 +f 902/13/644 891/15/644 898/53/644 +f 898/53/644 899/3/644 902/13/644 +f 895/37/2025 902/62/2025 911/61/2025 +f 891/65/646 894/64/646 911/85/646 +f 914/66/646 912/68/646 904/67/646 +f 902/36/646 911/35/646 912/2/646 +f 891/53/2026 902/47/2026 895/12/2026 +f 889/48/2026 914/91/2026 901/3/2026 +f 890/42/2027 891/53/2027 895/12/2027 +f 889/48/2028 901/3/2028 893/40/2028 +f 890/42/647 895/12/647 889/48/647 +f 898/51/648 891/58/648 894/57/648 +f 899/56/649 903/55/649 904/59/649 +f 908/72/2029 905/71/2029 909/26/2029 +f 902/74/2030 914/73/2030 922/24/2030 +f 920/3/2031 917/53/2031 922/11/2031 +f 917/53/2032 910/15/2032 929/13/2032 +f 929/13/2032 922/11/2032 917/53/2032 +f 915/76/653 917/89/653 920/75/653 +f 913/40/2033 921/3/2033 914/48/2033 +f 921/3/2034 922/91/2034 914/48/2034 +f 929/47/2035 910/53/2035 912/12/2035 +f 910/53/2036 908/42/2036 912/12/2036 +f 913/40/654 914/48/654 912/12/654 +f 910/71/2037 906/72/2037 905/78/2037 +f 909/79/2038 918/81/2038 921/80/2038 +f 907/11/2039 919/13/2039 915/53/2039 +f 919/13/2039 906/15/2039 915/53/2039 +f 915/53/2040 916/3/2040 907/11/2040 +f 911/2/2041 919/82/2041 929/87/2041 +f 910/83/659 929/67/659 919/68/659 +f 907/66/659 922/86/659 921/85/659 +f 922/73/660 929/74/660 919/82/660 +f 906/53/2042 919/47/2042 911/12/2042 +f 902/48/2043 907/91/2043 918/3/2043 +f 905/42/2044 906/53/2044 911/12/2044 +f 902/48/2045 918/3/2045 909/40/2045 +f 905/42/661 911/12/661 909/40/661 +f 915/78/2046 906/75/2046 910/77/2046 +f 916/89/2047 920/76/2047 921/80/2047 +f 923/10/2048 926/70/2048 928/51/2048 +f 922/41/2049 929/49/2049 943/52/2049 +f 935/3/2050 932/53/2050 934/13/2050 +f 932/53/2051 927/15/2051 934/13/2051 +f 935/3/666 934/13/666 943/11/666 +f 931/54/667 930/56/667 932/55/667 +f 928/40/2052 936/3/2052 929/48/2052 +f 936/3/2053 943/91/2053 929/48/2053 +f 934/47/2054 927/53/2054 919/12/2054 +f 927/53/2055 925/42/2055 919/12/2055 +f 928/40/2056 929/48/2056 925/42/2056 +f 927/57/2057 924/58/2057 923/54/2057 +f 926/22/2058 933/60/2058 936/59/2058 +f 933/2/2059 945/11/2059 931/3/2059 +f 945/11/2059 942/13/2059 931/3/2059 +f 942/13/2060 924/15/2060 930/53/2060 +f 907/37/2061 942/62/2061 934/61/2061 +f 927/64/673 934/85/673 942/63/673 +f 943/68/673 936/67/673 933/86/673 +f 945/17/673 942/36/673 934/35/673 +f 924/53/2062 942/47/2062 907/12/2062 +f 922/48/2063 945/91/2063 933/3/2063 +f 923/42/2064 924/53/2064 907/12/2064 +f 922/48/2065 933/3/2065 926/40/2065 +f 923/42/2066 907/12/2066 922/48/2066 +f 932/70/2067 930/51/2067 924/58/2067 +f 933/60/2068 931/56/2068 935/55/2068 +f 937/71/677 940/26/677 944/31/677 +f 945/73/2069 953/24/2069 959/25/2069 +f 951/3/2070 948/53/2070 961/13/2070 +f 948/53/2071 941/15/2071 961/13/2071 +f 951/3/679 961/13/679 953/11/679 +f 947/77/680 946/76/680 948/89/680 +f 944/40/2072 952/3/2072 945/48/2072 +f 952/3/2073 953/91/2073 945/48/2073 +f 961/47/2074 941/53/2074 943/12/2074 +f 941/53/2075 939/42/2075 943/12/2075 +f 944/40/2076 945/48/2076 943/12/2076 +f 938/72/2077 937/78/2077 939/88/2077 +f 949/81/2078 952/80/2078 944/7/2078 +f 959/11/684 950/13/684 947/3/684 +f 950/13/2079 938/15/2079 946/53/2079 +f 946/53/2080 947/3/2080 950/13/2080 +f 950/82/2081 961/87/2081 943/17/2081 +f 938/84/686 941/83/686 961/67/686 +f 953/86/686 952/85/686 949/64/686 +f 959/87/687 953/73/687 961/74/687 +f 938/53/2082 950/47/2082 934/12/2082 +f 942/48/2083 959/91/2083 949/3/2083 +f 937/42/2084 938/53/2084 934/12/2084 +f 942/48/2085 949/3/2085 940/40/2085 +f 937/42/2086 934/12/2086 940/40/2086 +f 948/88/2087 946/78/2087 938/75/2087 +f 949/81/2088 947/89/2088 951/76/2088 +f 956/18/691 954/10/691 957/70/691 +f 961/49/692 968/52/692 977/69/692 +f 966/3/2089 964/53/2089 975/13/2089 +f 964/53/2090 958/15/2090 975/13/2090 +f 975/13/693 968/11/693 966/3/693 +f 962/56/694 964/55/694 966/90/694 +f 960/40/2091 967/3/2091 961/48/2091 +f 967/3/2092 968/91/2092 961/48/2092 +f 975/47/2093 958/53/2093 950/12/2093 +f 958/53/2094 956/42/2094 950/12/2094 +f 960/40/2095 961/48/2095 950/12/2095 +f 958/57/2096 955/58/2096 954/54/2096 +f 965/60/2097 967/59/2097 960/8/2097 +f 965/2/2098 977/11/2098 963/3/2098 +f 977/11/2098 974/13/2098 963/3/2098 +f 974/13/2099 955/15/2099 962/53/2099 +f 959/37/2100 974/62/2100 975/61/2100 +f 955/65/700 958/64/700 975/85/700 +f 968/68/700 967/67/700 965/86/700 +f 977/17/700 974/36/700 975/35/700 +f 955/53/2101 974/47/2101 959/12/2101 +f 953/48/2102 977/91/2102 965/3/2102 +f 954/42/2103 955/53/2103 959/12/2103 +f 953/48/2104 965/3/2104 957/40/2104 +f 954/42/2105 959/12/2105 957/40/2105 +f 962/51/2106 955/58/2106 958/57/2106 +f 963/56/2107 966/55/2107 967/59/2107 +f 971/72/704 969/71/704 972/26/704 +f 974/74/2108 977/73/2108 991/24/2108 +f 984/3/2109 980/53/2109 983/13/2109 +f 980/53/2109 973/15/2109 983/13/2109 +f 984/3/706 983/13/706 991/11/706 +f 978/76/707 980/89/707 984/75/707 +f 976/40/2110 985/3/2110 977/48/2110 +f 985/3/2111 991/91/2111 977/48/2111 +f 983/47/2112 973/53/2112 968/12/2112 +f 973/53/2113 971/42/2113 968/12/2113 +f 976/40/2114 977/48/2114 968/12/2114 +f 973/71/2115 970/72/2115 969/78/2115 +f 972/79/2116 981/81/2116 985/80/2116 +f 992/11/711 982/13/711 979/3/711 +f 982/13/711 970/15/711 978/53/711 +f 978/53/711 979/3/711 982/13/711 +f 975/2/2117 982/82/2117 983/87/2117 +f 970/84/713 973/83/713 983/67/713 +f 991/86/713 985/85/713 981/64/713 +f 991/73/714 983/74/714 982/82/714 +f 970/53/2118 982/47/2118 975/12/2118 +f 974/48/2119 992/91/2119 981/3/2119 +f 969/42/2120 970/53/2120 975/12/2120 +f 974/48/2121 981/3/2121 972/40/2121 +f 969/42/2122 975/12/2122 972/40/2122 +f 980/88/716 978/78/716 970/75/716 +f 981/81/717 979/89/717 984/76/717 +f 988/18/718 986/10/718 989/70/718 +f 983/49/2123 1001/52/2123 1010/69/2123 +f 999/3/2124 996/53/2124 1001/11/2124 +f 996/53/2125 990/15/2125 998/13/2125 +f 1001/11/2125 996/53/2125 998/13/2125 +f 994/56/721 996/55/721 999/90/721 +f 993/40/2126 1000/3/2126 983/48/2126 +f 1000/3/2127 1001/91/2127 983/48/2127 +f 998/47/2128 990/53/2128 982/12/2128 +f 990/53/2129 988/42/2129 982/12/2129 +f 993/40/2130 983/48/2130 982/12/2130 +f 987/58/2131 986/54/2131 988/90/2131 +f 997/60/2132 1000/59/2132 993/8/2132 +f 1010/11/2133 1008/13/2133 994/53/2133 +f 1008/13/2133 987/15/2133 994/53/2133 +f 994/53/2134 995/3/2134 1010/11/2134 +f 1008/62/2135 998/61/2135 982/38/2135 +f 990/64/727 998/85/727 1008/63/727 +f 1010/66/727 1001/68/727 1000/67/727 +f 1010/17/727 1008/36/727 998/35/727 +f 987/53/2136 1008/47/2136 992/12/2136 +f 991/48/2137 1010/91/2137 997/3/2137 +f 986/42/2138 987/53/2138 992/12/2138 +f 991/48/2139 997/3/2139 989/40/2139 +f 986/42/2140 992/12/2140 989/40/2140 +f 996/70/2141 994/51/2141 987/58/2141 +f 997/60/2142 995/56/2142 999/55/2142 +f 1005/72/731 1002/71/731 1006/26/731 +f 1010/73/2143 1024/24/2143 1004/25/2143 +f 1017/3/733 1013/53/733 1016/13/733 +f 1013/53/733 1007/15/733 1016/13/733 +f 1017/3/733 1016/13/733 1024/11/733 +f 1011/76/734 1013/89/734 1017/75/734 +f 1009/40/2144 1018/3/2144 1010/48/2144 +f 1018/3/2145 1024/91/2145 1010/48/2145 +f 1016/47/2146 1007/53/2146 1001/12/2146 +f 1007/53/2147 1005/42/2147 1001/12/2147 +f 1009/40/735 1010/48/735 1005/42/735 +f 1003/72/2148 1002/78/2148 1005/88/2148 +f 1014/81/2149 1018/80/2149 1009/7/2149 +f 1004/11/738 1015/13/738 1012/3/738 +f 1015/13/738 1003/15/738 1011/53/738 +f 1011/53/738 1012/3/738 1015/13/738 +f 1015/82/2150 1016/87/2150 1001/17/2150 +f 1003/84/740 1007/83/740 1016/67/740 +f 1004/66/740 1024/86/740 1018/85/740 +f 1024/73/741 1016/74/741 1015/82/741 +f 1003/53/2151 1015/47/2151 998/12/2151 +f 1008/48/2152 1004/91/2152 1014/3/2152 +f 1002/42/2153 1003/53/2153 998/12/2153 +f 1008/48/2154 1014/3/2154 1006/40/2154 +f 1002/42/742 998/12/742 1008/48/742 +f 1013/88/743 1011/78/743 1003/75/743 +f 1014/81/744 1012/89/744 1017/76/744 +f 1019/10/745 1022/70/745 1025/51/745 +f 1016/49/746 1033/52/746 1041/69/746 +f 1031/3/747 1028/53/747 1033/11/747 +f 1028/53/747 1023/15/747 1030/13/747 +f 1033/11/747 1028/53/747 1030/13/747 +f 1026/56/748 1028/55/748 1031/90/748 +f 1025/40/2155 1032/3/2155 1016/48/2155 +f 1032/3/2156 1033/91/2156 1016/48/2156 +f 1030/47/2156 1023/53/2156 1015/12/2156 +f 1023/53/2157 1021/42/2157 1015/12/2157 +f 1025/40/749 1016/48/749 1015/12/749 +f 1020/58/750 1019/54/750 1021/90/750 +f 1029/60/751 1032/59/751 1025/8/751 +f 1029/2/752 1041/11/752 1027/3/752 +f 1041/11/752 1039/13/752 1026/53/752 +f 1027/3/752 1041/11/752 1026/53/752 +f 1039/62/753 1030/61/753 1015/38/753 +f 1020/65/754 1023/64/754 1030/85/754 +f 1033/68/754 1032/67/754 1029/86/754 +f 1041/17/754 1039/36/754 1030/35/754 +f 1020/53/2158 1039/47/2158 1004/12/2158 +f 1024/48/2158 1041/91/2158 1029/3/2158 +f 1019/42/2159 1020/53/2159 1004/12/2159 +f 1024/48/2160 1029/3/2160 1022/40/2160 +f 1019/42/755 1004/12/755 1022/40/755 +f 1026/51/756 1020/58/756 1023/57/756 +f 1027/56/757 1031/55/757 1032/59/757 +f 1034/71/758 1037/26/758 1040/31/758 +f 1041/73/759 1054/24/759 1055/25/759 +f 1047/3/760 1044/53/760 1057/13/760 +f 1044/53/760 1038/15/760 1057/13/760 +f 1054/11/760 1048/2/760 1047/3/760 +f 1042/76/761 1044/89/761 1047/75/761 +f 1040/40/2161 1048/3/2161 1041/48/2161 +f 1048/3/2162 1054/91/2162 1041/48/2162 +f 1057/47/2162 1038/53/2162 1033/12/2162 +f 1038/53/2163 1036/42/2163 1033/12/2163 +f 1040/40/762 1041/48/762 1036/42/762 +f 1038/71/747 1035/72/747 1034/78/747 +f 1037/79/752 1045/81/752 1048/80/752 +f 1055/11/763 1046/13/763 1043/3/763 +f 1046/13/763 1035/15/763 1042/53/763 +f 1042/53/763 1043/3/763 1046/13/763 +f 1046/82/764 1057/87/764 1033/17/764 +f 1035/84/765 1038/83/765 1057/67/765 +f 1055/66/765 1054/86/765 1048/85/765 +f 1054/73/766 1057/74/766 1046/82/766 +f 1035/53/2164 1046/47/2164 1030/12/2164 +f 1039/48/2164 1055/91/2164 1045/3/2164 +f 1034/42/2165 1035/53/2165 1030/12/2165 +f 1039/48/2166 1045/3/2166 1037/40/2166 +f 1034/42/767 1030/12/767 1039/48/767 +f 1042/78/768 1035/75/768 1038/77/768 +f 1043/89/769 1047/76/769 1048/80/769 +f 1051/18/770 1049/10/770 1052/70/770 +f 1057/49/2167 1071/52/2167 1073/69/2167 +f 1063/3/772 1060/53/772 1071/11/772 +f 1060/53/772 1053/15/772 1062/13/772 +f 1062/13/772 1071/11/772 1060/53/772 +f 1058/56/773 1060/55/773 1063/90/773 +f 1056/40/2168 1064/3/2168 1057/48/2168 +f 1064/3/2169 1071/91/2169 1057/48/2169 +f 1062/47/2169 1053/53/2169 1046/12/2169 +f 1053/53/2170 1051/42/2170 1046/12/2170 +f 1056/40/747 1057/48/747 1051/42/747 +f 1050/58/774 1049/54/774 1051/90/774 +f 1061/60/2171 1064/59/2171 1056/8/2171 +f 1061/2/2172 1073/11/2172 1059/3/2172 +f 1073/11/776 1070/13/776 1058/53/776 +f 1059/3/776 1073/11/776 1058/53/776 +f 1070/62/2173 1062/61/2173 1046/38/2173 +f 1050/65/778 1053/64/778 1062/85/778 +f 1071/68/778 1064/67/778 1061/86/778 +f 1073/17/778 1070/36/778 1062/35/778 +f 1050/53/2174 1070/47/2174 1055/12/2174 +f 1054/48/2175 1073/91/2175 1061/3/2175 +f 1049/42/2176 1050/53/2176 1055/12/2176 +f 1054/48/2177 1061/3/2177 1052/40/2177 +f 1049/42/752 1055/12/752 1054/48/752 +f 1058/51/2178 1050/58/2178 1053/57/2178 +f 1059/56/2179 1063/55/2179 1064/59/2179 +f 1067/72/781 1065/71/781 1068/26/781 +f 1070/74/2180 1073/73/2180 1087/24/2180 +f 1080/3/783 1076/53/783 1087/11/783 +f 1076/53/2181 1069/15/2181 1079/13/2181 +f 1087/11/2181 1076/53/2181 1079/13/2181 +f 1075/77/784 1074/76/784 1076/89/784 +f 1072/40/2182 1081/3/2182 1073/48/2182 +f 1081/3/2183 1087/91/2183 1073/48/2183 +f 1079/47/2184 1069/53/2184 1071/12/2184 +f 1069/53/2185 1067/42/2185 1071/12/2185 +f 1072/40/2186 1073/48/2186 1067/42/2186 +f 1069/71/2187 1066/72/2187 1065/78/2187 +f 1068/79/2188 1077/81/2188 1081/80/2188 +f 1088/11/2189 1078/13/2189 1074/53/2189 +f 1078/13/2189 1066/15/2189 1074/53/2189 +f 1074/53/788 1075/3/788 1088/11/788 +f 1062/2/2190 1078/82/2190 1079/87/2190 +f 1066/84/790 1069/83/790 1079/67/790 +f 1087/86/790 1081/85/790 1077/64/790 +f 1087/73/791 1079/74/791 1078/82/791 +f 1066/53/2191 1078/47/2191 1062/12/2191 +f 1070/48/2192 1088/91/2192 1077/3/2192 +f 1065/42/2193 1066/53/2193 1062/12/2193 +f 1070/48/2194 1077/3/2194 1068/40/2194 +f 1065/42/792 1062/12/792 1070/48/792 +f 1076/88/2195 1074/78/2195 1066/75/2195 +f 1077/81/2196 1075/89/2196 1080/76/2196 +f 1084/18/795 1082/10/795 1085/70/795 +f 1079/49/2197 1098/52/2197 1105/69/2197 +f 1096/3/2198 1092/53/2198 1098/11/2198 +f 1092/53/2199 1086/15/2199 1095/13/2199 +f 1098/11/2199 1092/53/2199 1095/13/2199 +f 1091/54/798 1090/56/798 1092/55/798 +f 1089/40/2200 1097/3/2200 1079/48/2200 +f 1097/3/2201 1098/91/2201 1079/48/2201 +f 1095/47/2202 1086/53/2202 1078/12/2202 +f 1086/53/2203 1084/42/2203 1078/12/2203 +f 1089/40/2204 1079/48/2204 1084/42/2204 +f 1083/58/2205 1082/54/2205 1084/90/2205 +f 1093/60/2206 1097/59/2206 1089/8/2206 +f 1105/11/2207 1094/13/2207 1090/53/2207 +f 1094/13/2207 1083/15/2207 1090/53/2207 +f 1090/53/2208 1091/3/2208 1105/11/2208 +f 1094/62/2209 1095/61/2209 1078/38/2209 +f 1086/64/804 1095/85/804 1094/63/804 +f 1098/68/804 1097/67/804 1093/86/804 +f 1094/36/804 1095/35/804 1098/2/804 +f 1083/53/2210 1094/47/2210 1088/12/2210 +f 1087/48/2211 1105/91/2211 1093/3/2211 +f 1082/42/2212 1083/53/2212 1088/12/2212 +f 1087/48/2213 1093/3/2213 1085/40/2213 +f 1082/42/2214 1088/12/2214 1087/48/2214 +f 1092/70/2215 1090/51/2215 1083/58/2215 +f 1093/60/2216 1091/56/2216 1096/55/2216 +f 1101/72/808 1099/71/808 1102/26/808 +f 1105/73/2217 1120/24/2217 1121/25/2217 +f 1112/3/2218 1108/53/2218 1111/13/2218 +f 1108/53/2219 1103/15/2219 1111/13/2219 +f 1112/3/810 1111/13/810 1120/11/810 +f 1106/76/811 1108/89/811 1112/75/811 +f 1104/40/2220 1113/3/2220 1105/48/2220 +f 1113/3/2221 1120/91/2221 1105/48/2221 +f 1111/47/2222 1103/53/2222 1098/12/2222 +f 1103/53/2223 1101/42/2223 1098/12/2223 +f 1104/40/2224 1105/48/2224 1101/42/2224 +f 1100/72/2225 1099/78/2225 1101/88/2225 +f 1109/81/2226 1113/80/2226 1104/7/2226 +f 1121/11/2227 1110/13/2227 1107/3/2227 +f 1110/13/2228 1100/15/2228 1106/53/2228 +f 1106/53/2229 1107/3/2229 1110/13/2229 +f 1110/82/2230 1111/87/2230 1098/17/2230 +f 1100/84/817 1103/83/817 1111/67/817 +f 1120/86/817 1113/85/817 1109/64/817 +f 1121/87/818 1120/73/818 1111/74/818 +f 1100/53/2231 1110/47/2231 1095/12/2231 +f 1094/48/2232 1121/91/2232 1109/3/2232 +f 1099/42/2233 1100/53/2233 1095/12/2233 +f 1094/48/2234 1109/3/2234 1102/40/2234 +f 1099/42/2235 1095/12/2235 1094/48/2235 +f 1106/78/2236 1100/75/2236 1103/77/2236 +f 1107/89/2237 1112/76/2237 1113/80/2237 +f 1114/10/822 1118/70/822 1122/51/822 +f 1120/41/2238 1111/49/2238 1130/52/2238 +f 1128/3/2239 1125/53/2239 1136/13/2239 +f 1125/53/2240 1119/15/2240 1136/13/2240 +f 1128/3/824 1136/13/824 1130/11/824 +f 1124/54/825 1123/56/825 1125/55/825 +f 1122/40/2241 1129/3/2241 1111/48/2241 +f 1129/3/2242 1130/91/2242 1111/48/2242 +f 1136/47/2243 1119/53/2243 1110/12/2243 +f 1119/53/2244 1117/42/2244 1110/12/2244 +f 1122/40/2245 1111/48/2245 1110/12/2245 +f 1119/57/2246 1115/58/2246 1114/54/2246 +f 1118/22/2247 1126/60/2247 1129/59/2247 +f 1116/11/829 1127/13/829 1124/3/829 +f 1127/13/2248 1115/15/2248 1123/53/2248 +f 1123/53/2249 1124/3/2249 1127/13/2249 +f 1121/37/2250 1127/62/2250 1136/61/2250 +f 1119/64/831 1136/85/831 1127/63/831 +f 1130/68/831 1129/67/831 1126/86/831 +f 1127/36/831 1136/35/831 1130/2/831 +f 1115/53/2251 1127/47/2251 1121/12/2251 +f 1120/48/2252 1116/91/2252 1126/3/2252 +f 1114/42/2253 1115/53/2253 1121/12/2253 +f 1120/48/2254 1126/3/2254 1118/40/2254 +f 1114/42/2255 1121/12/2255 1118/40/2255 +f 1123/51/2256 1115/58/2256 1119/57/2256 +f 1124/56/2257 1128/55/2257 1129/59/2257 +f 1131/71/835 1134/26/835 1137/31/835 +f 1116/73/2258 1149/24/2258 1150/25/2258 +f 1142/3/2259 1140/53/2259 1153/13/2259 +f 1140/53/2260 1135/15/2260 1153/13/2260 +f 1153/13/837 1149/11/837 1142/3/837 +f 1138/76/838 1140/89/838 1142/75/838 +f 1137/40/2261 1143/3/2261 1116/48/2261 +f 1143/3/2262 1149/91/2262 1116/48/2262 +f 1153/47/2263 1135/53/2263 1130/12/2263 +f 1135/53/2264 1133/42/2264 1130/12/2264 +f 1137/40/2265 1116/48/2265 1130/12/2265 +f 1132/72/2266 1131/78/2266 1133/88/2266 +f 1141/81/2267 1143/80/2267 1137/7/2267 +f 1150/11/842 1151/13/842 1139/3/842 +f 1151/13/2268 1132/15/2268 1138/53/2268 +f 1138/53/2269 1139/3/2269 1151/13/2269 +f 1151/82/2270 1153/87/2270 1130/17/2270 +f 1135/83/844 1153/67/844 1151/68/844 +f 1149/86/844 1143/85/844 1141/64/844 +f 1132/53/2271 1151/47/2271 1136/12/2271 +f 1127/48/2272 1150/91/2272 1141/3/2272 +f 1131/42/2273 1132/53/2273 1136/12/2273 +f 1127/48/2274 1141/3/2274 1134/40/2274 +f 1131/42/2275 1136/12/2275 1134/40/2275 +f 1138/78/2276 1132/75/2276 1135/77/2276 +f 1139/89/2277 1142/76/2277 1143/80/2277 +f 1144/10/848 1147/70/848 1152/51/848 +f 1153/49/2278 1168/52/2278 1170/69/2278 +f 1160/3/2279 1156/53/2279 1159/13/2279 +f 1156/53/2280 1148/15/2280 1159/13/2280 +f 1159/13/850 1168/11/850 1160/3/850 +f 1154/56/851 1156/55/851 1160/90/851 +f 1152/40/2281 1161/3/2281 1153/48/2281 +f 1161/3/2282 1168/91/2282 1153/48/2282 +f 1159/47/2283 1148/53/2283 1151/12/2283 +f 1148/53/2284 1146/42/2284 1151/12/2284 +f 1152/40/2285 1153/48/2285 1151/12/2285 +f 1148/57/2286 1145/58/2286 1144/54/2286 +f 1147/22/2287 1157/60/2287 1161/59/2287 +f 1158/13/2288 1145/15/2288 1154/53/2288 +f 1154/53/2289 1155/3/2289 1158/13/2289 +f 1155/3/855 1157/2/855 1170/11/855 +f 1158/62/2290 1159/61/2290 1151/38/2290 +f 1145/65/857 1148/64/857 1159/85/857 +f 1170/66/857 1168/68/857 1161/67/857 +f 1170/17/857 1158/36/857 1159/35/857 +f 1145/53/2291 1158/47/2291 1150/12/2291 +f 1149/48/2292 1170/91/2292 1157/3/2292 +f 1144/42/2293 1145/53/2293 1150/12/2293 +f 1149/48/2294 1157/3/2294 1147/40/2294 +f 1144/42/2295 1150/12/2295 1147/40/2295 +f 1149/61/844 1150/69/844 1151/52/844 +f 1154/51/2296 1145/58/2296 1148/57/2296 +f 1155/56/2297 1160/55/2297 1161/59/2297 +f 1162/71/861 1166/26/861 1169/31/861 +f 1170/73/2298 1183/24/2298 1164/25/2298 +f 1176/3/2299 1173/53/2299 1175/13/2299 +f 1173/53/2300 1167/15/2300 1175/13/2300 +f 1176/3/863 1175/13/863 1183/11/863 +f 1172/77/864 1171/76/864 1173/89/864 +f 1169/40/2301 1177/3/2301 1170/48/2301 +f 1177/3/2302 1183/91/2302 1170/48/2302 +f 1175/47/2303 1167/53/2303 1168/12/2303 +f 1167/53/2304 1165/42/2304 1168/12/2304 +f 1169/40/2305 1170/48/2305 1168/12/2305 +f 1167/71/2306 1163/72/2306 1162/78/2306 +f 1166/79/2307 1174/81/2307 1177/80/2307 +f 1184/13/2308 1163/15/2308 1171/53/2308 +f 1171/53/2309 1172/3/2309 1184/13/2309 +f 1172/3/868 1174/2/868 1164/11/868 +f 1184/82/2310 1175/87/2310 1168/17/2310 +f 1167/83/870 1175/67/870 1184/68/870 +f 1183/86/870 1177/85/870 1174/64/870 +f 1164/87/871 1183/73/871 1175/74/871 +f 1163/53/2311 1184/47/2311 1159/12/2311 +f 1158/48/2312 1164/91/2312 1174/3/2312 +f 1162/42/2313 1163/53/2313 1159/12/2313 +f 1158/48/2314 1174/3/2314 1166/40/2314 +f 1162/42/2315 1159/12/2315 1166/40/2315 +f 1173/88/2316 1171/78/2316 1163/75/2316 +f 1174/81/2317 1172/89/2317 1176/76/2317 +f 1180/18/875 1178/10/875 1181/70/875 +f 1175/49/2318 1200/52/2318 1202/69/2318 +f 1192/3/2319 1188/53/2319 1191/13/2319 +f 1188/53/2320 1182/15/2320 1191/13/2320 +f 1192/3/877 1191/13/877 1200/11/877 +f 1187/54/878 1186/56/878 1188/55/878 +f 1185/40/2321 1193/3/2321 1175/48/2321 +f 1193/3/2322 1200/91/2322 1175/48/2322 +f 1191/47/2323 1182/53/2323 1184/12/2323 +f 1182/53/2324 1180/42/2324 1184/12/2324 +f 1185/40/2325 1175/48/2325 1184/12/2325 +f 1179/58/2326 1178/54/2326 1180/90/2326 +f 1189/60/2327 1193/59/2327 1185/8/2327 +f 1202/11/882 1190/13/882 1187/3/882 +f 1190/13/2328 1179/15/2328 1186/53/2328 +f 1186/53/2329 1187/3/2329 1190/13/2329 +f 1190/62/2330 1191/61/2330 1184/38/2330 +f 1182/64/884 1191/85/884 1190/63/884 +f 1200/68/884 1193/67/884 1189/86/884 +f 1202/17/884 1190/36/884 1191/35/884 +f 1179/53/2331 1190/47/2331 1164/12/2331 +f 1183/48/2332 1202/91/2332 1189/3/2332 +f 1178/42/2333 1179/53/2333 1164/12/2333 +f 1183/48/2334 1189/3/2334 1181/40/2334 +f 1178/42/2335 1164/12/2335 1181/40/2335 +f 1186/51/2336 1179/58/2336 1182/57/2336 +f 1187/56/2337 1192/55/2337 1193/59/2337 +f 1194/71/888 1198/26/888 1201/31/888 +f 1190/74/2338 1202/73/2338 1215/24/2338 +f 1208/3/2339 1205/53/2339 1215/11/2339 +f 1205/53/2340 1199/15/2340 1217/13/2340 +f 1215/11/2340 1205/53/2340 1217/13/2340 +f 1203/76/891 1205/89/891 1208/75/891 +f 1201/40/2341 1209/3/2341 1202/48/2341 +f 1209/3/2342 1215/91/2342 1202/48/2342 +f 1217/47/2343 1199/53/2343 1200/12/2343 +f 1199/53/2344 1197/42/2344 1200/12/2344 +f 1201/40/2345 1202/48/2345 1200/12/2345 +f 1199/71/2346 1195/72/2346 1194/78/2346 +f 1198/79/2347 1206/81/2347 1209/80/2347 +f 1196/11/2348 1207/13/2348 1203/53/2348 +f 1207/13/2348 1195/15/2348 1203/53/2348 +f 1203/53/2349 1204/3/2349 1196/11/2349 +f 1191/2/2350 1207/82/2350 1217/87/2350 +f 1199/83/2351 1217/67/2351 1207/68/2351 +f 1196/66/897 1215/86/897 1209/85/897 +f 1196/87/898 1215/73/898 1217/74/898 +f 1195/53/2352 1207/47/2352 1191/12/2352 +f 1190/48/2353 1196/91/2353 1206/3/2353 +f 1194/42/2354 1195/53/2354 1191/12/2354 +f 1190/48/2355 1206/3/2355 1198/40/2355 +f 1194/42/2356 1191/12/2356 1198/40/2356 +f 1205/88/2357 1203/78/2357 1195/75/2357 +f 1206/81/901 1204/89/901 1208/76/901 +f 1210/10/902 1213/70/902 1216/51/902 +f 1217/49/2358 1225/52/2358 1233/69/2358 +f 1223/3/2359 1220/53/2359 1225/11/2359 +f 1220/53/2360 1214/15/2360 1231/13/2360 +f 1225/11/2360 1220/53/2360 1231/13/2360 +f 1219/54/905 1218/56/905 1220/55/905 +f 1216/40/2361 1224/3/2361 1217/48/2361 +f 1224/3/2362 1225/91/2362 1217/48/2362 +f 1231/47/2363 1214/53/2363 1207/12/2363 +f 1214/53/2364 1212/42/2364 1207/12/2364 +f 1216/40/2365 1217/48/2365 1212/42/2365 +f 1211/58/2366 1210/54/2366 1212/90/2366 +f 1221/60/2367 1224/59/2367 1216/8/2367 +f 1221/2/2368 1233/11/2368 1219/3/2368 +f 1233/11/909 1222/13/909 1218/53/909 +f 1219/3/2369 1233/11/2369 1218/53/2369 +f 1222/62/2370 1231/61/2370 1207/38/2370 +f 1214/64/911 1231/85/911 1222/63/911 +f 1225/68/911 1224/67/911 1221/86/911 +f 1233/17/911 1222/36/911 1231/35/911 +f 1211/53/2371 1222/47/2371 1196/12/2371 +f 1215/48/2372 1233/91/2372 1221/3/2372 +f 1210/42/2373 1211/53/2373 1196/12/2373 +f 1215/48/2374 1221/3/2374 1213/40/2374 +f 1210/42/2375 1196/12/2375 1215/48/2375 +f 1218/51/2376 1211/58/2376 1214/57/2376 +f 1219/56/2377 1223/55/2377 1224/59/2377 +f 1226/71/916 1229/26/916 1232/31/916 +f 1222/74/2378 1233/73/2378 1247/24/2378 +f 1240/3/2379 1236/53/2379 1247/11/2379 +f 1236/53/2380 1230/15/2380 1239/13/2380 +f 1247/11/2380 1236/53/2380 1239/13/2380 +f 1235/77/919 1234/76/919 1236/89/919 +f 1232/40/2381 1241/3/2381 1233/48/2381 +f 1241/3/2382 1247/91/2382 1233/48/2382 +f 1239/47/2383 1230/53/2383 1225/12/2383 +f 1230/53/2384 1228/42/2384 1225/12/2384 +f 1232/40/2385 1233/48/2385 1228/42/2385 +f 1230/71/2386 1227/72/2386 1226/78/2386 +f 1229/79/2387 1237/81/2387 1241/80/2387 +f 1238/13/923 1227/15/923 1234/53/923 +f 1234/53/2388 1235/3/2388 1248/11/2388 +f 1235/3/2388 1237/2/2388 1248/11/2388 +f 1231/2/2389 1238/82/2389 1239/87/2389 +f 1230/83/925 1239/67/925 1238/68/925 +f 1248/66/925 1247/86/925 1241/85/925 +f 1247/73/926 1239/74/926 1238/82/926 +f 1227/53/2390 1238/47/2390 1231/12/2390 +f 1222/48/2391 1248/91/2391 1237/3/2391 +f 1226/42/2392 1227/53/2392 1231/12/2392 +f 1222/48/2393 1237/3/2393 1229/40/2393 +f 1226/42/2394 1231/12/2394 1222/48/2394 +f 1234/78/2395 1227/75/2395 1230/77/2395 +f 1235/89/2396 1240/76/2396 1241/80/2396 +f 1244/18/930 1242/10/930 1245/70/930 +f 1247/41/2397 1239/49/2397 1263/52/2397 +f 1255/3/2398 1252/53/2398 1263/11/2398 +f 1252/53/2399 1246/15/2399 1254/13/2399 +f 1263/11/2399 1252/53/2399 1254/13/2399 +f 1250/56/933 1252/55/933 1255/90/933 +f 1249/40/2400 1256/3/2400 1239/48/2400 +f 1256/3/2401 1263/91/2401 1239/48/2401 +f 1254/47/2402 1246/53/2402 1238/12/2402 +f 1246/53/2403 1244/42/2403 1238/12/2403 +f 1249/40/2404 1239/48/2404 1244/42/2404 +f 1246/57/2405 1243/58/2405 1242/54/2405 +f 1245/22/2406 1253/60/2406 1256/59/2406 +f 1265/11/2407 1262/13/2407 1250/53/2407 +f 1262/13/956 1243/15/956 1250/53/956 +f 1250/53/2408 1251/3/2408 1265/11/2408 +f 1248/37/2409 1262/62/2409 1254/61/2409 +f 1246/64/939 1254/85/939 1262/63/939 +f 1263/68/939 1256/67/939 1253/86/939 +f 1262/36/939 1254/35/939 1263/2/939 +f 1243/53/2410 1262/47/2410 1248/12/2410 +f 1247/48/2411 1265/91/2411 1253/3/2411 +f 1242/42/2412 1243/53/2412 1248/12/2412 +f 1247/48/2413 1253/3/2413 1245/40/2413 +f 1242/42/2414 1248/12/2414 1247/48/2414 +f 1252/70/941 1250/51/941 1243/58/941 +f 1253/60/2415 1251/56/2415 1255/55/2415 +f 1257/71/943 1260/26/943 1264/31/943 +f 1265/73/2416 1273/24/2416 1280/25/2416 +f 1271/3/2417 1268/53/2417 1282/13/2417 +f 1268/53/2418 1261/15/2418 1282/13/2418 +f 1271/3/945 1282/13/945 1273/11/945 +f 1267/77/946 1266/76/946 1268/89/946 +f 1264/40/2419 1272/3/2419 1265/48/2419 +f 1272/3/2420 1273/91/2420 1265/48/2420 +f 1282/47/2421 1261/53/2421 1263/12/2421 +f 1261/53/2422 1259/42/2422 1263/12/2422 +f 1264/40/2423 1265/48/2423 1259/42/2423 +f 1258/72/2424 1257/78/2424 1259/88/2424 +f 1269/81/2425 1272/80/2425 1264/7/2425 +f 1270/13/2426 1258/15/2426 1266/53/2426 +f 1266/53/2427 1267/3/2427 1270/13/2427 +f 1267/3/950 1269/2/950 1280/11/950 +f 1270/82/2428 1282/87/2428 1263/17/2428 +f 1261/83/952 1282/67/952 1270/68/952 +f 1280/66/952 1273/86/952 1272/85/952 +f 1280/87/953 1273/73/953 1282/74/953 +f 1258/53/2429 1270/47/2429 1254/12/2429 +f 1262/48/2430 1280/91/2430 1269/3/2430 +f 1257/42/2431 1258/53/2431 1254/12/2431 +f 1262/48/2432 1269/3/2432 1260/40/2432 +f 1257/42/954 1254/12/954 1262/48/954 +f 1266/78/2433 1258/75/2433 1261/77/2433 +f 1267/89/2434 1271/76/2434 1272/80/2434 +f 1277/18/957 1274/10/957 1278/70/957 +f 1273/41/2435 1282/49/2435 1289/52/2435 +f 1287/3/2436 1285/53/2436 1296/13/2436 +f 1285/53/2437 1279/15/2437 1296/13/2437 +f 1287/3/959 1296/13/959 1289/11/959 +f 1284/54/960 1283/56/960 1285/55/960 +f 1281/40/2438 1288/3/2438 1282/48/2438 +f 1288/3/2439 1289/91/2439 1282/48/2439 +f 1296/47/2440 1279/53/2440 1270/12/2440 +f 1279/53/2441 1277/42/2441 1270/12/2441 +f 1281/40/961 1282/48/961 1270/12/961 +f 1279/57/2442 1275/58/2442 1274/54/2442 +f 1278/22/2443 1286/60/2443 1288/59/2443 +f 1276/11/964 1295/13/964 1284/3/964 +f 1295/13/2444 1275/15/2444 1283/53/2444 +f 1283/53/2445 1284/3/2445 1295/13/2445 +f 1280/37/2446 1295/62/2446 1296/61/2446 +f 1275/65/966 1279/64/966 1296/85/966 +f 1289/68/966 1288/67/966 1286/86/966 +f 1295/36/966 1296/35/966 1289/2/966 +f 1275/53/2447 1295/47/2447 1280/12/2447 +f 1273/48/2448 1276/91/2448 1286/3/2448 +f 1274/42/2449 1275/53/2449 1280/12/2449 +f 1273/48/2450 1286/3/2450 1278/40/2450 +f 1274/42/967 1280/12/967 1278/40/967 +f 1285/70/2451 1283/51/2451 1275/58/2451 +f 1286/60/2452 1284/56/2452 1287/55/2452 +f 1292/72/970 1290/71/970 1293/26/970 +f 1276/73/2453 1311/24/2453 1312/25/2453 +f 1304/3/2454 1300/53/2454 1303/13/2454 +f 1300/53/2455 1294/15/2455 1303/13/2455 +f 1304/3/972 1303/13/972 1311/11/972 +f 1298/76/973 1300/89/973 1304/75/973 +f 1297/40/2456 1305/3/2456 1276/48/2456 +f 1305/3/2457 1311/91/2457 1276/48/2457 +f 1303/47/2458 1294/53/2458 1289/12/2458 +f 1294/53/2459 1292/42/2459 1289/12/2459 +f 1297/40/2460 1276/48/2460 1289/12/2460 +f 1291/72/2461 1290/78/2461 1292/88/2461 +f 1301/81/2462 1305/80/2462 1297/7/2462 +f 1312/11/977 1302/13/977 1299/3/977 +f 1302/13/2463 1291/15/2463 1298/53/2463 +f 1298/53/2464 1299/3/2464 1302/13/2464 +f 1302/82/2465 1303/87/2465 1289/17/2465 +f 1291/84/979 1294/83/979 1303/67/979 +f 1312/66/979 1311/86/979 1305/85/979 +f 1311/73/980 1303/74/980 1302/82/980 +f 1291/53/2466 1302/47/2466 1296/12/2466 +f 1295/48/2467 1312/91/2467 1301/3/2467 +f 1290/42/2468 1291/53/2468 1296/12/2468 +f 1295/48/2469 1301/3/2469 1293/40/2469 +f 1290/42/2470 1296/12/2470 1293/40/2470 +f 1300/88/2471 1298/78/2471 1291/75/2471 +f 1301/81/2472 1299/89/2472 1304/76/2472 +f 1308/18/984 1306/10/984 1309/70/984 +f 1311/41/2473 1303/49/2473 1328/52/2473 +f 1320/3/2474 1316/53/2474 1319/13/2474 +f 1316/53/2475 1310/15/2475 1319/13/2475 +f 1320/3/986 1319/13/986 1328/11/986 +f 1314/56/987 1316/55/987 1320/90/987 +f 1313/40/2476 1321/3/2476 1303/48/2476 +f 1321/3/2477 1328/91/2477 1303/48/2477 +f 1319/47/2478 1310/53/2478 1302/12/2478 +f 1310/53/2479 1308/42/2479 1302/12/2479 +f 1313/40/2480 1303/48/2480 1302/12/2480 +f 1310/57/2481 1307/58/2481 1306/54/2481 +f 1309/22/2482 1317/60/2482 1321/59/2482 +f 1330/11/991 1318/13/991 1315/3/991 +f 1318/13/2483 1307/15/2483 1314/53/2483 +f 1314/53/2484 1315/3/2484 1318/13/2484 +f 1312/37/2485 1318/62/2485 1319/61/2485 +f 1310/64/993 1319/85/993 1318/63/993 +f 1328/68/993 1321/67/993 1317/86/993 +f 1330/17/2486 1318/36/2486 1319/35/2486 +f 1307/53/2487 1318/47/2487 1312/12/2487 +f 1311/48/2488 1330/91/2488 1317/3/2488 +f 1306/42/2489 1307/53/2489 1312/12/2489 +f 1311/48/2490 1317/3/2490 1309/40/2490 +f 1306/42/2491 1312/12/2491 1309/40/2491 +f 1316/70/2492 1314/51/2492 1307/58/2492 +f 1317/60/2493 1315/56/2493 1320/55/2493 +f 1322/71/997 1326/26/997 1329/31/997 +f 1330/73/2494 1338/24/2494 1324/25/2494 +f 1336/3/2495 1333/53/2495 1335/13/2495 +f 1333/53/2495 1327/15/2495 1335/13/2495 +f 1336/3/999 1335/13/999 1338/11/999 +f 1332/77/1000 1331/76/1000 1333/89/1000 +f 1329/40/2496 1337/3/2496 1330/48/2496 +f 1337/3/2497 1338/91/2497 1330/48/2497 +f 1335/47/2498 1327/53/2498 1328/12/2498 +f 1327/53/2499 1325/42/2499 1328/12/2499 +f 1329/40/2500 1330/48/2500 1328/12/2500 +f 1323/72/2501 1322/78/2501 1325/88/2501 +f 1334/81/2502 1337/80/2502 1329/7/2502 +f 1345/13/2503 1323/15/2503 1331/53/2503 +f 1331/53/2504 1332/3/2504 1345/13/2504 +f 1332/3/1004 1334/2/1004 1324/11/1004 +f 1345/82/2505 1335/87/2505 1328/17/2505 +f 1323/84/1006 1327/83/1006 1335/67/1006 +f 1338/86/1006 1337/85/1006 1334/64/1006 +f 1338/73/1007 1335/74/1007 1345/82/1007 +f 1323/53/2506 1345/47/2506 1319/12/2506 +f 1318/48/2507 1324/91/2507 1334/3/2507 +f 1322/42/2508 1323/53/2508 1319/12/2508 +f 1318/48/2509 1334/3/2509 1326/40/2509 +f 1322/42/2510 1319/12/2510 1326/40/2510 +f 1331/78/2511 1323/75/2511 1327/77/2511 +f 1332/89/2512 1336/76/2512 1337/80/2512 +f 1339/10/1011 1343/70/1011 1346/51/1011 +f 1338/41/2513 1335/49/2513 1361/52/2513 +f 1351/3/2514 1349/53/2514 1360/13/2514 +f 1349/53/2515 1344/15/2515 1360/13/2515 +f 1351/3/1013 1360/13/1013 1361/11/1013 +f 1348/54/1014 1347/56/1014 1349/55/1014 +f 1346/40/2516 1352/3/2516 1335/48/2516 +f 1352/3/2517 1361/91/2517 1335/48/2517 +f 1360/47/2518 1344/53/2518 1345/12/2518 +f 1344/53/2519 1342/42/2519 1345/12/2519 +f 1346/40/1015 1335/48/1015 1345/12/1015 +f 1344/57/2520 1340/58/2520 1339/54/2520 +f 1343/22/2521 1350/60/2521 1352/59/2521 +f 1341/11/1018 1359/13/1018 1348/3/1018 +f 1359/13/2522 1340/15/2522 1347/53/2522 +f 1347/53/2523 1348/3/2523 1359/13/2523 +f 1324/37/2524 1359/62/2524 1360/61/2524 +f 1344/64/1020 1360/85/1020 1359/63/1020 +f 1361/68/1020 1352/67/1020 1350/86/1020 +f 1341/17/2525 1359/36/2525 1360/35/2525 +f 1340/53/2526 1359/47/2526 1324/12/2526 +f 1338/48/2527 1341/91/2527 1350/3/2527 +f 1339/42/2528 1340/53/2528 1324/12/2528 +f 1338/48/2529 1350/3/2529 1343/40/2529 +f 1339/42/2530 1324/12/2530 1343/40/2530 +f 1347/51/2531 1340/58/2531 1344/57/2531 +f 1348/56/2532 1351/55/2532 1352/59/2532 +f 1353/71/1024 1357/26/1024 1362/31/1024 +f 1359/74/2533 1341/73/2533 1375/24/2533 +f 1368/3/2534 1365/53/2534 1375/11/2534 +f 1365/53/2535 1358/15/2535 1377/13/2535 +f 1375/11/2536 1365/53/2536 1377/13/2536 +f 1363/76/1027 1365/89/1027 1368/75/1027 +f 1362/40/2537 1369/3/2537 1341/48/2537 +f 1369/3/2538 1375/91/2538 1341/48/2538 +f 1377/47/2539 1358/53/2539 1361/12/2539 +f 1358/53/2540 1356/42/2540 1361/12/2540 +f 1362/40/2541 1341/48/2541 1361/12/2541 +f 1358/71/2542 1354/72/2542 1353/78/2542 +f 1357/79/2543 1366/81/2543 1369/80/2543 +f 1355/11/2544 1367/13/2544 1363/53/2544 +f 1367/13/2544 1354/15/2544 1363/53/2544 +f 1363/53/2545 1364/3/2545 1355/11/2545 +f 1360/2/2546 1367/82/2546 1377/87/2546 +f 1354/84/1033 1358/83/1033 1377/67/1033 +f 1375/86/1033 1369/85/1033 1366/64/1033 +f 1375/73/1034 1377/74/1034 1367/82/1034 +f 1354/53/2547 1367/47/2547 1360/12/2547 +f 1359/48/2548 1355/91/2548 1366/3/2548 +f 1353/42/2549 1354/53/2549 1360/12/2549 +f 1359/48/2550 1366/3/2550 1357/40/2550 +f 1353/42/2551 1360/12/2551 1357/40/2551 +f 1363/78/2552 1354/75/2552 1358/77/2552 +f 1364/89/2553 1368/76/2553 1369/80/2553 +f 1370/10/1038 1373/70/1038 1376/51/1038 +f 1375/41/2554 1377/49/2554 1385/52/2554 +f 1383/3/2555 1380/53/2555 1392/13/2555 +f 1380/53/2555 1374/15/2555 1392/13/2555 +f 1383/3/1040 1392/13/1040 1385/11/1040 +f 1379/54/1041 1378/56/1041 1380/55/1041 +f 1376/40/2556 1384/3/2556 1377/48/2556 +f 1384/3/2557 1385/91/2557 1377/48/2557 +f 1392/47/2558 1374/53/2558 1367/12/2558 +f 1374/53/2559 1372/42/2559 1367/12/2559 +f 1376/40/2560 1377/48/2560 1372/42/2560 +f 1374/57/2561 1371/58/2561 1370/54/2561 +f 1373/22/2562 1381/60/2562 1384/59/2562 +f 1394/11/1045 1382/13/1045 1379/3/1045 +f 1382/13/2563 1371/15/2563 1378/53/2563 +f 1378/53/1045 1379/3/1045 1382/13/1045 +f 1355/37/2564 1382/62/2564 1392/61/2564 +f 1374/64/1047 1392/85/1047 1382/63/1047 +f 1385/68/1047 1384/67/1047 1381/86/1047 +f 1382/36/1047 1392/35/1047 1385/2/1047 +f 1371/53/2565 1382/47/2565 1355/12/2565 +f 1375/48/2565 1394/91/2565 1381/3/2565 +f 1370/42/2566 1371/53/2566 1355/12/2566 +f 1375/48/2567 1381/3/2567 1373/40/2567 +f 1370/42/2568 1355/12/2568 1375/48/2568 +f 1378/51/1049 1371/58/1049 1374/57/1049 +f 1379/56/1050 1383/55/1050 1384/59/1050 +f 1386/71/1051 1390/26/1051 1393/31/1051 +f 1382/74/2569 1394/73/2569 1402/24/2569 +f 1400/3/1053 1397/53/1053 1402/11/1053 +f 1397/53/2570 1391/15/2570 1409/13/2570 +f 1409/13/2570 1402/11/2570 1397/53/2570 +f 1395/76/1054 1397/89/1054 1400/75/1054 +f 1393/40/2571 1401/3/2571 1394/48/2571 +f 1401/3/2572 1402/91/2572 1394/48/2572 +f 1409/47/2572 1391/53/2572 1385/12/2572 +f 1391/53/2573 1389/42/2573 1385/12/2573 +f 1393/40/1055 1394/48/1055 1385/12/1055 +f 1391/71/2574 1387/72/2574 1386/78/2574 +f 1390/79/2575 1398/81/2575 1401/80/2575 +f 1399/13/1058 1387/15/1058 1395/53/1058 +f 1395/53/2576 1396/3/2576 1388/11/2576 +f 1396/3/2576 1398/2/2576 1388/11/2576 +f 1392/2/2577 1399/82/2577 1409/87/2577 +f 1387/84/1060 1391/83/1060 1409/67/1060 +f 1402/86/1060 1401/85/1060 1398/64/1060 +f 1388/87/1061 1402/73/1061 1409/74/1061 +f 1387/53/2578 1399/47/2578 1392/12/2578 +f 1382/48/2578 1388/91/2578 1398/3/2578 +f 1386/42/2579 1387/53/2579 1392/12/2579 +f 1382/48/2580 1398/3/2580 1390/40/2580 +f 1386/42/1062 1392/12/1062 1390/40/1062 +f 1397/88/1063 1395/78/1063 1387/75/1063 +f 1398/81/1064 1396/89/1064 1400/76/1064 +f 1405/18/1065 1403/10/1065 1406/70/1065 +f 1409/49/2581 1424/52/2581 1426/69/2581 +f 1414/3/1067 1412/53/1067 1424/11/1067 +f 1412/53/1067 1407/15/1067 1423/13/1067 +f 1424/11/1067 1412/53/1067 1423/13/1067 +f 1411/54/1068 1410/56/1068 1412/55/1068 +f 1408/40/2582 1415/3/2582 1409/48/2582 +f 1415/3/2583 1424/91/2583 1409/48/2583 +f 1423/47/2583 1407/53/2583 1399/12/2583 +f 1407/53/2584 1405/42/2584 1399/12/2584 +f 1408/40/1069 1409/48/1069 1405/42/1069 +f 1404/58/2585 1403/54/2585 1405/90/2585 +f 1413/60/2586 1415/59/2586 1408/8/2586 +f 1426/11/1072 1422/13/1072 1410/53/1072 +f 1422/13/1072 1404/15/1072 1410/53/1072 +f 1410/53/1072 1411/3/1072 1426/11/1072 +f 1422/62/2587 1423/61/2587 1399/38/2587 +f 1407/64/1074 1423/85/1074 1422/63/1074 +f 1426/66/1074 1424/68/1074 1415/67/1074 +f 1404/53/2588 1422/47/2588 1388/12/2588 +f 1402/48/2589 1426/91/2589 1413/3/2589 +f 1403/42/2590 1404/53/2590 1388/12/2590 +f 1402/48/2591 1413/3/2591 1406/40/2591 +f 1403/42/1075 1388/12/1075 1402/48/1075 +f 1410/51/1076 1404/58/1076 1407/57/1076 +f 1411/56/1077 1414/55/1077 1415/59/1077 +f 1416/71/1078 1420/26/1078 1425/31/1078 +f 1422/74/2592 1426/73/2592 1439/24/2592 +f 1432/3/1080 1429/53/1080 1439/11/1080 +f 1429/53/1080 1421/15/1080 1441/13/1080 +f 1439/11/1080 1429/53/1080 1441/13/1080 +f 1428/77/1081 1427/76/1081 1429/89/1081 +f 1425/40/2593 1433/3/2593 1426/48/2593 +f 1433/3/2594 1439/91/2594 1426/48/2594 +f 1441/47/2595 1421/53/2595 1424/12/2595 +f 1421/53/2596 1419/42/2596 1424/12/2596 +f 1425/40/1082 1426/48/1082 1419/42/1082 +f 1421/71/2597 1417/72/2597 1416/78/2597 +f 1420/79/2598 1430/81/2598 1433/80/2598 +f 1418/11/1085 1431/13/1085 1427/53/1085 +f 1431/13/1085 1417/15/1085 1427/53/1085 +f 1427/53/1085 1428/3/1085 1418/11/1085 +f 1423/2/2599 1431/82/2599 1441/87/2599 +f 1417/84/1087 1421/83/1087 1441/67/1087 +f 1439/86/1087 1433/85/1087 1430/64/1087 +f 1439/73/1088 1441/74/1088 1431/82/1088 +f 1417/53/2600 1431/47/2600 1423/12/2600 +f 1422/48/2601 1418/91/2601 1430/3/2601 +f 1416/42/2602 1417/53/2602 1423/12/2602 +f 1422/48/2603 1430/3/2603 1420/40/2603 +f 1416/42/1089 1423/12/1089 1422/48/1089 +f 1422/49/1074 1423/65/1074 1424/63/1074 +f 1427/78/1090 1417/75/1090 1421/77/1090 +f 1428/89/1091 1432/76/1091 1433/80/1091 +f 1434/10/1092 1437/70/1092 1440/51/1092 +f 1439/41/2604 1441/49/2604 1456/52/2604 +f 1447/3/2605 1444/53/2605 1455/13/2605 +f 1444/53/2606 1438/15/2606 1455/13/2606 +f 1447/3/1094 1455/13/1094 1456/11/1094 +f 1443/54/1095 1442/56/1095 1444/55/1095 +f 1440/40/2607 1448/3/2607 1441/48/2607 +f 1448/3/2608 1456/91/2608 1441/48/2608 +f 1455/47/2609 1438/53/2609 1431/12/2609 +f 1438/53/2610 1436/42/2610 1431/12/2610 +f 1440/40/2611 1441/48/2611 1436/42/2611 +f 1438/57/2612 1435/58/2612 1434/54/2612 +f 1437/22/2613 1445/60/2613 1448/59/2613 +f 1458/11/1099 1446/13/1099 1443/3/1099 +f 1446/13/2614 1435/15/2614 1442/53/2614 +f 1442/53/2615 1443/3/2615 1446/13/2615 +f 1418/37/2616 1446/62/2616 1455/61/2616 +f 1438/64/1101 1455/85/1101 1446/63/1101 +f 1458/66/1101 1456/68/1101 1448/67/1101 +f 1446/36/1101 1455/35/1101 1456/2/1101 +f 1435/53/2617 1446/47/2617 1418/12/2617 +f 1439/48/2618 1458/91/2618 1445/3/2618 +f 1434/42/2619 1435/53/2619 1418/12/2619 +f 1439/48/2620 1445/3/2620 1437/40/2620 +f 1434/42/2621 1418/12/2621 1439/48/2621 +f 1444/70/2622 1442/51/2622 1435/58/2622 +f 1445/60/1104 1443/56/1104 1447/55/1104 +f 1452/72/1105 1449/71/1105 1453/26/1105 +f 1458/73/2623 1466/24/2623 1451/25/2623 +f 1464/3/2624 1461/53/2624 1474/13/2624 +f 1461/53/2625 1454/15/2625 1474/13/2625 +f 1474/13/1107 1466/11/1107 1464/3/1107 +f 1459/76/1108 1461/89/1108 1464/75/1108 +f 1457/40/2626 1465/3/2626 1458/48/2626 +f 1465/3/2627 1466/91/2627 1458/48/2627 +f 1474/47/2628 1454/53/2628 1456/12/2628 +f 1454/53/2629 1452/42/2629 1456/12/2629 +f 1457/40/1109 1458/48/1109 1452/42/1109 +f 1450/72/2630 1449/78/2630 1452/88/2630 +f 1462/81/2631 1465/80/2631 1457/7/2631 +f 1451/11/1112 1463/13/1112 1460/3/1112 +f 1463/13/2632 1450/15/2632 1459/53/2632 +f 1459/53/2633 1460/3/2633 1463/13/2633 +f 1463/82/2634 1474/87/2634 1456/17/2634 +f 1450/84/1114 1454/83/1114 1474/67/1114 +f 1451/66/1114 1466/86/1114 1465/85/1114 +f 1451/87/1115 1466/73/1115 1474/74/1115 +f 1450/53/2635 1463/47/2635 1455/12/2635 +f 1446/48/2636 1451/91/2636 1462/3/2636 +f 1449/42/2637 1450/53/2637 1455/12/2637 +f 1446/48/2638 1462/3/2638 1453/40/2638 +f 1449/42/1116 1455/12/1116 1446/48/1116 +f 1459/78/2639 1450/75/2639 1454/77/2639 +f 1460/89/2640 1464/76/2640 1465/80/2640 +f 1470/18/1119 1467/10/1119 1471/70/1119 +f 1474/49/2641 1488/52/2641 1469/69/2641 +f 1480/3/2642 1477/53/2642 1488/11/2642 +f 1477/53/2642 1472/15/2642 1487/13/2642 +f 1488/11/2642 1477/53/2642 1487/13/2642 +f 1475/56/1122 1477/55/1122 1480/90/1122 +f 1473/40/2643 1481/3/2643 1474/48/2643 +f 1481/3/2644 1488/91/2644 1474/48/2644 +f 1487/47/2645 1472/53/2645 1463/12/2645 +f 1472/53/2646 1470/42/2646 1463/12/2646 +f 1473/40/2647 1474/48/2647 1463/12/2647 +f 1468/58/2648 1467/54/2648 1470/90/2648 +f 1478/60/2649 1481/59/2649 1473/8/2649 +f 1469/11/2650 1479/13/2650 1475/53/2650 +f 1479/13/2650 1468/15/2650 1475/53/2650 +f 1475/53/2650 1476/3/2650 1469/11/2650 +f 1479/62/2651 1487/61/2651 1463/38/2651 +f 1468/65/1128 1472/64/1128 1487/85/1128 +f 1469/66/1128 1488/68/1128 1481/67/1128 +f 1479/36/1128 1487/35/1128 1488/2/1128 +f 1468/53/2652 1479/47/2652 1451/12/2652 +f 1466/48/2653 1469/91/2653 1478/3/2653 +f 1467/42/2654 1468/53/2654 1451/12/2654 +f 1466/48/2655 1478/3/2655 1471/40/2655 +f 1467/42/2656 1451/12/2656 1471/40/2656 +f 1477/70/1130 1475/51/1130 1468/58/1130 +f 1478/60/2657 1476/56/2657 1480/55/2657 +f 1482/71/1132 1485/26/1132 1489/31/1132 +f 1469/73/2658 1497/24/2658 1504/25/2658 +f 1495/3/2659 1492/53/2659 1506/13/2659 +f 1492/53/2660 1486/15/2660 1506/13/2660 +f 1506/13/1134 1497/11/1134 1495/3/1134 +f 1490/76/1135 1492/89/1135 1495/75/1135 +f 1489/40/2661 1496/3/2661 1469/48/2661 +f 1496/3/2662 1497/91/2662 1469/48/2662 +f 1506/47/2663 1486/53/2663 1488/12/2663 +f 1486/53/2664 1484/42/2664 1488/12/2664 +f 1489/40/2665 1469/48/2665 1488/12/2665 +f 1483/72/2666 1482/78/2666 1484/88/2666 +f 1493/81/2667 1496/80/2667 1489/7/2667 +f 1493/2/2668 1504/11/2668 1491/3/2668 +f 1504/11/2668 1494/13/2668 1491/3/2668 +f 1494/13/2669 1483/15/2669 1490/53/2669 +f 1494/82/2670 1506/87/2670 1488/17/2670 +f 1486/83/1141 1506/67/1141 1494/68/1141 +f 1504/66/1141 1497/86/1141 1496/85/1141 +f 1504/87/1142 1497/73/1142 1506/74/1142 +f 1483/53/2671 1494/47/2671 1487/12/2671 +f 1479/48/2671 1504/91/2671 1493/3/2671 +f 1482/42/2672 1483/53/2672 1487/12/2672 +f 1479/48/2673 1493/3/2673 1485/40/2673 +f 1482/42/2674 1487/12/2674 1485/40/2674 +f 1490/78/2675 1483/75/2675 1486/77/2675 +f 1491/89/2676 1495/76/2676 1496/80/2676 +f 1501/18/1146 1498/10/1146 1502/70/1146 +f 1497/41/2677 1506/49/2677 1513/52/2677 +f 1511/3/2678 1509/53/2678 1521/13/2678 +f 1509/53/2679 1503/15/2679 1521/13/2679 +f 1521/13/1148 1513/11/1148 1511/3/1148 +f 1507/56/1149 1509/55/1149 1511/90/1149 +f 1505/40/2680 1512/3/2680 1506/48/2680 +f 1512/3/2681 1513/91/2681 1506/48/2681 +f 1521/47/2682 1503/53/2682 1494/12/2682 +f 1503/53/2683 1501/42/2683 1494/12/2683 +f 1505/40/2684 1506/48/2684 1494/12/2684 +f 1503/57/2685 1499/58/2685 1498/54/2685 +f 1502/22/2686 1510/60/2686 1512/59/2686 +f 1500/11/1153 1520/13/1153 1508/3/1153 +f 1520/13/2687 1499/15/2687 1507/53/2687 +f 1508/3/2688 1520/13/2688 1507/53/2688 +f 1504/37/2689 1520/62/2689 1521/61/2689 +f 1499/65/1155 1503/64/1155 1521/85/1155 +f 1513/68/1155 1512/67/1155 1510/86/1155 +f 1500/17/1155 1520/36/1155 1521/35/1155 +f 1499/53/2690 1520/47/2690 1504/12/2690 +f 1497/48/2691 1500/91/2691 1510/3/2691 +f 1498/42/2692 1499/53/2692 1504/12/2692 +f 1497/48/2693 1510/3/2693 1502/40/2693 +f 1498/42/2694 1504/12/2694 1502/40/2694 +f 1509/70/2695 1507/51/2695 1499/58/2695 +f 1510/60/2696 1508/56/2696 1511/55/2696 +f 1517/72/1159 1514/71/1159 1518/26/1159 +f 1520/74/2697 1500/73/2697 1537/24/2697 +f 1529/3/1161 1525/53/1161 1537/11/1161 +f 1525/53/2698 1519/15/2698 1528/13/2698 +f 1537/11/2698 1525/53/2698 1528/13/2698 +f 1523/76/1162 1525/89/1162 1529/75/1162 +f 1522/40/2699 1530/3/2699 1500/48/2699 +f 1530/3/2700 1537/91/2700 1500/48/2700 +f 1528/47/2701 1519/53/2701 1513/12/2701 +f 1519/53/2702 1517/42/2702 1513/12/2702 +f 1522/40/2703 1500/48/2703 1513/12/2703 +f 1519/71/2704 1515/72/2704 1514/78/2704 +f 1518/79/2705 1526/81/2705 1530/80/2705 +f 1516/11/1166 1527/13/1166 1523/53/1166 +f 1527/13/1166 1515/15/1166 1523/53/1166 +f 1523/53/1166 1524/3/1166 1516/11/1166 +f 1521/2/2706 1527/82/2706 1528/87/2706 +f 1519/83/2707 1528/67/2707 1527/68/2707 +f 1537/86/1168 1530/85/1168 1526/64/1168 +f 1516/87/1169 1537/73/1169 1528/74/1169 +f 1515/53/2708 1527/47/2708 1521/12/2708 +f 1520/48/2709 1516/91/2709 1526/3/2709 +f 1514/42/2710 1515/53/2710 1521/12/2710 +f 1520/48/2711 1526/3/2711 1518/40/2711 +f 1514/42/2712 1521/12/2712 1518/40/2712 +f 1525/88/2713 1523/78/2713 1515/75/2713 +f 1526/81/2714 1524/89/2714 1529/76/2714 +f 1531/10/1173 1535/70/1173 1538/51/1173 +f 1537/41/2715 1528/49/2715 1546/52/2715 +f 1544/3/2716 1541/53/2716 1543/13/2716 +f 1541/53/2717 1536/15/2717 1543/13/2717 +f 1544/3/1175 1543/13/1175 1546/11/1175 +f 1540/54/1176 1539/56/1176 1541/55/1176 +f 1538/40/2718 1545/3/2718 1528/48/2718 +f 1545/3/2719 1546/91/2719 1528/48/2719 +f 1543/47/2720 1536/53/2720 1527/12/2720 +f 1536/53/2721 1534/42/2721 1527/12/2721 +f 1538/40/2722 1528/48/2722 1527/12/2722 +f 1536/57/2723 1532/58/2723 1531/54/2723 +f 1542/60/2724 1545/59/2724 1538/8/2724 +f 1533/11/1180 1552/13/1180 1540/3/1180 +f 1552/13/2725 1532/15/2725 1539/53/2725 +f 1539/53/2726 1540/3/2726 1552/13/2726 +f 1516/37/2727 1552/62/2727 1543/61/2727 +f 1536/64/1182 1543/85/1182 1552/63/1182 +f 1533/66/1183 1546/68/1183 1545/67/1183 +f 1552/36/1183 1543/35/1183 1546/2/1183 +f 1532/53/2728 1552/47/2728 1516/12/2728 +f 1537/48/2729 1533/91/2729 1542/3/2729 +f 1531/42/2730 1532/53/2730 1516/12/2730 +f 1537/48/2731 1542/3/2731 1535/40/2731 +f 1531/42/2732 1516/12/2732 1535/40/2732 +f 1541/70/2733 1539/51/2733 1532/58/2733 +f 1542/60/2734 1540/56/2734 1544/55/2734 +f 1547/71/1187 1550/26/1187 1553/31/1187 +f 1533/73/2735 1567/24/2735 1568/25/2735 +f 1560/3/2736 1556/53/2736 1559/13/2736 +f 1556/53/2737 1551/15/2737 1559/13/2737 +f 1560/3/1189 1559/13/1189 1567/11/1189 +f 1555/77/1190 1554/76/1190 1556/89/1190 +f 1553/40/2738 1561/3/2738 1533/48/2738 +f 1561/3/2739 1567/91/2739 1533/48/2739 +f 1559/47/2740 1551/53/2740 1546/12/2740 +f 1551/53/2741 1549/42/2741 1546/12/2741 +f 1553/40/2742 1533/48/2742 1549/42/2742 +f 1548/72/2743 1547/78/2743 1549/88/2743 +f 1557/81/2744 1561/80/2744 1553/7/2744 +f 1557/2/2745 1568/11/2745 1555/3/2745 +f 1568/11/2745 1558/13/2745 1555/3/2745 +f 1558/13/2746 1548/15/2746 1554/53/2746 +f 1558/82/2747 1559/87/2747 1546/17/2747 +f 1548/84/1196 1551/83/1196 1559/67/1196 +f 1568/66/1196 1567/86/1196 1561/85/1196 +f 1568/87/1197 1567/73/1197 1559/74/1197 +f 1548/53/2748 1558/47/2748 1543/12/2748 +f 1552/48/2749 1568/91/2749 1557/3/2749 +f 1547/42/2750 1548/53/2750 1543/12/2750 +f 1552/48/2751 1557/3/2751 1550/40/2751 +f 1547/42/2752 1543/12/2752 1552/48/2752 +f 1554/78/2753 1548/75/2753 1551/77/2753 +f 1555/89/2754 1560/76/2754 1561/80/2754 +f 1562/10/1201 1565/70/1201 1569/51/1201 +f 1567/41/2755 1559/49/2755 1584/52/2755 +f 1576/3/2756 1572/53/2756 1575/13/2756 +f 1572/53/2757 1566/15/2757 1575/13/2757 +f 1576/3/1203 1575/13/1203 1584/11/1203 +f 1571/54/1204 1570/56/1204 1572/55/1204 +f 1569/40/2758 1577/3/2758 1559/48/2758 +f 1577/3/2759 1584/91/2759 1559/48/2759 +f 1575/47/2760 1566/53/2760 1558/12/2760 +f 1566/53/2761 1564/42/2761 1558/12/2761 +f 1569/40/2762 1559/48/2762 1558/12/2762 +f 1566/57/2763 1563/58/2763 1562/54/2763 +f 1565/22/2764 1573/60/2764 1577/59/2764 +f 1586/11/1208 1574/13/1208 1571/3/1208 +f 1574/13/2765 1563/15/2765 1570/53/2765 +f 1570/53/2766 1571/3/2766 1574/13/2766 +f 1568/37/1209 1574/62/1209 1575/61/1209 +f 1563/65/1210 1566/64/1210 1575/85/1210 +f 1584/68/1210 1577/67/1210 1573/86/1210 +f 1574/36/1210 1575/35/1210 1584/2/1210 +f 1563/53/2767 1574/47/2767 1568/12/2767 +f 1567/48/2768 1586/91/2768 1573/3/2768 +f 1562/42/2769 1563/53/2769 1568/12/2769 +f 1567/48/2770 1573/3/2770 1565/40/2770 +f 1562/42/2771 1568/12/2771 1565/40/2771 +f 1570/51/2772 1563/58/2772 1566/57/2772 +f 1571/56/2773 1576/55/2773 1577/59/2773 +f 1578/71/1214 1582/26/1214 1585/31/1214 +f 1574/74/2774 1586/73/2774 1595/24/2774 +f 1593/3/1216 1589/53/1216 1595/11/1216 +f 1589/53/2775 1583/15/2775 1592/13/2775 +f 1589/53/2775 1592/13/2775 1595/11/2775 +f 1587/76/1217 1589/89/1217 1593/75/1217 +f 1585/40/2776 1594/3/2776 1586/48/2776 +f 1594/3/2777 1595/91/2777 1586/48/2777 +f 1592/47/2778 1583/53/2778 1584/12/2778 +f 1583/53/2779 1581/42/2779 1584/12/2779 +f 1585/40/2780 1586/48/2780 1584/12/2780 +f 1583/71/2781 1579/72/2781 1578/78/2781 +f 1582/79/2782 1590/81/2782 1594/80/2782 +f 1590/2/2783 1580/11/2783 1588/3/2783 +f 1580/11/1221 1591/13/1221 1587/53/1221 +f 1588/3/1221 1580/11/1221 1587/53/1221 +f 1575/2/2784 1591/82/2784 1592/87/2784 +f 1583/83/1223 1592/67/1223 1591/68/1223 +f 1580/66/1223 1595/86/1223 1594/85/1223 +f 1580/87/1224 1595/73/1224 1592/74/1224 +f 1579/53/2785 1591/47/2785 1575/12/2785 +f 1574/48/2786 1580/91/2786 1590/3/2786 +f 1578/42/2787 1579/53/2787 1575/12/2787 +f 1574/48/2788 1590/3/2788 1582/40/2788 +f 1578/42/2789 1575/12/2789 1582/40/2789 +f 1587/78/1226 1579/75/1226 1583/77/1226 +f 1588/89/1227 1593/76/1227 1594/80/1227 diff --git a/mods/everness/models/everness_chest_protected_opened.obj b/mods/everness/models/everness_chest_protected_opened.obj new file mode 100644 index 0000000..50a6323 --- /dev/null +++ b/mods/everness/models/everness_chest_protected_opened.obj @@ -0,0 +1,8799 @@ +# Blender 4.4.3 +# www.blender.org +mtllib everness_chest_protected_opened.mtl +o Chest +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.062500 0.000000 -0.437500 +v 0.125000 0.125000 -0.500000 +v 0.062500 -0.125000 -0.437500 +v -0.125000 0.125000 -0.500000 +v -0.125000 0.125000 -0.437500 +v 0.437500 -0.500000 0.500000 +v -0.062500 0.000000 -0.500000 +v 0.062500 0.062500 -0.437500 +v 0.062500 -0.062500 -0.437500 +v 0.125000 0.125000 -0.437500 +v 0.437500 -0.500000 -0.500000 +v 0.062500 0.000000 -0.500000 +v -0.125000 -0.062500 -0.437500 +v 0.437500 0.125000 -0.500000 +v 0.500000 0.125000 0.437500 +v -0.500000 0.125000 -0.437500 +v -0.437500 0.125000 -0.437500 +v 0.437500 0.125000 0.500000 +v -0.500000 0.125000 0.437500 +v 0.500000 0.125000 -0.437500 +v 0.062500 -0.125000 -0.500000 +v 0.125000 -0.062500 -0.500000 +v 0.125000 -0.062500 -0.437500 +v -0.437500 0.125000 -0.500000 +v -0.125000 0.062500 -0.500000 +v -0.062500 -0.125000 -0.500000 +v -0.125000 -0.062500 -0.500000 +v 0.062500 0.000000 -0.437500 +v 0.437500 -0.437500 -0.437500 +v 0.437500 -0.500000 0.437500 +v -0.062500 0.062500 -0.437500 +v -0.062500 0.062500 -0.500000 +v -0.437500 -0.437500 -0.500000 +v -0.062500 -0.125000 -0.437500 +v 0.437500 -0.437500 -0.500000 +v 0.062500 -0.062500 -0.500000 +v 0.500000 -0.437500 -0.437500 +v 0.500000 -0.437500 0.437500 +v -0.437500 -0.500000 -0.437500 +v -0.437500 -0.500000 0.437500 +v 0.437500 -0.500000 -0.437500 +v -0.500000 -0.437500 0.437500 +v -0.500000 -0.437500 -0.437500 +v -0.437500 0.125000 0.437500 +v 0.437500 -0.437500 0.500000 +v 0.437500 0.125000 -0.437500 +v 0.437500 0.125000 0.437500 +v -0.437500 -0.437500 0.500000 +v -0.437500 -0.437500 0.437500 +v 0.062500 0.062500 -0.500000 +v -0.437500 -0.437500 -0.437500 +v -0.062500 -0.062500 -0.437500 +v -0.062500 -0.062500 -0.500000 +v 0.437500 -0.437455 0.437505 +v -0.500000 0.125000 -0.500000 +v 0.500000 0.125000 -0.500000 +v -0.500000 0.125000 0.500000 +v -0.500000 0.390165 0.765165 +v -0.500000 1.097272 0.058058 +v 0.500000 0.390165 0.765165 +v 0.500000 1.097272 0.058058 +v -0.125000 0.920495 -0.118718 +v 0.062500 0.876301 -0.074524 +v 0.125000 0.876301 -0.074524 +v 0.125000 0.920495 -0.118718 +v -0.374993 0.787913 -0.162912 +v -0.125000 0.876301 -0.074524 +v -0.437500 0.390165 0.765165 +v -0.062500 0.920496 -0.118718 +v -0.437500 1.097272 0.058058 +v -0.500000 0.434359 0.720971 +v 0.500000 1.053078 0.102252 +v 0.437500 0.390165 0.765165 +v 0.062500 0.920495 -0.118718 +v 0.125000 0.832107 -0.118718 +v 0.125000 0.876301 -0.162913 +v -0.437500 0.125000 0.500000 +v -0.437500 0.787913 -0.162912 +v -0.500000 0.169194 0.455806 +v 0.500000 0.787913 -0.162913 +v -0.437500 0.832107 -0.207107 +v -0.125000 0.876301 -0.162913 +v 0.062500 0.832107 -0.118718 +v -0.062500 0.876301 -0.074524 +v -0.437500 1.008884 0.058058 +v -0.437500 0.390165 0.676777 +v 0.437500 0.434359 0.720971 +v -0.437500 0.434360 0.720971 +v -0.437500 1.053078 0.102253 +v -0.437500 0.876301 -0.162912 +v -0.437500 1.053078 0.013864 +v 0.500000 0.832107 -0.118719 +v 0.500000 1.008884 0.058058 +v -0.500000 0.213389 0.500000 +v -0.500000 0.390165 0.676777 +v 0.437500 0.169194 0.544194 +v 0.437500 0.345971 0.720971 +v -0.437500 0.169194 0.455806 +v 0.437500 0.787913 -0.162913 +v 0.437500 0.169194 0.455806 +v 0.062500 0.876301 -0.162913 +v -0.125000 0.832107 -0.118718 +v 0.437500 1.053078 0.102252 +v 0.437500 0.876301 -0.162913 +v 0.500000 0.213389 0.500000 +v -0.500000 0.832107 -0.118718 +v -0.437500 0.169194 0.544194 +v -0.062500 0.876301 -0.162913 +v -0.437500 0.345971 0.720971 +v -0.500000 1.008884 0.058059 +v 0.500000 0.390165 0.676777 +v 0.437500 1.053078 0.013864 +v 0.437500 0.390165 0.676777 +v -0.062500 0.832107 -0.118718 +v 0.437500 1.008884 0.058058 +v 0.437500 0.832107 -0.118719 +v 0.437500 0.213389 0.500000 +v -0.437500 0.213389 0.500000 +v -0.437500 0.832107 -0.118718 +v -0.500000 0.832107 -0.207107 +v 0.500000 0.832107 -0.207107 +v 0.500000 0.125000 0.500000 +v -0.374993 0.125000 -0.374993 +v 0.374993 -0.437500 -0.374993 +v -0.374993 0.125000 0.374994 +v 0.374993 0.125000 -0.374993 +v 0.374993 0.125000 0.374993 +v -0.374993 -0.437500 0.374994 +v -0.374993 -0.437500 -0.374993 +v 0.374993 -0.437455 0.374998 +v 0.374993 0.125000 0.437500 +v -0.374993 0.125000 0.437500 +v 0.374568 -0.374869 -0.374568 +v -0.374568 -0.374868 0.374569 +v -0.374568 -0.374869 -0.374568 +v 0.374568 -0.374815 0.374573 +v -0.374993 0.898590 0.031891 +v -0.374993 0.363998 0.566483 +v 0.374993 0.363998 0.566483 +v 0.374993 0.898590 0.031891 +v 0.374993 0.745850 -0.120850 +v 0.374993 0.211258 0.413742 +v -0.374993 0.211258 0.413743 +v -0.374993 0.745850 -0.120849 +v 0.374993 0.787913 -0.162913 +v 0.031983 -0.040647 -0.446669 +v 0.092717 -0.147175 -0.470919 +v 0.057782 -0.028911 -0.433507 +v 0.059559 -0.007783 -0.530027 +v 0.118516 -0.135440 -0.457758 +v 0.065550 -0.045370 -0.508303 +v 0.056358 -0.056324 -0.480517 +v 0.082158 -0.044589 -0.467356 +v 0.085358 0.003953 -0.516865 +v 0.091350 -0.033634 -0.495142 +v 0.108576 -0.174994 -0.477250 +v 0.134784 -0.139726 -0.560065 +v 0.134393 -0.163289 -0.464095 +v 0.120293 -0.114311 -0.554278 +v 0.160600 -0.128021 -0.546911 +v 0.146092 -0.102576 -0.541116 +v 0.138324 -0.086117 -0.466319 +v 0.200505 -0.192756 -0.493582 +v 0.147516 -0.075163 -0.494105 +v 0.060926 -0.121324 -0.505804 +v 0.208404 -0.179586 -0.520798 +v 0.101909 -0.136221 -0.498705 +v 0.127708 -0.124485 -0.485544 +v 0.136900 -0.113530 -0.513330 +v 0.070118 -0.110370 -0.533590 +v 0.111101 -0.125266 -0.526491 +v 0.216066 -0.218430 -0.501420 +v 0.138544 -0.253424 -0.540851 +v 0.224164 -0.205590 -0.528735 +v 0.122960 -0.227712 -0.533002 +v 0.174657 -0.204408 -0.506722 +v 0.146642 -0.240584 -0.568167 +v 0.130859 -0.214542 -0.560218 +v 0.156707 -0.202890 -0.547078 +v 0.124839 -0.202605 -0.484660 +v 0.184202 -0.303128 -0.511975 +v 0.203865 -0.283544 -0.567976 +v 0.150676 -0.190935 -0.471515 +v 0.149404 -0.164540 -0.566737 +v 0.209977 -0.291349 -0.498806 +v 0.148808 -0.216060 -0.519862 +v 0.175242 -0.152870 -0.553592 +v 0.182555 -0.191238 -0.533938 +v 0.196775 -0.327421 -0.514748 +v 0.229740 -0.304737 -0.599529 +v 0.222506 -0.315558 -0.501568 +v 0.213697 -0.273752 -0.595976 +v 0.255471 -0.292874 -0.586349 +v 0.239472 -0.261972 -0.582807 +v 0.231154 -0.243984 -0.508358 +v 0.285705 -0.353409 -0.517899 +v 0.239934 -0.232305 -0.535982 +v 0.153709 -0.279109 -0.547825 +v 0.297515 -0.347542 -0.546231 +v 0.194034 -0.293336 -0.539976 +v 0.219809 -0.281556 -0.526806 +v 0.229640 -0.271764 -0.554806 +v 0.162490 -0.267430 -0.575448 +v 0.298280 -0.383683 -0.519300 +v 0.218698 -0.413766 -0.558680 +v 0.309980 -0.377559 -0.547623 +v 0.207220 -0.386117 -0.557387 +v 0.259543 -0.364311 -0.531062 +v 0.230398 -0.407642 -0.587003 +v 0.219029 -0.380250 -0.585719 +v 0.245191 -0.369347 -0.572556 +v 0.209033 -0.352952 -0.515589 +v 0.254026 -0.464116 -0.518746 +v 0.279455 -0.457363 -0.575438 +v 0.234828 -0.341223 -0.502413 +v 0.244456 -0.335362 -0.600589 +v 0.280604 -0.454195 -0.505642 +v 0.233381 -0.375214 -0.544225 +v 0.270251 -0.323634 -0.587412 +v 0.271353 -0.358445 -0.559394 +v 0.262426 -0.488555 -0.516612 +v 0.304351 -0.489482 -0.600460 +v 0.288634 -0.477548 -0.503629 +v 0.292170 -0.453986 -0.603784 +v 0.266740 -0.460739 -0.547092 +v 0.293319 -0.450818 -0.533988 +v 0.330559 -0.478475 -0.587477 +v 0.318749 -0.444065 -0.590680 +v 0.306034 -0.447442 -0.562334 +v 0.309745 -0.413029 -0.520773 +v 0.341871 -0.508441 -0.501275 +v 0.292419 -0.539944 -0.522918 +v 0.321703 -0.407571 -0.549124 +v 0.229689 -0.441904 -0.560096 +v 0.359598 -0.520735 -0.523884 +v 0.241647 -0.436447 -0.588448 +v 0.346414 -0.524113 -0.485171 +v 0.274109 -0.577807 -0.511208 +v 0.365578 -0.541353 -0.502838 +v 0.267694 -0.555695 -0.533740 +v 0.334872 -0.536487 -0.534706 +v 0.293272 -0.595047 -0.528874 +v 0.285421 -0.567989 -0.556349 +v 0.269208 -0.509662 -0.510500 +v 0.282944 -0.559508 -0.447639 +v 0.323973 -0.606192 -0.454235 +v 0.294726 -0.496513 -0.498152 +v 0.316649 -0.527717 -0.589319 +v 0.306517 -0.539242 -0.444448 +v 0.310146 -0.552238 -0.545527 +v 0.317145 -0.524192 -0.512097 +v 0.342168 -0.514568 -0.576971 +v 0.281748 -0.559876 -0.426539 +v 0.342075 -0.630485 -0.413728 +v 0.305471 -0.539538 -0.426151 +v 0.344488 -0.629534 -0.457533 +v 0.303459 -0.582850 -0.450937 +v 0.327031 -0.562584 -0.447746 +v 0.365797 -0.610147 -0.413340 +v 0.368060 -0.609268 -0.454343 +v 0.349792 -0.536559 -0.465703 +v 0.341031 -0.529597 -0.368226 +v 0.292931 -0.569313 -0.364316 +v 0.369917 -0.557444 -0.477337 +v 0.278642 -0.594628 -0.484536 +v 0.360253 -0.551832 -0.357609 +v 0.347546 -0.585926 -0.451045 +v 0.298767 -0.615514 -0.496170 +v 0.335573 -0.519955 -0.338899 +v 0.263442 -0.579562 -0.333140 +v 0.354810 -0.542216 -0.328365 +v 0.268881 -0.589171 -0.362361 +v 0.316981 -0.549455 -0.366271 +v 0.282679 -0.601823 -0.322607 +v 0.288103 -0.611406 -0.351745 +v 0.312153 -0.591548 -0.353700 +v 0.278414 -0.555097 -0.402001 +v 0.257893 -0.520813 -0.280385 +v 0.302347 -0.535042 -0.403260 +v 0.337039 -0.623411 -0.375820 +v 0.281698 -0.500571 -0.280751 +v 0.360972 -0.603355 -0.377079 +v 0.336203 -0.571690 -0.355655 +v 0.254247 -0.516772 -0.247247 +v 0.314480 -0.587269 -0.233419 +v 0.277971 -0.496435 -0.246910 +v 0.317513 -0.590584 -0.261244 +v 0.277766 -0.544070 -0.274005 +v 0.301572 -0.523828 -0.274371 +v 0.338205 -0.566932 -0.233082 +v 0.341319 -0.570342 -0.261610 +v 0.321445 -0.547085 -0.267991 +v 0.330121 -0.510639 -0.307832 +v 0.315220 -0.493342 -0.180007 +v 0.267793 -0.534037 -0.180894 +v 0.349610 -0.533323 -0.298767 +v 0.258272 -0.570721 -0.303720 +v 0.335288 -0.516832 -0.175309 +v 0.277761 -0.593406 -0.294655 +v 0.297640 -0.567327 -0.267625 +v 0.311800 -0.490021 -0.149162 +v 0.240657 -0.551062 -0.150467 +v 0.331862 -0.513506 -0.144411 +v 0.244079 -0.554385 -0.181337 +v 0.260719 -0.574546 -0.145717 +v 0.264147 -0.577875 -0.176639 +v 0.251044 -0.513741 -0.216216 +v 0.237604 -0.500743 -0.092270 +v 0.274757 -0.493392 -0.215762 +v 0.311309 -0.584269 -0.202689 +v 0.261318 -0.480396 -0.091836 +v 0.287860 -0.557527 -0.176195 +v 0.291506 -0.513690 -0.180450 +v 0.335021 -0.563921 -0.202235 +v 0.311574 -0.537179 -0.175752 +v 0.234573 -0.497889 -0.060628 +v 0.295033 -0.568604 -0.049096 +v 0.258287 -0.477542 -0.060188 +v 0.297937 -0.571338 -0.079413 +v 0.257715 -0.524275 -0.087984 +v 0.318747 -0.548257 -0.048656 +v 0.321652 -0.550991 -0.078980 +v 0.308406 -0.486724 -0.118202 +v 0.297045 -0.476158 0.006461 +v 0.328484 -0.510223 -0.113599 +v 0.237261 -0.547763 -0.119498 +v 0.317263 -0.499789 0.009519 +v 0.281429 -0.503928 -0.087551 +v 0.301541 -0.527460 -0.083265 +v 0.257339 -0.571263 -0.114894 +v 0.277826 -0.547806 -0.083699 +v 0.294991 -0.474040 0.037113 +v 0.223759 -0.534992 0.037099 +v 0.315217 -0.497678 0.040071 +v 0.225880 -0.537180 0.005438 +v 0.273323 -0.496498 0.006120 +v 0.293542 -0.520129 0.009178 +v 0.243985 -0.558629 0.040057 +v 0.246099 -0.560810 0.008496 +v 0.231815 -0.495368 -0.028893 +v 0.224010 -0.486452 0.097421 +v 0.255528 -0.475020 -0.028444 +v 0.292397 -0.566194 -0.018770 +v 0.247771 -0.466157 0.097127 +v 0.269820 -0.540470 0.008837 +v 0.249602 -0.516839 0.005779 +v 0.316111 -0.545846 -0.018321 +v 0.222761 -0.484733 0.129387 +v 0.283599 -0.555872 0.134601 +v 0.246509 -0.464421 0.129434 +v 0.284773 -0.557489 0.104547 +v 0.307347 -0.535559 0.134648 +v 0.308534 -0.537194 0.104253 +v 0.288280 -0.513515 0.101878 +v 0.293247 -0.471758 0.067902 +v 0.288092 -0.467164 0.196515 +v 0.240703 -0.507810 0.193606 +v 0.313482 -0.495409 0.070681 +v 0.221967 -0.532648 0.068717 +v 0.308427 -0.490892 0.196765 +v 0.244264 -0.510131 0.099796 +v 0.268026 -0.489836 0.099502 +v 0.242202 -0.556299 0.071496 +v 0.264519 -0.533810 0.102172 +v 0.286654 -0.468551 0.229555 +v 0.215692 -0.529395 0.222386 +v 0.307028 -0.492237 0.228913 +v 0.217008 -0.528133 0.192151 +v 0.236066 -0.553081 0.221744 +v 0.237343 -0.551860 0.192402 +v 0.221589 -0.483893 0.161413 +v 0.216201 -0.495566 0.292061 +v 0.257320 -0.541490 0.281741 +v 0.245314 -0.463565 0.162092 +v 0.282510 -0.555090 0.164376 +v 0.239712 -0.475836 0.297940 +v 0.261038 -0.531537 0.193856 +v 0.264397 -0.487487 0.195060 +v 0.306234 -0.534762 0.165054 +v 0.284732 -0.511214 0.195311 +v 0.215170 -0.505079 0.323767 +v 0.277008 -0.572546 0.303438 +v 0.238640 -0.485715 0.330892 +v 0.277879 -0.564452 0.276581 +v 0.260271 -0.498798 0.292780 +v 0.300478 -0.553182 0.310564 +v 0.301390 -0.544722 0.282460 +v 0.285100 -0.471829 0.264033 +v 0.280789 -0.508257 0.388878 +v 0.305562 -0.495300 0.261390 +v 0.214350 -0.532161 0.252052 +v 0.301355 -0.531114 0.383296 +v 0.236760 -0.518528 0.286901 +v 0.280830 -0.521760 0.287620 +v 0.234812 -0.555632 0.249409 +v 0.279562 -0.513790 0.414273 +v 0.208742 -0.573913 0.401674 +v 0.299966 -0.537352 0.412022 +v 0.210302 -0.566936 0.369449 +v 0.277860 -0.550674 0.376820 +v 0.229146 -0.597475 0.399423 +v 0.230868 -0.589793 0.363868 +v 0.214238 -0.515359 0.353458 +v 0.208178 -0.528414 0.459579 +v 0.247671 -0.574932 0.473094 +v 0.237701 -0.496077 0.360825 +v 0.276095 -0.582629 0.332536 +v 0.232241 -0.508580 0.457536 +v 0.254364 -0.570233 0.370344 +v 0.233798 -0.547376 0.375925 +v 0.257293 -0.527817 0.382401 +v 0.299557 -0.563346 0.339903 +v 0.205598 -0.520976 0.485126 +v 0.263748 -0.587655 0.516134 +v 0.229880 -0.501762 0.480907 +v 0.267417 -0.598191 0.479852 +v 0.288030 -0.568442 0.511915 +v 0.291479 -0.578357 0.477808 +v 0.271733 -0.555098 0.471051 +v 0.278041 -0.515419 0.438285 +v 0.267312 -0.481496 0.530800 +v 0.298150 -0.539227 0.440602 +v 0.206606 -0.576054 0.435208 +v 0.285645 -0.499702 0.548378 +v 0.227925 -0.551673 0.466336 +v 0.251987 -0.531839 0.464293 +v 0.226714 -0.599862 0.437525 +v 0.264362 -0.465922 0.546836 +v 0.187898 -0.507232 0.581991 +v 0.282028 -0.480575 0.568044 +v 0.192426 -0.531244 0.557375 +v 0.205565 -0.521884 0.603199 +v 0.210759 -0.549451 0.574952 +v 0.202451 -0.510331 0.509447 +v 0.190600 -0.432912 0.573993 +v 0.226989 -0.491994 0.503266 +v 0.259289 -0.572529 0.550555 +v 0.216883 -0.426310 0.558431 +v 0.235721 -0.532868 0.566094 +v 0.217387 -0.514661 0.548517 +v 0.242350 -0.498078 0.539658 +v 0.283826 -0.554192 0.544374 +v 0.260683 -0.516285 0.557236 +v 0.188963 -0.406248 0.580156 +v 0.238653 -0.416131 0.659038 +v 0.215405 -0.402147 0.564013 +v 0.240922 -0.452751 0.650565 +v 0.207374 -0.439525 0.599517 +v 0.265095 -0.412030 0.642895 +v 0.267205 -0.446148 0.635003 +v 0.250431 -0.439535 0.609479 +v 0.261818 -0.447238 0.559344 +v 0.256304 -0.351988 0.573835 +v 0.202919 -0.348561 0.606153 +v 0.278959 -0.458013 0.583149 +v 0.183965 -0.478265 0.601361 +v 0.272529 -0.347446 0.600154 +v 0.233657 -0.432923 0.583955 +v 0.201107 -0.489040 0.625165 +v 0.224148 -0.446138 0.625041 +v 0.255743 -0.326695 0.567983 +v 0.175502 -0.314474 0.614899 +v 0.271897 -0.319072 0.593625 +v 0.176226 -0.346848 0.622312 +v 0.191656 -0.306852 0.640541 +v 0.192450 -0.342306 0.648631 +v 0.219143 -0.344019 0.632472 +v 0.187653 -0.379753 0.582119 +v 0.185929 -0.271578 0.552328 +v 0.214241 -0.378597 0.565740 +v 0.236748 -0.377680 0.661960 +v 0.212690 -0.278433 0.537720 +v 0.229612 -0.350274 0.589994 +v 0.263336 -0.376524 0.645580 +v 0.245836 -0.345732 0.616313 +v 0.186300 -0.243697 0.539001 +v 0.234721 -0.209724 0.611735 +v 0.213054 -0.251069 0.524633 +v 0.234335 -0.238747 0.625596 +v 0.228825 -0.267490 0.562143 +v 0.261475 -0.217096 0.597368 +v 0.261096 -0.245602 0.610987 +v 0.244961 -0.256546 0.586565 +v 0.255510 -0.300826 0.558965 +v 0.257487 -0.188490 0.507547 +v 0.203941 -0.175071 0.536856 +v 0.271642 -0.291083 0.583892 +v 0.175219 -0.283485 0.604150 +v 0.273579 -0.178955 0.532581 +v 0.202064 -0.260634 0.576751 +v 0.191351 -0.273742 0.629077 +v 0.218199 -0.249691 0.601173 +v 0.258566 -0.156302 0.495936 +v 0.178130 -0.139669 0.541131 +v 0.274585 -0.148941 0.521738 +v 0.177168 -0.168362 0.551510 +v 0.230714 -0.181780 0.522201 +v 0.194150 -0.132309 0.566933 +v 0.193260 -0.158827 0.576544 +v 0.186960 -0.214865 0.525101 +v 0.191407 -0.083138 0.487578 +v 0.222958 -0.082159 0.541521 +v 0.213716 -0.222178 0.510706 +v 0.235349 -0.182335 0.598513 +v 0.218361 -0.084694 0.471841 +v 0.220033 -0.165536 0.561890 +v 0.262104 -0.189647 0.584118 +v 0.246806 -0.172246 0.547235 +v 0.192653 -0.047085 0.488696 +v 0.239555 -0.057970 0.569138 +v 0.219691 -0.046192 0.473053 +v 0.238733 -0.081669 0.568492 +v 0.266593 -0.057078 0.553494 +v 0.265687 -0.083225 0.552755 +v 0.249911 -0.083715 0.525784 +v 0.259791 -0.121927 0.487302 +v 0.264768 0.021726 0.503253 +v 0.275702 -0.117633 0.513853 +v 0.179170 -0.110536 0.533773 +v 0.280122 0.010192 0.527906 +v 0.207182 -0.082649 0.514549 +v 0.234136 -0.084204 0.498813 +v 0.195081 -0.106242 0.560324 +v 0.266237 0.053863 0.520683 +v 0.184397 0.032240 0.560978 +v 0.281420 0.038570 0.543314 +v 0.183187 0.005811 0.546616 +v 0.252928 0.004887 0.542360 +v 0.199580 0.016948 0.583609 +v 0.198541 -0.005723 0.571269 +v 0.193808 -0.011591 0.495023 +v 0.199955 0.108685 0.571260 +v 0.229634 0.067185 0.607360 +v 0.220923 -0.008410 0.479817 +v 0.240312 -0.034239 0.573212 +v 0.227409 0.118644 0.560139 +v 0.225735 -0.000418 0.556815 +v 0.210381 0.011116 0.532161 +v 0.237574 0.016421 0.517707 +v 0.267427 -0.031058 0.558006 +v 0.201766 0.130437 0.597178 +v 0.245945 0.064064 0.646492 +v 0.229277 0.141093 0.586873 +v 0.244473 0.046435 0.625410 +v 0.214795 0.087935 0.589310 +v 0.273456 0.074720 0.636188 +v 0.271927 0.056394 0.614288 +v 0.267913 0.082738 0.542429 +v 0.274991 0.167234 0.644260 +v 0.219917 0.145342 0.664107 +v 0.282913 0.064271 0.562691 +v 0.185796 0.056319 0.579144 +v 0.289668 0.144562 0.659981 +v 0.242248 0.097894 0.578188 +v 0.257087 0.077144 0.596238 +v 0.200796 0.037853 0.599406 +v 0.276595 0.185183 0.668083 +v 0.194072 0.153342 0.699152 +v 0.291332 0.163192 0.684690 +v 0.192381 0.134396 0.674030 +v 0.247454 0.156288 0.654184 +v 0.208809 0.131351 0.715758 +v 0.207058 0.111724 0.689752 +v 0.234595 0.122670 0.679828 +v 0.203539 0.149842 0.623169 +v 0.209667 0.224139 0.713388 +v 0.239631 0.186978 0.753731 +v 0.231078 0.160807 0.613271 +v 0.247556 0.081665 0.670111 +v 0.237053 0.233062 0.701267 +v 0.275095 0.092630 0.660213 +v 0.262132 0.133616 0.669905 +v 0.210850 0.245434 0.729911 +v 0.256245 0.197772 0.796669 +v 0.238162 0.253019 0.716755 +v 0.254614 0.168398 0.773901 +v 0.224649 0.205558 0.733559 +v 0.283557 0.205357 0.783512 +v 0.282000 0.177322 0.761780 +v 0.267017 0.195902 0.741609 +v 0.278079 0.203702 0.689934 +v 0.282609 0.294367 0.752197 +v 0.292922 0.183062 0.708105 +v 0.195714 0.173863 0.723321 +v 0.297925 0.282883 0.776897 +v 0.252035 0.214482 0.721438 +v 0.210558 0.153223 0.741492 +v 0.283408 0.320957 0.763110 +v 0.201819 0.307250 0.807205 +v 0.298781 0.311402 0.788584 +v 0.200941 0.277973 0.795216 +v 0.270702 0.277418 0.791237 +v 0.217191 0.297695 0.832679 +v 0.216257 0.266489 0.819916 +v 0.243480 0.271954 0.805576 +v 0.211904 0.269408 0.743845 +v 0.214518 0.371063 0.777266 +v 0.245561 0.370013 0.831502 +v 0.239163 0.275826 0.729976 +v 0.257623 0.228843 0.814932 +v 0.241640 0.371049 0.761742 +v 0.228164 0.283438 0.780876 +v 0.255386 0.288902 0.766536 +v 0.284881 0.235260 0.801063 +v 0.214635 0.395418 0.775110 +v 0.261281 0.410102 0.855094 +v 0.241743 0.392559 0.759826 +v 0.261083 0.369488 0.858619 +v 0.288388 0.407243 0.839811 +v 0.288204 0.369474 0.843096 +v 0.283972 0.346303 0.770634 +v 0.284039 0.439647 0.753942 +v 0.299424 0.340438 0.797155 +v 0.202501 0.338101 0.816288 +v 0.299495 0.454750 0.776516 +v 0.230040 0.370538 0.804384 +v 0.257161 0.370524 0.788860 +v 0.272683 0.369999 0.815978 +v 0.217953 0.332235 0.842809 +v 0.283427 0.458127 0.738686 +v 0.201751 0.488872 0.772932 +v 0.298741 0.477666 0.757666 +v 0.202580 0.463649 0.793658 +v 0.272342 0.462751 0.789754 +v 0.217065 0.508411 0.791912 +v 0.218036 0.478753 0.816232 +v 0.245189 0.470752 0.802993 +v 0.214585 0.419402 0.768416 +v 0.211943 0.495127 0.697480 +v 0.241698 0.414042 0.753831 +v 0.261195 0.448691 0.844301 +v 0.239239 0.483364 0.687831 +v 0.229733 0.455648 0.780420 +v 0.256886 0.447648 0.767181 +v 0.288309 0.443331 0.829717 +v 0.211247 0.515540 0.671158 +v 0.256920 0.578983 0.722908 +v 0.238533 0.504099 0.661103 +v 0.257524 0.561455 0.745564 +v 0.254433 0.505473 0.703859 +v 0.284206 0.567541 0.712853 +v 0.284820 0.549691 0.735915 +v 0.269627 0.527582 0.719887 +v 0.282596 0.475640 0.718387 +v 0.280634 0.557586 0.621183 +v 0.297807 0.497399 0.734870 +v 0.200753 0.510003 0.748552 +v 0.295880 0.577404 0.639928 +v 0.227137 0.517236 0.713508 +v 0.215964 0.531762 0.765036 +v 0.242330 0.539345 0.729537 +v 0.280704 0.578218 0.598880 +v 0.198871 0.612305 0.629385 +v 0.295951 0.598350 0.617286 +v 0.198799 0.590808 0.652620 +v 0.253356 0.568660 0.631662 +v 0.214118 0.632437 0.647791 +v 0.214045 0.610626 0.671365 +v 0.210899 0.538150 0.645965 +v 0.211469 0.621986 0.554272 +v 0.238177 0.527197 0.635359 +v 0.256636 0.597629 0.702174 +v 0.238742 0.610251 0.544523 +v 0.241323 0.599552 0.660886 +v 0.226077 0.579734 0.642141 +v 0.283914 0.586676 0.691568 +v 0.268602 0.588478 0.650407 +v 0.211961 0.642773 0.530515 +v 0.257702 0.703591 0.585269 +v 0.239234 0.631040 0.520763 +v 0.257219 0.683231 0.608540 +v 0.226719 0.642401 0.572361 +v 0.253992 0.630666 0.562613 +v 0.284975 0.691859 0.575517 +v 0.284492 0.671496 0.598791 +v 0.280914 0.598591 0.576098 +v 0.282944 0.682664 0.482089 +v 0.296164 0.618939 0.594264 +v 0.199088 0.633377 0.605822 +v 0.298170 0.702161 0.501184 +v 0.269242 0.651081 0.580702 +v 0.214338 0.653725 0.623987 +v 0.241969 0.662816 0.590451 +v 0.283560 0.705367 0.459106 +v 0.201684 0.738484 0.490548 +v 0.298771 0.724325 0.478747 +v 0.201094 0.716736 0.512563 +v 0.216895 0.757442 0.510189 +v 0.216319 0.736233 0.531659 +v 0.212535 0.664006 0.506766 +v 0.214920 0.756183 0.416369 +v 0.239812 0.652405 0.496869 +v 0.258250 0.723876 0.562577 +v 0.242232 0.745972 0.405129 +v 0.243603 0.724875 0.521501 +v 0.228377 0.705379 0.502405 +v 0.255661 0.694021 0.492247 +v 0.285527 0.712274 0.552680 +v 0.270886 0.713518 0.511342 +v 0.215562 0.781850 0.395594 +v 0.261002 0.830941 0.461278 +v 0.242888 0.772189 0.383910 +v 0.260444 0.808602 0.479368 +v 0.230095 0.773656 0.437369 +v 0.257407 0.763445 0.426129 +v 0.288328 0.821280 0.449594 +v 0.287756 0.798391 0.468128 +v 0.284143 0.728801 0.436689 +v 0.286858 0.832184 0.356913 +v 0.299339 0.747141 0.456920 +v 0.202240 0.760820 0.469180 +v 0.301958 0.846874 0.379994 +v 0.272582 0.780918 0.447129 +v 0.217435 0.779159 0.489412 +v 0.245269 0.791129 0.458369 +v 0.287639 0.858569 0.339884 +v 0.205588 0.884934 0.376783 +v 0.302736 0.873148 0.363037 +v 0.204812 0.858711 0.393707 +v 0.220685 0.899513 0.399937 +v 0.219912 0.873401 0.416788 +v 0.247261 0.864559 0.404524 +v 0.216285 0.808394 0.376253 +v 0.219251 0.911032 0.307425 +v 0.249537 0.943448 0.351450 +v 0.243625 0.799238 0.364200 +v 0.261641 0.854386 0.444198 +v 0.246579 0.901445 0.295685 +v 0.232161 0.849869 0.381443 +v 0.259509 0.841026 0.369178 +v 0.288981 0.845231 0.432145 +v 0.274610 0.855717 0.392259 +v 0.219828 0.933711 0.289321 +v 0.265360 0.986460 0.352037 +v 0.247139 0.923450 0.278123 +v 0.264680 0.959655 0.373463 +v 0.234394 0.927240 0.329438 +v 0.261722 0.917653 0.317697 +v 0.292671 0.976200 0.340839 +v 0.292008 0.950069 0.361723 +v 0.288383 0.884004 0.323141 +v 0.290560 0.972748 0.246798 +v 0.303495 0.899114 0.345941 +v 0.206354 0.911151 0.359521 +v 0.305778 0.992118 0.266027 +v 0.276865 0.933861 0.339710 +v 0.221467 0.926260 0.382321 +v 0.291855 0.994518 0.224522 +v 0.210066 1.029875 0.253669 +v 0.307021 1.013047 0.244602 +v 0.208716 1.007171 0.276892 +v 0.225232 1.048404 0.273749 +v 0.223934 1.026541 0.296122 +v 0.220303 0.955016 0.269901 +v 0.227657 1.046794 0.179731 +v 0.257790 1.081893 0.221758 +v 0.247598 0.944058 0.259344 +v 0.265929 1.012011 0.328712 +v 0.254860 1.034491 0.170501 +v 0.251216 1.015066 0.286090 +v 0.235998 0.995696 0.266861 +v 0.263279 0.984222 0.256829 +v 0.293225 1.001054 0.318155 +v 0.278497 1.003592 0.276059 +v 0.230762 1.068735 0.158993 +v 0.276188 1.122988 0.220492 +v 0.257921 1.056115 0.150065 +v 0.272857 1.099443 0.242771 +v 0.242723 1.064343 0.200745 +v 0.303347 1.110368 0.211565 +v 0.300060 1.087140 0.233541 +v 0.294206 1.017193 0.203065 +v 0.305101 1.099827 0.118949 +v 0.250990 1.126795 0.134792 +v 0.309291 1.034903 0.223930 +v 0.212492 1.053285 0.231512 +v 0.320675 1.121623 0.135041 +v 0.269926 1.052040 0.191515 +v 0.284993 1.069590 0.212528 +v 0.227577 1.070995 0.252377 +v 0.305304 1.112356 0.096449 +v 0.224155 1.154503 0.117125 +v 0.320907 1.137628 0.106168 +v 0.223935 1.140279 0.142713 +v 0.239758 1.179775 0.126844 +v 0.239509 1.162075 0.158806 +v 0.233522 1.088572 0.138615 +v 0.230676 1.117106 0.070610 +v 0.260629 1.075567 0.130091 +v 0.279495 1.146872 0.195858 +v 0.258132 1.102796 0.066373 +v 0.266564 1.148591 0.150884 +v 0.278045 1.113311 0.126870 +v 0.306602 1.133867 0.187333 +v 0.293620 1.135107 0.142963 +v 0.223157 1.108454 0.050554 +v 0.254860 1.183255 0.003770 +v 0.250253 1.093757 0.045418 +v 0.267105 1.196840 0.037378 +v 0.281956 1.168559 -0.001366 +v 0.294561 1.182530 0.033140 +v 0.303270 1.118417 0.073969 +v 0.258188 1.078899 -0.030268 +v 0.317780 1.146086 0.073298 +v 0.221654 1.161612 0.090161 +v 0.267562 1.102820 -0.048057 +v 0.242819 1.143684 0.059533 +v 0.270275 1.129374 0.055296 +v 0.282418 1.155952 0.044218 +v 0.236165 1.189281 0.089490 +v 0.254962 1.170262 0.048455 +v 0.241815 1.066575 -0.053363 +v 0.166959 1.116109 -0.026309 +v 0.249827 1.089453 -0.073085 +v 0.182355 1.127691 -0.004620 +v 0.232910 1.095163 -0.021718 +v 0.174970 1.138987 -0.046031 +v 0.191730 1.151612 -0.022409 +v 0.217007 1.135348 -0.030958 +v 0.211685 1.097774 0.027141 +v 0.154888 1.050394 -0.048817 +v 0.162291 1.088165 -0.098059 +v 0.237772 1.082142 0.019953 +v 0.241950 1.171195 -0.022683 +v 0.180461 1.034493 -0.057169 +v 0.207632 1.111427 -0.013169 +v 0.268037 1.155563 -0.029872 +v 0.242285 1.119084 -0.039507 +v 0.141059 1.033795 -0.061360 +v 0.144543 1.081242 -0.142142 +v 0.167424 1.018858 -0.068996 +v 0.165993 1.107050 -0.122680 +v 0.170908 1.066305 -0.149778 +v 0.191566 1.091149 -0.131033 +v 0.187864 1.072264 -0.106411 +v 0.225496 1.052971 -0.073377 +v 0.169327 0.977188 -0.120721 +v 0.113193 1.001411 -0.107738 +v 0.231574 1.074217 -0.095473 +v 0.150310 1.102213 -0.046709 +v 0.166237 0.986012 -0.150540 +v 0.158590 1.069280 -0.073438 +v 0.184163 1.053378 -0.081790 +v 0.156388 1.123459 -0.068804 +v 0.158647 0.952837 -0.125060 +v 0.072488 0.984733 -0.106399 +v 0.154150 0.958476 -0.155466 +v 0.085126 1.013523 -0.101247 +v 0.067990 0.990373 -0.136806 +v 0.082037 1.022346 -0.131066 +v 0.128109 1.014505 -0.071047 +v 0.088410 0.915539 -0.084207 +v 0.155363 1.000896 -0.078017 +v 0.124550 1.051465 -0.157130 +v 0.117972 0.907457 -0.090318 +v 0.110104 1.010234 -0.137557 +v 0.141260 0.989300 -0.114230 +v 0.151805 1.037856 -0.164100 +v 0.138170 0.998123 -0.144049 +v 0.079836 0.886222 -0.084085 +v 0.060887 0.886308 -0.175900 +v 0.109472 0.878426 -0.090208 +v 0.069890 0.917275 -0.176093 +v 0.082237 0.916118 -0.114836 +v 0.090523 0.878512 -0.182023 +v 0.099452 0.909194 -0.182204 +v 0.149252 0.927040 -0.127209 +v 0.115289 0.810660 -0.126634 +v 0.056017 0.826253 -0.114387 +v 0.143752 0.929901 -0.157838 +v 0.061612 0.954830 -0.108876 +v 0.108973 0.810689 -0.157239 +v 0.111799 0.908036 -0.120947 +v 0.105625 0.908615 -0.151575 +v 0.056112 0.957690 -0.139505 +v 0.076063 0.916696 -0.145464 +v 0.106538 0.780661 -0.126482 +v 0.017630 0.804050 -0.108112 +v 0.100222 0.780690 -0.157087 +v 0.026381 0.834049 -0.108264 +v 0.085653 0.818457 -0.120510 +v 0.079337 0.818485 -0.151115 +v 0.011314 0.804079 -0.138717 +v 0.020065 0.834078 -0.138869 +v 0.049701 0.826282 -0.144992 +v -0.033737 -0.040800 -0.446078 +v -0.094447 -0.147286 -0.470573 +v -0.059511 -0.029132 -0.432808 +v -0.061550 -0.007654 -0.529246 +v -0.120221 -0.135618 -0.457303 +v -0.067457 -0.045324 -0.507647 +v -0.058186 -0.056373 -0.479924 +v -0.083960 -0.044704 -0.466654 +v -0.087325 0.004015 -0.515975 +v -0.093231 -0.033656 -0.494377 +v -0.110301 -0.175096 -0.476968 +v -0.136742 -0.139538 -0.559585 +v -0.136095 -0.163462 -0.463706 +v -0.122261 -0.114140 -0.553741 +v -0.129492 -0.124569 -0.485026 +v -0.162536 -0.127904 -0.546323 +v -0.148035 -0.102471 -0.540471 +v -0.140089 -0.086279 -0.465632 +v -0.202255 -0.192891 -0.493158 +v -0.150594 -0.216035 -0.519648 +v -0.149360 -0.075230 -0.493354 +v -0.062767 -0.121285 -0.505442 +v -0.210229 -0.179620 -0.520303 +v -0.103718 -0.136237 -0.498296 +v -0.138764 -0.113520 -0.512748 +v -0.072038 -0.110236 -0.533165 +v -0.112989 -0.125188 -0.526018 +v -0.217806 -0.218546 -0.501064 +v -0.140340 -0.253305 -0.540812 +v -0.225979 -0.205605 -0.528309 +v -0.124763 -0.227607 -0.532893 +v -0.148513 -0.240365 -0.568057 +v -0.132737 -0.214336 -0.560039 +v -0.126557 -0.202695 -0.484447 +v -0.185893 -0.303164 -0.512019 +v -0.152375 -0.191102 -0.471196 +v -0.151351 -0.164331 -0.566316 +v -0.211639 -0.291444 -0.498739 +v -0.158568 -0.202764 -0.546794 +v -0.176425 -0.204463 -0.506403 +v -0.177169 -0.152738 -0.553065 +v -0.184398 -0.191192 -0.533548 +v -0.198463 -0.327446 -0.514840 +v -0.231676 -0.304499 -0.599453 +v -0.224159 -0.315630 -0.501549 +v -0.215624 -0.273503 -0.595837 +v -0.257372 -0.292683 -0.586162 +v -0.241370 -0.261783 -0.582557 +v -0.231460 -0.271670 -0.554618 +v -0.232881 -0.244075 -0.508066 +v -0.287388 -0.353394 -0.517776 +v -0.241737 -0.232296 -0.535623 +v -0.155505 -0.278986 -0.547855 +v -0.299294 -0.347469 -0.546055 +v -0.195803 -0.293277 -0.539958 +v -0.221550 -0.281557 -0.526679 +v -0.164360 -0.267207 -0.575412 +v -0.205713 -0.283390 -0.567897 +v -0.299960 -0.383659 -0.519189 +v -0.220515 -0.413664 -0.558903 +v -0.311761 -0.377486 -0.547460 +v -0.209036 -0.386017 -0.557598 +v -0.261270 -0.364268 -0.531050 +v -0.273177 -0.358344 -0.559329 +v -0.232315 -0.407491 -0.587173 +v -0.220942 -0.380092 -0.585877 +v -0.247059 -0.369218 -0.572603 +v -0.210716 -0.352963 -0.515719 +v -0.255699 -0.464084 -0.518919 +v -0.281334 -0.457246 -0.575508 +v -0.236469 -0.341270 -0.502430 +v -0.246404 -0.335146 -0.600559 +v -0.282228 -0.454176 -0.505704 +v -0.235153 -0.375142 -0.544324 +v -0.272157 -0.323452 -0.587270 +v -0.264104 -0.488536 -0.516782 +v -0.306335 -0.489322 -0.600478 +v -0.290257 -0.477528 -0.503689 +v -0.294152 -0.453826 -0.603802 +v -0.332488 -0.478314 -0.587386 +v -0.320681 -0.443919 -0.590587 +v -0.307863 -0.447338 -0.562293 +v -0.311423 -0.412993 -0.520668 +v -0.343534 -0.508340 -0.501223 +v -0.294219 -0.539927 -0.523054 +v -0.323484 -0.407494 -0.548967 +v -0.231509 -0.441805 -0.560325 +v -0.361354 -0.520558 -0.523800 +v -0.268517 -0.460665 -0.547214 +v -0.295045 -0.450757 -0.533998 +v -0.243570 -0.436306 -0.588624 +v -0.348073 -0.523995 -0.485147 +v -0.275990 -0.577876 -0.511415 +v -0.367328 -0.541151 -0.502796 +v -0.269562 -0.555720 -0.533969 +v -0.318876 -0.524133 -0.512138 +v -0.336697 -0.536351 -0.534716 +v -0.295245 -0.595032 -0.529063 +v -0.287382 -0.567938 -0.556546 +v -0.312039 -0.552144 -0.545631 +v -0.270900 -0.509678 -0.510670 +v -0.284680 -0.559664 -0.447731 +v -0.296357 -0.496510 -0.498217 +v -0.318632 -0.527544 -0.589356 +v -0.308172 -0.539308 -0.444517 +v -0.344089 -0.514375 -0.576904 +v -0.283493 -0.560056 -0.426614 +v -0.344105 -0.630429 -0.413855 +v -0.307135 -0.539624 -0.426235 +v -0.346503 -0.629436 -0.457677 +v -0.328779 -0.562565 -0.447832 +v -0.367747 -0.609998 -0.413476 +v -0.369994 -0.609079 -0.454463 +v -0.349387 -0.585822 -0.451147 +v -0.351457 -0.536451 -0.465719 +v -0.342723 -0.529538 -0.368384 +v -0.371672 -0.557248 -0.477355 +v -0.280542 -0.594754 -0.484720 +v -0.362040 -0.551695 -0.357777 +v -0.305288 -0.582922 -0.451047 +v -0.300758 -0.615550 -0.496356 +v -0.325896 -0.606179 -0.454362 +v -0.337265 -0.519896 -0.339060 +v -0.265362 -0.579766 -0.333174 +v -0.356597 -0.542078 -0.328532 +v -0.270801 -0.589375 -0.362395 +v -0.284694 -0.601948 -0.322646 +v -0.290118 -0.611532 -0.351788 +v -0.314092 -0.591586 -0.353784 +v -0.280160 -0.555282 -0.402064 +v -0.259640 -0.520995 -0.280488 +v -0.299572 -0.567347 -0.267712 +v -0.304014 -0.535136 -0.403353 +v -0.339073 -0.623367 -0.375933 +v -0.283367 -0.500662 -0.280882 +v -0.294775 -0.569430 -0.364391 +v -0.318749 -0.549484 -0.366387 +v -0.362927 -0.603220 -0.377222 +v -0.338066 -0.571640 -0.355780 +v -0.255992 -0.516950 -0.247349 +v -0.316505 -0.587204 -0.233510 +v -0.279637 -0.496520 -0.247032 +v -0.319538 -0.590522 -0.261325 +v -0.279606 -0.544171 -0.274100 +v -0.303333 -0.523838 -0.274495 +v -0.340150 -0.566774 -0.233192 +v -0.343266 -0.570189 -0.261719 +v -0.331811 -0.510576 -0.307991 +v -0.316900 -0.493255 -0.180142 +v -0.351393 -0.533179 -0.298925 +v -0.260193 -0.570925 -0.303765 +v -0.337062 -0.516664 -0.175442 +v -0.323299 -0.547014 -0.268107 +v -0.279775 -0.593528 -0.294699 +v -0.313481 -0.489934 -0.149297 +v -0.242575 -0.551252 -0.150546 +v -0.333636 -0.513338 -0.144545 +v -0.245998 -0.554575 -0.181416 +v -0.262731 -0.574656 -0.145794 +v -0.266159 -0.577985 -0.176716 +v -0.252789 -0.513919 -0.216315 +v -0.239349 -0.500921 -0.092372 +v -0.279758 -0.547823 -0.083795 +v -0.276422 -0.493477 -0.215878 +v -0.313334 -0.584206 -0.202785 +v -0.262984 -0.480482 -0.091956 +v -0.289793 -0.557544 -0.176292 +v -0.269632 -0.534135 -0.180991 +v -0.293266 -0.513695 -0.180567 +v -0.336967 -0.563764 -0.202349 +v -0.313427 -0.537104 -0.175867 +v -0.236317 -0.498066 -0.060733 +v -0.297057 -0.568539 -0.049190 +v -0.259951 -0.477626 -0.060308 +v -0.299962 -0.571274 -0.079507 +v -0.259553 -0.524372 -0.088084 +v -0.283188 -0.503932 -0.087667 +v -0.320692 -0.548099 -0.048765 +v -0.323597 -0.550834 -0.079090 +v -0.303393 -0.527384 -0.083379 +v -0.310086 -0.486636 -0.118337 +v -0.298720 -0.476066 0.006337 +v -0.251437 -0.516933 0.005677 +v -0.330258 -0.510055 -0.113731 +v -0.239180 -0.547953 -0.119578 +v -0.319032 -0.499616 0.009396 +v -0.259351 -0.571373 -0.114972 +v -0.296666 -0.473948 0.036990 +v -0.225674 -0.535179 0.037007 +v -0.316985 -0.497506 0.039948 +v -0.227795 -0.537367 0.005347 +v -0.275078 -0.496499 0.006007 +v -0.295390 -0.520049 0.009066 +v -0.245993 -0.558737 0.039965 +v -0.248107 -0.560917 0.008406 +v -0.271749 -0.540483 0.008736 +v -0.233558 -0.495544 -0.028999 +v -0.225749 -0.486627 0.097318 +v -0.266444 -0.533823 0.102070 +v -0.257192 -0.475103 -0.028563 +v -0.294421 -0.566128 -0.018865 +v -0.249430 -0.466238 0.097015 +v -0.318054 -0.545687 -0.018430 +v -0.224499 -0.484906 0.129280 +v -0.285617 -0.555803 0.134502 +v -0.248167 -0.464500 0.129318 +v -0.286792 -0.557422 0.104445 +v -0.246097 -0.510225 0.099694 +v -0.309285 -0.535396 0.134541 +v -0.310473 -0.537034 0.104142 +v -0.294919 -0.471666 0.067779 +v -0.289763 -0.467061 0.196398 +v -0.242535 -0.507893 0.193496 +v -0.315248 -0.495237 0.070558 +v -0.223880 -0.532836 0.068626 +v -0.310192 -0.490707 0.196656 +v -0.269778 -0.489837 0.099390 +v -0.290125 -0.513435 0.101766 +v -0.244209 -0.556407 0.071405 +v -0.288326 -0.468444 0.229438 +v -0.217605 -0.529569 0.222274 +v -0.308793 -0.492051 0.228810 +v -0.218921 -0.528310 0.192045 +v -0.286578 -0.511124 0.195205 +v -0.238072 -0.553176 0.221646 +v -0.239349 -0.551956 0.192304 +v -0.262963 -0.531540 0.193754 +v -0.223327 -0.484062 0.161301 +v -0.217941 -0.495698 0.291904 +v -0.259244 -0.541469 0.281645 +v -0.246972 -0.463640 0.161973 +v -0.284528 -0.555017 0.164279 +v -0.241370 -0.475876 0.297798 +v -0.266149 -0.487477 0.194947 +v -0.308172 -0.534595 0.164952 +v -0.216910 -0.505203 0.323604 +v -0.279025 -0.572445 0.303373 +v -0.240298 -0.485749 0.330753 +v -0.279896 -0.564355 0.276515 +v -0.238592 -0.518584 0.286775 +v -0.262022 -0.498762 0.292668 +v -0.302413 -0.552991 0.310522 +v -0.303325 -0.544534 0.282409 +v -0.282674 -0.521648 0.287539 +v -0.286772 -0.471716 0.263920 +v -0.282458 -0.508131 0.388805 +v -0.235630 -0.547428 0.375800 +v -0.307326 -0.495109 0.261301 +v -0.216263 -0.532328 0.251927 +v -0.303117 -0.530909 0.383243 +v -0.236818 -0.555721 0.249308 +v -0.281233 -0.513677 0.414193 +v -0.210657 -0.574075 0.401538 +v -0.301731 -0.537158 0.411945 +v -0.212216 -0.567077 0.369297 +v -0.259044 -0.527780 0.382302 +v -0.279703 -0.550558 0.376740 +v -0.231154 -0.597556 0.399290 +v -0.232875 -0.589855 0.363735 +v -0.256289 -0.570206 0.370238 +v -0.215978 -0.515484 0.353302 +v -0.209916 -0.528595 0.459526 +v -0.249603 -0.574966 0.472981 +v -0.239358 -0.496113 0.360698 +v -0.278112 -0.582522 0.332460 +v -0.233899 -0.508666 0.457469 +v -0.301492 -0.563151 0.339856 +v -0.207332 -0.521164 0.485202 +v -0.265803 -0.587718 0.515874 +v -0.231531 -0.501844 0.480992 +v -0.269446 -0.598151 0.479709 +v -0.229760 -0.551780 0.466253 +v -0.290002 -0.568398 0.511664 +v -0.293429 -0.578222 0.477652 +v -0.279716 -0.515327 0.438189 +v -0.269021 -0.481682 0.531192 +v -0.219295 -0.515209 0.548786 +v -0.299919 -0.539056 0.440493 +v -0.208521 -0.576244 0.435104 +v -0.287495 -0.499993 0.548511 +v -0.253742 -0.531852 0.464197 +v -0.273585 -0.555037 0.470924 +v -0.228725 -0.599973 0.437408 +v -0.266110 -0.466403 0.547203 +v -0.189911 -0.508119 0.582452 +v -0.283901 -0.481088 0.568283 +v -0.194433 -0.531973 0.557583 +v -0.207701 -0.522803 0.603532 +v -0.212907 -0.550284 0.574903 +v -0.204194 -0.510597 0.509765 +v -0.192429 -0.434256 0.573704 +v -0.228639 -0.492117 0.503644 +v -0.261415 -0.572904 0.550171 +v -0.218682 -0.427996 0.557951 +v -0.237770 -0.533520 0.566106 +v -0.244158 -0.498445 0.539989 +v -0.285860 -0.554424 0.544050 +v -0.262632 -0.516756 0.557309 +v -0.190778 -0.407720 0.578945 +v -0.240523 -0.414715 0.658101 +v -0.217205 -0.404165 0.562651 +v -0.242871 -0.452067 0.650694 +v -0.209243 -0.440193 0.599367 +v -0.235496 -0.433933 0.583615 +v -0.266950 -0.411160 0.641806 +v -0.269124 -0.445808 0.634941 +v -0.252310 -0.439870 0.609278 +v -0.263608 -0.448146 0.559395 +v -0.258092 -0.354410 0.570247 +v -0.204696 -0.349297 0.602324 +v -0.280831 -0.458660 0.583256 +v -0.185932 -0.478993 0.601867 +v -0.274307 -0.348452 0.596288 +v -0.203155 -0.489508 0.625728 +v -0.226057 -0.446130 0.625030 +v -0.257520 -0.329736 0.563037 +v -0.177251 -0.314772 0.609104 +v -0.273658 -0.320575 0.588181 +v -0.177998 -0.346741 0.618363 +v -0.231394 -0.351854 0.586285 +v -0.247609 -0.345896 0.612327 +v -0.193390 -0.305611 0.634247 +v -0.194212 -0.340783 0.644404 +v -0.189452 -0.381471 0.579845 +v -0.187664 -0.276037 0.543985 +v -0.219899 -0.250845 0.591235 +v -0.216038 -0.381023 0.563426 +v -0.238554 -0.375779 0.659504 +v -0.214436 -0.283851 0.529887 +v -0.220911 -0.343339 0.628366 +v -0.265139 -0.375331 0.643085 +v -0.188033 -0.249181 0.528737 +v -0.236400 -0.210255 0.598983 +v -0.214798 -0.257494 0.514915 +v -0.236016 -0.238249 0.614860 +v -0.230553 -0.271255 0.553512 +v -0.263165 -0.218569 0.585160 +v -0.262788 -0.246064 0.600762 +v -0.246671 -0.258660 0.577137 +v -0.257270 -0.304628 0.552503 +v -0.259174 -0.196389 0.493559 +v -0.205609 -0.180923 0.521805 +v -0.273385 -0.293282 0.576754 +v -0.176947 -0.284460 0.596441 +v -0.275252 -0.185045 0.517836 +v -0.203781 -0.263441 0.567610 +v -0.193062 -0.273115 0.620693 +v -0.260225 -0.165257 0.479570 +v -0.179766 -0.145352 0.523381 +v -0.276233 -0.155983 0.504756 +v -0.178827 -0.173190 0.535928 +v -0.232391 -0.188656 0.507682 +v -0.195774 -0.136079 0.548566 +v -0.194904 -0.161846 0.560205 +v -0.221687 -0.169579 0.546082 +v -0.188675 -0.221409 0.512914 +v -0.193062 -0.092715 0.465533 +v -0.224574 -0.088174 0.519316 +v -0.215441 -0.229681 0.499069 +v -0.237013 -0.183782 0.583884 +v -0.220027 -0.095313 0.449954 +v -0.263779 -0.192054 0.570038 +v -0.248469 -0.177312 0.531959 +v -0.194344 -0.056098 0.464206 +v -0.241144 -0.062898 0.545154 +v -0.221402 -0.055991 0.448571 +v -0.240330 -0.085904 0.546208 +v -0.268201 -0.062791 0.529520 +v -0.267295 -0.088502 0.530628 +v -0.251539 -0.090772 0.503737 +v -0.261437 -0.131639 0.468270 +v -0.266410 0.013679 0.477211 +v -0.211971 0.003898 0.506314 +v -0.277336 -0.125408 0.494441 +v -0.180794 -0.116894 0.513748 +v -0.281724 0.002953 0.502251 +v -0.208818 -0.090445 0.492425 +v -0.235783 -0.093043 0.476845 +v -0.196693 -0.110662 0.539920 +v -0.267751 0.046528 0.493786 +v -0.185839 0.025659 0.534333 +v -0.282902 0.031833 0.516830 +v -0.184752 -0.000992 0.520866 +v -0.200990 0.010964 0.557377 +v -0.200066 -0.011718 0.545906 +v -0.195489 -0.020083 0.469975 +v -0.201163 0.102376 0.544007 +v -0.230775 0.060806 0.580081 +v -0.222630 -0.017470 0.454707 +v -0.241862 -0.039758 0.549042 +v -0.228643 0.112441 0.533048 +v -0.227285 -0.006828 0.531354 +v -0.239191 0.008788 0.491763 +v -0.269003 -0.037146 0.533774 +v -0.254505 -0.001938 0.516803 +v -0.202837 0.124149 0.570742 +v -0.246869 0.056709 0.618721 +v -0.230383 0.135083 0.560830 +v -0.245581 0.040021 0.598117 +v -0.215969 0.081591 0.562044 +v -0.274415 0.067642 0.608809 +v -0.273061 0.050086 0.587159 +v -0.269282 0.076114 0.515186 +v -0.275857 0.159651 0.621112 +v -0.220654 0.136522 0.639113 +v -0.284255 0.057950 0.535740 +v -0.187098 0.049937 0.551921 +v -0.290428 0.135952 0.635346 +v -0.243449 0.091656 0.551085 +v -0.258255 0.070871 0.569121 +v -0.202070 0.031773 0.572475 +v -0.277386 0.176090 0.647046 +v -0.194612 0.141720 0.674547 +v -0.291977 0.152615 0.661627 +v -0.193053 0.124958 0.648113 +v -0.248255 0.148087 0.630113 +v -0.209203 0.118245 0.689127 +v -0.207624 0.101259 0.662347 +v -0.204486 0.143061 0.597992 +v -0.210411 0.210581 0.697796 +v -0.239932 0.167874 0.732593 +v -0.232073 0.154465 0.588746 +v -0.248283 0.072872 0.642089 +v -0.237918 0.220974 0.687215 +v -0.235225 0.112823 0.653347 +v -0.275869 0.084277 0.632843 +v -0.262827 0.124388 0.644347 +v -0.211655 0.229276 0.717985 +v -0.256334 0.171347 0.776611 +v -0.239095 0.238638 0.706323 +v -0.254692 0.146520 0.749992 +v -0.225171 0.189228 0.715194 +v -0.252678 0.199620 0.704613 +v -0.283774 0.180708 0.764949 +v -0.282199 0.156913 0.739411 +v -0.278833 0.192649 0.671508 +v -0.283536 0.272743 0.745734 +v -0.293489 0.169932 0.687183 +v -0.196156 0.159414 0.700649 +v -0.298684 0.258601 0.769124 +v -0.267438 0.178266 0.722012 +v -0.210813 0.136698 0.716323 +v -0.284444 0.297514 0.758350 +v -0.202643 0.280842 0.801009 +v -0.299682 0.285824 0.783002 +v -0.201602 0.252471 0.786539 +v -0.271373 0.251844 0.782726 +v -0.217882 0.269151 0.825660 +v -0.216750 0.238329 0.809929 +v -0.212763 0.249892 0.735120 +v -0.216024 0.349419 0.780248 +v -0.246798 0.338055 0.833446 +v -0.240129 0.257878 0.722317 +v -0.257881 0.200137 0.800525 +v -0.243217 0.352000 0.765069 +v -0.244061 0.245086 0.796327 +v -0.228913 0.259229 0.772937 +v -0.256225 0.265986 0.759336 +v -0.285247 0.208123 0.787722 +v -0.216370 0.373696 0.782905 +v -0.262759 0.372898 0.864369 +v -0.243524 0.373488 0.767440 +v -0.262185 0.332372 0.860046 +v -0.289913 0.372691 0.848904 +v -0.289378 0.334953 0.844866 +v -0.285228 0.323744 0.769198 +v -0.286265 0.420566 0.769624 +v -0.300529 0.314207 0.794722 +v -0.203519 0.310185 0.813116 +v -0.301758 0.430748 0.794780 +v -0.231411 0.343737 0.806847 +v -0.258604 0.346317 0.791668 +v -0.273991 0.340635 0.818267 +v -0.218820 0.300648 0.838640 +v -0.286017 0.441703 0.758804 +v -0.204500 0.466461 0.797933 +v -0.301442 0.457152 0.781164 +v -0.204849 0.437477 0.812919 +v -0.274619 0.436385 0.809212 +v -0.219925 0.481909 0.820293 +v -0.220342 0.447659 0.838076 +v -0.216514 0.397846 0.780401 +v -0.214907 0.477232 0.726407 +v -0.243651 0.394737 0.765219 +v -0.263007 0.413697 0.860253 +v -0.242208 0.465357 0.716910 +v -0.247480 0.442022 0.823644 +v -0.231988 0.431840 0.798487 +v -0.259126 0.426203 0.784055 +v -0.290144 0.410588 0.845070 +v -0.214034 0.493903 0.701416 +v -0.259472 0.563123 0.745384 +v -0.241356 0.481631 0.692502 +v -0.260435 0.544702 0.772926 +v -0.230083 0.499722 0.741914 +v -0.286793 0.550850 0.736469 +v -0.287736 0.532827 0.763429 +v -0.285468 0.459568 0.743420 +v -0.282658 0.531591 0.644679 +v -0.300756 0.479628 0.761871 +v -0.203743 0.491315 0.776618 +v -0.297863 0.552450 0.662292 +v -0.257384 0.487847 0.732416 +v -0.272560 0.510337 0.747923 +v -0.219030 0.511375 0.795069 +v -0.245259 0.522212 0.757420 +v -0.282533 0.552889 0.620909 +v -0.200636 0.586824 0.651412 +v -0.297742 0.573252 0.639091 +v -0.200757 0.565906 0.674742 +v -0.255358 0.543029 0.654700 +v -0.270563 0.563889 0.672313 +v -0.215846 0.607186 0.669595 +v -0.215962 0.586766 0.692356 +v -0.213289 0.512354 0.674090 +v -0.212924 0.595982 0.576327 +v -0.243347 0.637354 0.611951 +v -0.240601 0.500320 0.664829 +v -0.258811 0.579374 0.721261 +v -0.240221 0.584275 0.566612 +v -0.243263 0.575327 0.682335 +v -0.228057 0.554468 0.664721 +v -0.286124 0.567340 0.712000 +v -0.213240 0.616187 0.552470 +v -0.258875 0.678347 0.605787 +v -0.240536 0.604359 0.542898 +v -0.258558 0.658040 0.629763 +v -0.228135 0.616668 0.594139 +v -0.255432 0.604961 0.584425 +v -0.286170 0.666519 0.596215 +v -0.285855 0.646333 0.620049 +v -0.270643 0.625647 0.602237 +v -0.282553 0.573243 0.597975 +v -0.284030 0.654217 0.503237 +v -0.229434 0.677700 0.522581 +v -0.297763 0.593776 0.615965 +v -0.200657 0.607784 0.627793 +v -0.299231 0.674532 0.521479 +v -0.215867 0.628317 0.645783 +v -0.284633 0.675603 0.479412 +v -0.202723 0.710206 0.509117 +v -0.299823 0.695505 0.498113 +v -0.202137 0.689441 0.532253 +v -0.271933 0.686273 0.531151 +v -0.217913 0.730109 0.527817 +v -0.217338 0.709756 0.550495 +v -0.244636 0.698014 0.540823 +v -0.213681 0.636555 0.528407 +v -0.216041 0.723428 0.434375 +v -0.246367 0.761233 0.473838 +v -0.240976 0.624705 0.518860 +v -0.259308 0.698375 0.582123 +v -0.243360 0.712481 0.423869 +v -0.256732 0.665959 0.512909 +v -0.286603 0.686525 0.572577 +v -0.216605 0.746989 0.412064 +v -0.262042 0.801544 0.473287 +v -0.243934 0.736437 0.401184 +v -0.261530 0.780136 0.493570 +v -0.231204 0.742330 0.454107 +v -0.289371 0.790992 0.462407 +v -0.288850 0.769189 0.483063 +v -0.273687 0.750286 0.463332 +v -0.285250 0.697657 0.455960 +v -0.287722 0.794906 0.368868 +v -0.300427 0.717078 0.475171 +v -0.203318 0.731438 0.486536 +v -0.302813 0.810984 0.391012 +v -0.258523 0.731383 0.443600 +v -0.218494 0.750859 0.505747 +v -0.288482 0.821323 0.349966 +v -0.206380 0.848653 0.386042 +v -0.303549 0.836580 0.372699 +v -0.205655 0.823437 0.404082 +v -0.275458 0.820494 0.402750 +v -0.221448 0.863909 0.408775 +v -0.220746 0.839515 0.426226 +v -0.248102 0.830004 0.414488 +v -0.217219 0.771876 0.390483 +v -0.220223 0.875999 0.316356 +v -0.250361 0.906614 0.361751 +v -0.244561 0.761841 0.379157 +v -0.262579 0.823338 0.454383 +v -0.247590 0.866863 0.304348 +v -0.233011 0.813927 0.392344 +v -0.260367 0.804417 0.380606 +v -0.289921 0.813302 0.443057 +v -0.220924 0.900296 0.299003 +v -0.266207 0.948891 0.365162 +v -0.248278 0.890725 0.287311 +v -0.265430 0.921921 0.384448 +v -0.235292 0.891306 0.339053 +v -0.293561 0.939320 0.353470 +v -0.292796 0.912785 0.372441 +v -0.289265 0.847558 0.332262 +v -0.291833 0.941450 0.259972 +v -0.237191 0.963251 0.281074 +v -0.304324 0.862539 0.355182 +v -0.207151 0.874486 0.368611 +v -0.306995 0.960370 0.279687 +v -0.262659 0.882170 0.327046 +v -0.277728 0.897478 0.349743 +v -0.222211 0.889467 0.391532 +v -0.292237 0.961796 0.238729 +v -0.210317 0.996237 0.268594 +v -0.307418 0.981520 0.257625 +v -0.209871 0.974151 0.291624 +v -0.225498 1.015960 0.287491 +v -0.225033 0.993072 0.311339 +v -0.252354 0.982171 0.300788 +v -0.221526 0.923008 0.280774 +v -0.225564 1.010774 0.192112 +v -0.248863 0.912796 0.269596 +v -0.266913 0.975542 0.343776 +v -0.252832 0.998680 0.182798 +v -0.264512 0.952350 0.270523 +v -0.294250 0.965330 0.332598 +v -0.279675 0.971271 0.290237 +v -0.228490 1.033931 0.169978 +v -0.273555 1.087592 0.232257 +v -0.255727 1.021580 0.160911 +v -0.270758 1.065493 0.253370 +v -0.240629 1.029014 0.212531 +v -0.267897 1.016920 0.203217 +v -0.300792 1.075241 0.223190 +v -0.298026 1.053399 0.244055 +v -0.293134 0.982681 0.216099 +v -0.304045 1.069414 0.130365 +v -0.249756 1.095416 0.147182 +v -0.308287 1.001899 0.235532 +v -0.211264 1.018230 0.244783 +v -0.319263 1.088690 0.149688 +v -0.282961 1.035160 0.223636 +v -0.226417 1.037447 0.264216 +v -0.255693 1.047253 0.232950 +v -0.306373 1.087734 0.108547 +v -0.225100 1.128056 0.132168 +v -0.321836 1.109026 0.125402 +v -0.222611 1.108418 0.155590 +v -0.276901 1.082415 0.138773 +v -0.292119 1.101691 0.158097 +v -0.240563 1.149348 0.149023 +v -0.237830 1.127694 0.174914 +v -0.231628 1.055970 0.148693 +v -0.236727 1.111377 0.072006 +v -0.258823 1.043324 0.139913 +v -0.276826 1.110564 0.210059 +v -0.263875 1.096975 0.066341 +v -0.264974 1.114692 0.166505 +v -0.304021 1.097918 0.201279 +v -0.234238 1.111469 0.058055 +v -0.272793 1.192672 0.031436 +v -0.261675 1.097090 0.053931 +v -0.281791 1.193201 0.079951 +v -0.278897 1.124249 0.068990 +v -0.300231 1.178294 0.027313 +v -0.308940 1.178799 0.074286 +v -0.307465 1.102395 0.086057 +v -0.281964 1.086226 -0.009121 +v -0.228175 1.116290 0.001330 +v -0.323093 1.126656 0.098047 +v -0.226281 1.144264 0.107158 +v -0.291445 1.109602 -0.027567 +v -0.251748 1.138652 0.074654 +v -0.293918 1.151524 0.071638 +v -0.241909 1.168524 0.119148 +v -0.266770 1.165926 0.077303 +v -0.267839 1.071221 -0.033635 +v -0.188818 1.118106 -0.015022 +v -0.276338 1.093544 -0.053785 +v -0.201281 1.131321 0.006556 +v -0.264551 1.124634 -0.022341 +v -0.197316 1.140429 -0.035172 +v -0.210762 1.154697 -0.011889 +v -0.228455 1.104539 0.040648 +v -0.179859 1.051203 -0.037603 +v -0.255928 1.090181 0.036687 +v -0.260334 1.178693 -0.007037 +v -0.206002 1.035371 -0.044118 +v -0.237656 1.139666 -0.017115 +v -0.255069 1.101258 -0.003895 +v -0.287806 1.164336 -0.010998 +v -0.166007 1.034322 -0.052817 +v -0.178035 1.085871 -0.130193 +v -0.192443 1.018852 -0.059014 +v -0.196963 1.108998 -0.109409 +v -0.211704 1.054636 -0.068053 +v -0.204471 1.070400 -0.136390 +v -0.223107 1.093166 -0.115924 +v -0.217405 1.073901 -0.091989 +v -0.252969 1.055583 -0.055433 +v -0.194828 0.979152 -0.115587 +v -0.260192 1.076553 -0.077448 +v -0.174676 1.103238 -0.035728 +v -0.195391 0.991224 -0.144405 +v -0.185560 1.070468 -0.061538 +v -0.181899 1.124208 -0.057744 +v -0.191262 1.089733 -0.085473 +v -0.182236 0.956023 -0.123792 +v -0.097964 0.994394 -0.109132 +v -0.181284 0.965324 -0.153611 +v -0.112356 1.020821 -0.099742 +v -0.167900 1.005114 -0.139124 +v -0.097011 1.003695 -0.138951 +v -0.112918 1.032893 -0.128561 +v -0.152373 1.015561 -0.065730 +v -0.105477 0.922607 -0.093235 +v -0.098978 0.930718 -0.154864 +v -0.179285 1.000752 -0.071477 +v -0.159135 1.059814 -0.148101 +v -0.134605 0.912196 -0.097676 +v -0.140409 1.019003 -0.133842 +v -0.139847 1.006931 -0.105023 +v -0.167337 0.993042 -0.110305 +v -0.186046 1.045005 -0.153848 +v -0.096219 0.896096 -0.094822 +v -0.084064 0.901252 -0.187638 +v -0.125745 0.886844 -0.099203 +v -0.095729 0.934773 -0.185679 +v -0.113590 0.892000 -0.192018 +v -0.124857 0.924363 -0.190121 +v -0.128106 0.920307 -0.159306 +v -0.170788 0.931499 -0.129477 +v -0.134966 0.822646 -0.133108 +v -0.075130 0.838385 -0.124270 +v -0.168562 0.938094 -0.159942 +v -0.084845 0.966313 -0.115662 +v -0.130162 0.821715 -0.163973 +v -0.102227 0.926662 -0.124049 +v -0.131356 0.916252 -0.128491 +v -0.082619 0.972908 -0.146127 +v -0.126358 0.792614 -0.132354 +v -0.036603 0.816224 -0.119097 +v -0.121554 0.791683 -0.163219 +v -0.045212 0.846255 -0.119851 +v -0.105048 0.830516 -0.128689 +v -0.100244 0.829584 -0.159554 +v -0.031799 0.815292 -0.149961 +v -0.040408 0.845324 -0.150715 +v -0.070326 0.837454 -0.155134 +vn -0.0000 -0.0000 -1.0000 +vn -1.0000 -0.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 1.0000 -0.0000 +vn 0.0007 1.0000 -0.0001 +vn -0.0000 1.0000 0.0007 +vn -0.0000 -0.7071 -0.7071 +vn -0.0000 0.7071 0.7071 +vn -0.0000 0.7071 -0.7071 +vn -0.0000 -0.7071 0.7071 +vn -0.0001 1.0000 -0.0001 +vn -0.4816 0.8580 0.1789 +vn -0.2861 -0.3648 0.8860 +vn 0.8259 0.3750 0.4211 +vn 0.4892 -0.8475 -0.2061 +vn 0.2861 0.3648 -0.8860 +vn -0.8259 -0.3750 -0.4211 +vn 0.4816 -0.8580 -0.1789 +vn -0.2861 -0.3647 0.8861 +vn 0.2860 0.3649 -0.8860 +vn 0.8265 0.3740 0.4208 +vn 0.2538 0.4198 -0.8714 +vn 0.4991 -0.8318 -0.2430 +vn 0.8263 0.3742 0.4209 +vn -0.8263 -0.3742 -0.4209 +vn -0.2537 -0.4198 0.8714 +vn -0.8265 -0.3740 -0.4208 +vn 0.5019 -0.8267 -0.2543 +vn -0.5019 0.8267 0.2543 +vn 0.8271 0.3729 0.4205 +vn -0.8271 -0.3729 -0.4205 +vn -0.4977 0.8341 0.2378 +vn -0.2728 -0.3877 0.8805 +vn 0.8241 0.3783 0.4217 +vn 0.4454 -0.8929 -0.0657 +vn 0.8270 0.3731 0.4205 +vn -0.2675 -0.3966 0.8782 +vn 0.2691 0.3938 -0.8789 +vn -0.8241 -0.3783 -0.4217 +vn 0.2723 0.3885 -0.8803 +vn 0.4698 -0.8716 -0.1399 +vn -0.8270 -0.3731 -0.4205 +vn -0.3344 -0.2759 0.9012 +vn 0.3341 0.2763 -0.9011 +vn -0.4885 0.8485 0.2035 +vn 0.8257 0.3752 0.4212 +vn 0.3736 0.1976 -0.9063 +vn 0.3731 -0.9266 -0.0462 +vn 0.2959 0.3473 -0.8898 +vn 0.8256 0.3748 0.4218 +vn -0.8255 -0.3751 -0.4218 +vn -0.3738 -0.1972 0.9063 +vn -0.8256 -0.3747 -0.4218 +vn 0.3954 -0.9182 -0.0253 +vn -0.3954 0.9182 0.0253 +vn -0.2958 -0.3476 0.8898 +vn 0.8446 0.3313 0.4205 +vn -0.8447 -0.3310 -0.4206 +vn -0.4194 0.9077 0.0131 +vn -0.3818 -0.1787 0.9068 +vn 0.8462 0.3294 0.4188 +vn 0.3109 -0.9359 0.1658 +vn 0.8299 0.3655 0.4215 +vn -0.3802 -0.1797 0.9073 +vn 0.3810 0.1777 -0.9073 +vn -0.8462 -0.3296 -0.4188 +vn 0.3806 0.1789 -0.9073 +vn 0.3333 -0.9421 0.0373 +vn -0.8299 -0.3654 -0.4216 +vn -0.4207 -0.0656 0.9048 +vn 0.4226 0.0603 -0.9043 +vn -0.3527 0.9352 0.0313 +vn 0.8207 0.3927 0.4149 +vn 0.5908 -0.4840 -0.6455 +vn 0.1706 -0.6063 0.7767 +vn 0.3931 0.1459 -0.9078 +vn 0.8179 0.3718 0.4391 +vn -0.8268 -0.3736 -0.4206 +vn -0.5911 0.4851 0.6444 +vn -0.8216 -0.3906 -0.4151 +vn 0.2284 -0.7689 0.5972 +vn -0.2284 0.7689 -0.5972 +vn -0.3930 -0.1466 0.9078 +vn 0.7780 0.5456 0.3115 +vn -0.7782 -0.5445 -0.3128 +vn -0.2777 0.8865 -0.3702 +vn -0.6113 0.6373 0.4692 +vn 0.7539 0.6547 0.0556 +vn -0.0983 0.0957 0.9905 +vn 0.8024 0.4618 0.3780 +vn -0.5739 0.5759 0.5821 +vn 0.5771 -0.5827 -0.5721 +vn -0.7538 -0.6549 -0.0541 +vn 0.6105 -0.6357 -0.4725 +vn -0.0078 -0.1466 0.9892 +vn -0.8031 -0.4606 -0.3779 +vn -0.6504 0.7591 -0.0249 +vn 0.6503 -0.7594 0.0193 +vn -0.0963 0.4119 -0.9061 +vn 0.7505 0.6608 -0.0080 +vn 0.6137 -0.7090 0.3474 +vn -0.1705 0.2971 0.9395 +vn 0.6520 -0.7220 -0.2314 +vn 0.7515 0.6594 0.0204 +vn -0.7490 -0.6619 -0.0303 +vn -0.6137 0.7090 -0.3474 +vn -0.7591 -0.6509 0.0112 +vn -0.1714 0.2999 0.9384 +vn 0.1714 -0.2999 -0.9384 +vn -0.6511 0.7248 0.2251 +vn 0.7701 0.6346 -0.0653 +vn -0.7701 -0.6346 0.0653 +vn 0.1499 -0.2391 -0.9594 +vn -0.6206 0.7213 -0.3076 +vn 0.7597 0.6503 0.0042 +vn -0.1041 0.1051 0.9890 +vn 0.7682 0.6379 -0.0548 +vn -0.6191 0.7225 -0.3077 +vn 0.6198 -0.7201 0.3119 +vn -0.7597 -0.6503 -0.0043 +vn 0.6208 -0.7218 0.3060 +vn -0.1235 0.1630 0.9789 +vn -0.7681 -0.6380 0.0552 +vn -0.6409 0.7503 -0.1620 +vn 0.6412 -0.7507 0.1593 +vn 0.1541 -0.2497 -0.9560 +vn 0.7587 0.6514 0.0111 +vn 0.6420 -0.7515 0.1521 +vn -0.1094 0.1064 0.9883 +vn 0.6299 -0.7363 0.2472 +vn 0.7602 0.6497 0.0014 +vn -0.7583 -0.6519 -0.0009 +vn -0.6420 0.7515 -0.1521 +vn -0.7587 -0.6513 -0.0110 +vn -0.1086 0.1050 0.9885 +vn 0.1086 -0.1050 -0.9885 +vn -0.6299 0.7363 -0.2472 +vn 0.7589 0.6511 0.0140 +vn -0.7589 -0.6511 -0.0140 +vn 0.1049 -0.1001 -0.9894 +vn -0.6423 0.7518 -0.1487 +vn -0.0907 0.0843 0.9923 +vn 0.7588 0.6511 0.0143 +vn -0.6424 0.7519 -0.1485 +vn 0.6424 -0.7519 0.1485 +vn 0.6424 -0.7519 0.1487 +vn -0.0997 0.0951 0.9905 +vn -0.7588 -0.6511 -0.0143 +vn -0.6443 0.7537 -0.1297 +vn 0.6443 -0.7537 0.1297 +vn 0.1063 -0.1029 -0.9890 +vn 0.6472 -0.7563 0.0956 +vn -0.0616 0.0718 0.9955 +vn 0.6429 -0.7524 0.1435 +vn -0.6472 0.7563 -0.0956 +vn -0.0719 0.0672 0.9951 +vn 0.0719 -0.0672 -0.9951 +vn -0.6429 0.7524 -0.1435 +vn 0.7594 0.6506 0.0059 +vn -0.7594 -0.6506 -0.0059 +vn 0.0812 -0.0727 -0.9940 +vn -0.6475 0.7566 -0.0908 +vn 0.7602 0.6497 -0.0052 +vn -0.0373 0.0413 0.9985 +vn 0.7589 0.6511 0.0139 +vn -0.6473 0.7565 -0.0934 +vn 0.6473 -0.7565 0.0934 +vn -0.7602 -0.6497 0.0052 +vn 0.6475 -0.7566 0.0907 +vn -0.0422 0.0639 0.9971 +vn -0.7589 -0.6511 -0.0139 +vn -0.6485 0.7583 -0.0661 +vn 0.6485 -0.7583 0.0661 +vn 0.0512 -0.0732 -0.9960 +vn 0.7592 0.6507 0.0127 +vn 0.6511 -0.7589 -0.0033 +vn -0.0446 -0.0654 0.9969 +vn 0.6478 -0.7572 0.0839 +vn 0.7592 0.6508 0.0072 +vn -0.7592 -0.6508 -0.0067 +vn -0.6512 0.7589 0.0035 +vn -0.7592 -0.6508 -0.0128 +vn -0.0405 -0.0242 0.9989 +vn 0.0405 0.0242 -0.9989 +vn -0.6478 0.7572 -0.0838 +vn 0.7576 0.6500 0.0602 +vn -0.7576 -0.6500 -0.0601 +vn 0.0371 -0.0099 -0.9993 +vn -0.6520 0.7560 0.0580 +vn 0.7513 0.6251 0.2118 +vn -0.0297 -0.3133 0.9492 +vn 0.7587 0.6506 0.0329 +vn -0.6484 0.7602 0.0419 +vn 0.6508 -0.7583 -0.0364 +vn -0.7513 -0.6250 -0.2120 +vn 0.6520 -0.7559 -0.0593 +vn -0.0340 -0.2480 0.9682 +vn -0.7587 -0.6506 -0.0329 +vn -0.6588 0.7262 0.1965 +vn 0.6589 -0.7259 -0.1974 +vn 0.0416 0.1475 -0.9882 +vn 0.7504 0.6211 0.2262 +vn 0.6552 -0.7443 -0.1291 +vn -0.0551 -0.1422 0.9883 +vn 0.6560 -0.7432 -0.1316 +vn 0.7518 0.6252 0.2096 +vn -0.7483 -0.6285 -0.2120 +vn -0.6552 0.7442 0.1294 +vn -0.7504 -0.6211 -0.2260 +vn -0.0398 -0.2707 0.9618 +vn 0.0398 0.2707 -0.9618 +vn -0.6563 0.7432 0.1304 +vn 0.7526 0.6350 0.1743 +vn -0.7528 -0.6349 -0.1739 +vn 0.0314 0.3231 -0.9458 +vn -0.6389 0.7693 -0.0054 +vn 0.7729 0.6260 -0.1038 +vn -0.1073 0.3407 0.9340 +vn 0.7508 0.6198 0.2285 +vn -0.6320 0.7727 0.0590 +vn 0.6332 -0.7727 -0.0443 +vn -0.7729 -0.6260 0.1036 +vn 0.6363 -0.7714 0.0047 +vn -0.0886 0.2078 0.9741 +vn -0.7510 -0.6194 -0.2289 +vn -0.6254 0.7298 -0.2761 +vn 0.6253 -0.7302 0.2753 +vn 0.0729 -0.0354 -0.9967 +vn 0.7751 0.6074 -0.1742 +vn 0.5739 -0.5308 0.6236 +vn -0.1232 0.7655 0.6315 +vn 0.6362 -0.7558 0.1549 +vn 0.7630 0.6305 -0.1427 +vn -0.7629 -0.6305 0.1427 +vn -0.5740 0.5309 -0.6235 +vn -0.7751 -0.6077 0.1731 +vn -0.1333 0.6156 0.7767 +vn -0.6349 0.7561 -0.1587 +vn 0.8052 0.4922 -0.3307 +vn -0.8055 -0.4914 0.3312 +vn 0.1261 -0.4642 -0.8767 +vn -0.5395 0.4234 -0.7278 +vn 0.8432 0.1701 -0.5100 +vn -0.0560 0.9857 0.1587 +vn 0.7902 0.5639 -0.2401 +vn -0.5316 0.4929 -0.6888 +vn 0.5316 -0.4933 0.6885 +vn -0.8432 -0.1702 0.5100 +vn 0.5380 -0.4232 0.7290 +vn -0.0672 0.9542 0.2914 +vn -0.7904 -0.5638 0.2397 +vn -0.5323 0.1595 -0.8314 +vn 0.5323 -0.1594 0.8314 +vn 0.0976 -0.8784 -0.4679 +vn 0.8424 0.0801 -0.5328 +vn 0.5167 0.2015 0.8321 +vn -0.0151 0.9610 -0.2762 +vn 0.5404 -0.2880 0.7906 +vn 0.8339 0.1299 -0.5365 +vn -0.8330 -0.1346 0.5367 +vn -0.5166 -0.2021 -0.8320 +vn -0.8424 -0.0802 0.5328 +vn -0.0290 0.9879 -0.1526 +vn 0.0290 -0.9879 0.1526 +vn -0.5416 0.2907 -0.7888 +vn 0.8550 -0.0988 -0.5092 +vn -0.8549 0.0976 0.5095 +vn 0.0431 -0.9991 -0.0006 +vn -0.5107 -0.2754 -0.8145 +vn 0.8562 -0.2320 -0.4617 +vn 0.0164 0.9017 -0.4321 +vn 0.8522 -0.0129 -0.5231 +vn -0.5117 -0.2388 -0.8253 +vn 0.5036 0.2269 0.8336 +vn -0.8562 0.2321 0.4617 +vn 0.5105 0.2771 0.8140 +vn 0.0077 0.9106 -0.4132 +vn -0.8519 0.0136 0.5235 +vn -0.5165 -0.3638 -0.7751 +vn 0.5164 0.3634 0.7754 +vn 0.0027 -0.9320 0.3625 +vn 0.8561 -0.2338 -0.4609 +vn 0.5138 0.2770 0.8119 +vn 0.0329 0.9555 -0.2930 +vn 0.5162 0.3372 0.7873 +vn 0.8563 -0.2274 -0.4638 +vn -0.8563 0.2267 0.4641 +vn -0.5138 -0.2758 -0.8124 +vn -0.8560 0.2338 0.4612 +vn 0.0289 0.9278 -0.3719 +vn -0.0289 -0.9278 0.3720 +vn -0.5160 -0.3380 -0.7871 +vn 0.8570 -0.2001 -0.4750 +vn -0.8569 0.2005 0.4748 +vn -0.0234 -0.9082 0.4179 +vn -0.5074 -0.1877 -0.8410 +vn 0.8632 -0.0140 -0.5046 +vn 0.0336 0.9928 0.1147 +vn 0.8563 -0.2287 -0.4631 +vn -0.5013 -0.2196 -0.8369 +vn 0.5091 0.2302 0.8293 +vn -0.8632 0.0142 0.5046 +vn 0.5072 0.1854 0.8417 +vn 0.0351 0.9986 -0.0386 +vn 0.0351 0.9986 -0.0387 +vn -0.8562 0.2285 0.4633 +vn -0.5014 0.0445 -0.8641 +vn 0.5020 -0.0409 0.8639 +vn -0.0351 -0.9830 0.1800 +vn 0.8608 0.0652 -0.5047 +vn 0.4874 -0.4337 0.7578 +vn 0.0433 0.8410 0.5393 +vn 0.5065 0.0837 0.8582 +vn 0.8543 0.0280 -0.5190 +vn -0.8543 -0.0278 0.5190 +vn -0.4874 0.4334 -0.7580 +vn -0.8605 -0.0655 0.5053 +vn 0.0368 0.9138 0.4046 +vn -0.0368 -0.9138 -0.4046 +vn -0.5060 -0.0822 -0.8586 +vn 0.8711 0.2030 -0.4472 +vn -0.8710 -0.2032 0.4474 +vn -0.0327 -0.9650 -0.2601 +vn -0.4742 0.5437 -0.6925 +vn 0.8794 0.3326 -0.3407 +vn 0.0541 0.6185 0.7839 +vn 0.8683 0.1436 -0.4748 +vn -0.4740 0.4886 -0.7326 +vn 0.4745 -0.4953 0.7277 +vn -0.8794 -0.3326 0.3406 +vn 0.4769 -0.5421 0.6919 +vn 0.0522 0.6764 0.7347 +vn 0.0523 0.6764 0.7347 +vn -0.8687 -0.1421 0.4745 +vn -0.4725 0.6910 -0.5470 +vn 0.4725 -0.6921 0.5457 +vn -0.0487 -0.7559 -0.6529 +vn 0.8799 0.3459 -0.3257 +vn 0.4702 -0.7194 0.5112 +vn 0.0527 0.6241 0.7796 +vn 0.4764 -0.6336 0.6096 +vn 0.8795 0.3352 -0.3377 +vn -0.8771 -0.3393 0.3401 +vn -0.4702 0.7196 -0.5110 +vn -0.8799 -0.3457 0.3259 +vn 0.0542 0.5924 0.8038 +vn -0.0542 -0.5924 -0.8038 +vn -0.4767 0.6326 -0.6103 +vn 0.8808 0.3476 -0.3214 +vn -0.8809 -0.3474 0.3214 +vn -0.0546 -0.5900 -0.8056 +vn -0.4724 0.6811 -0.5595 +vn 0.8748 0.2655 -0.4052 +vn 0.0412 0.8262 0.5619 +vn 0.8814 0.3530 -0.3139 +vn -0.4676 0.6977 -0.5428 +vn 0.4683 -0.6934 0.5476 +vn -0.8748 -0.2655 0.4052 +vn 0.4701 -0.6825 0.5597 +vn 0.0463 0.7516 0.6580 +vn 0.0463 0.7516 0.6579 +vn -0.8814 -0.3530 0.3138 +vn -0.4811 0.5539 -0.6795 +vn 0.4812 -0.5536 0.6797 +vn -0.0502 -0.6800 -0.7315 +vn 0.8702 0.2273 -0.4371 +vn 0.4908 -0.3424 0.8012 +vn 0.0246 0.9408 0.3380 +vn 0.4765 -0.6320 0.6112 +vn 0.8707 0.2481 -0.4246 +vn -0.8707 -0.2491 0.4241 +vn -0.4908 0.3428 -0.8010 +vn -0.8715 -0.2249 0.4358 +vn 0.0304 0.9134 0.4058 +vn -0.0304 -0.9134 -0.4058 +vn -0.4766 0.6326 -0.6105 +vn 0.8706 0.1640 -0.4639 +vn -0.8707 -0.1638 0.4637 +vn -0.0363 -0.8778 -0.4776 +vn -0.4895 0.2349 -0.8398 +vn 0.8665 -0.0474 -0.4969 +vn 0.0015 0.9834 -0.1814 +vn 0.8715 0.1875 -0.4532 +vn -0.4759 0.2857 -0.8318 +vn 0.4780 -0.2713 0.8354 +vn -0.8665 0.0474 0.4969 +vn 0.4824 -0.2379 0.8430 +vn 0.0087 0.9999 0.0144 +vn 0.0087 0.9999 0.0143 +vn -0.8713 -0.1873 0.4535 +vn -0.4957 -0.0747 -0.8653 +vn 0.4955 0.0727 0.8656 +vn -0.0172 -0.9783 -0.2064 +vn 0.8587 -0.1360 -0.4941 +vn 0.4903 0.5622 0.6660 +vn -0.0292 0.7082 -0.7054 +vn 0.4941 -0.1027 0.8633 +vn 0.8497 -0.0942 -0.5188 +vn -0.8511 0.0937 0.5166 +vn -0.4903 -0.5629 -0.6654 +vn -0.8587 0.1358 0.4941 +vn -0.0198 0.8372 -0.5466 +vn 0.0198 -0.8372 0.5466 +vn -0.4941 0.1027 -0.8633 +vn 0.8692 -0.2974 -0.3951 +vn -0.8691 0.2967 0.3958 +vn 0.0070 -0.9343 0.3563 +vn -0.4790 -0.6508 -0.5891 +vn 0.8733 -0.3734 -0.3128 +vn -0.0156 0.6388 -0.7693 +vn 0.8668 -0.2140 -0.4503 +vn -0.4847 -0.6121 -0.6249 +vn 0.4698 0.5901 0.6565 +vn -0.8733 0.3735 0.3127 +vn 0.4782 0.6554 0.5847 +vn -0.0254 0.5981 -0.8010 +vn -0.8671 0.2132 0.4503 +vn -0.4864 -0.6965 -0.5275 +vn 0.4866 0.6972 0.5264 +vn 0.0307 -0.6171 0.7863 +vn 0.8725 -0.3610 -0.3291 +vn 0.4879 0.6400 0.5936 +vn 0.0045 0.6729 -0.7397 +vn 0.4862 0.7079 0.5123 +vn 0.8728 -0.3643 -0.3247 +vn -0.8728 0.3644 0.3247 +vn -0.4879 -0.6400 -0.5936 +vn -0.8726 0.3611 0.3290 +vn -0.0001 0.6872 -0.7265 +vn 0.0001 -0.6872 0.7265 +vn -0.4861 -0.7082 -0.5120 +vn 0.8729 -0.3595 -0.3299 +vn -0.8729 0.3595 0.3299 +vn 0.0052 -0.6889 0.7248 +vn -0.4878 -0.6472 -0.5858 +vn 0.8727 -0.3763 -0.3111 +vn 0.0168 0.6620 -0.7493 +vn 0.8729 -0.3499 -0.3400 +vn -0.4877 -0.6428 -0.5907 +vn 0.4877 0.6428 0.5907 +vn -0.8727 0.3763 0.3111 +vn 0.4878 0.6473 0.5858 +vn 0.0136 0.6574 -0.7534 +vn -0.8729 0.3499 0.3400 +vn -0.4880 -0.6519 -0.5805 +vn 0.4880 0.6519 0.5804 +vn -0.0092 -0.6621 0.7494 +vn 0.8728 -0.3729 -0.3150 +vn 0.4869 0.6148 0.6204 +vn 0.0186 0.7122 -0.7018 +vn 0.4880 0.6531 0.5791 +vn 0.8727 -0.3731 -0.3149 +vn -0.8727 0.3732 0.3148 +vn -0.4869 -0.6148 -0.6204 +vn -0.8727 0.3729 0.3151 +vn 0.0193 0.6919 -0.7218 +vn -0.4880 -0.6531 -0.5791 +vn 0.8732 -0.3582 -0.3305 +vn -0.8732 0.3582 0.3305 +vn -0.0188 -0.6741 0.7384 +vn -0.4861 -0.5964 -0.6387 +vn 0.8741 -0.3186 -0.3666 +vn 0.0208 0.7939 -0.6077 +vn 0.8729 -0.3680 -0.3202 +vn -0.4858 -0.6055 -0.6304 +vn 0.4862 0.6059 0.6297 +vn -0.8741 0.3186 0.3666 +vn 0.4861 0.5963 0.6389 +vn 0.0185 0.7620 -0.6473 +vn 0.0185 0.7620 -0.6474 +vn -0.8729 0.3680 0.3203 +vn -0.4851 -0.5428 -0.6856 +vn 0.4851 0.5430 0.6855 +vn -0.0177 -0.7341 0.6788 +vn 0.8741 -0.3025 -0.3800 +vn 0.4830 0.4646 0.7421 +vn 0.0247 0.8386 -0.5442 +vn 0.4859 0.5756 0.6577 +vn 0.8738 -0.3112 -0.3736 +vn -0.8736 0.3113 0.3740 +vn -0.4830 -0.4647 -0.7421 +vn -0.8741 0.3026 0.3799 +vn 0.0245 0.8360 -0.5481 +vn -0.0245 -0.8360 0.5481 +vn -0.4859 -0.5755 -0.6578 +vn 0.8752 -0.2803 -0.3942 +vn -0.8752 0.2803 0.3942 +vn -0.0231 -0.8207 0.5709 +vn -0.4834 -0.4788 -0.7328 +vn 0.8742 -0.3165 -0.3683 +vn 0.0180 0.7587 -0.6512 +vn 0.8750 -0.2861 -0.3905 +vn -0.4829 -0.4780 -0.7337 +vn 0.4829 0.4787 0.7332 +vn -0.8742 0.3166 0.3683 +vn 0.4829 0.4788 0.7331 +vn 0.0212 0.7981 -0.6022 +vn 0.0213 0.7981 -0.6022 +vn 0.0212 0.7980 -0.6022 +vn -0.8751 0.2861 0.3904 +vn -0.4849 -0.5381 -0.6895 +vn 0.4849 0.5385 0.6891 +vn -0.0236 -0.8261 0.5631 +vn 0.8728 -0.3400 -0.3501 +vn 0.4866 0.6106 0.6249 +vn 0.0580 0.7115 -0.7003 +vn 0.4839 0.4998 0.7183 +vn 0.8732 -0.3300 -0.3587 +vn -0.8732 0.3301 0.3586 +vn -0.4866 -0.6104 -0.6250 +vn -0.8734 0.3396 0.3491 +vn 0.0270 0.6935 -0.7199 +vn -0.4840 -0.4997 -0.7184 +vn 0.8727 -0.3736 -0.3144 +vn -0.8727 0.3735 0.3145 +vn -0.0146 -0.7124 0.7017 +vn -0.4848 -0.5814 -0.6534 +vn 0.8698 -0.3984 -0.2910 +vn 0.0996 0.7085 -0.6986 +vn 0.8732 -0.3611 -0.3273 +vn -0.4859 -0.5923 -0.6427 +vn 0.4863 0.5926 0.6421 +vn -0.8698 0.3984 0.2910 +vn 0.4848 0.5816 0.6532 +vn 0.0989 0.7278 -0.6787 +vn 0.0989 0.7277 -0.6787 +vn -0.8732 0.3613 0.3271 +vn -0.4825 -0.5646 -0.6696 +vn 0.4825 0.5650 0.6693 +vn -0.0851 -0.7284 0.6798 +vn 0.8680 -0.4103 -0.2797 +vn 0.5004 0.7558 0.4224 +vn -0.0385 0.3793 -0.9245 +vn 0.4818 0.5593 0.6745 +vn 0.8669 -0.4077 -0.2868 +vn -0.8690 0.4048 0.2846 +vn -0.5004 -0.7545 -0.4247 +vn -0.8680 0.4102 0.2798 +vn 0.0454 0.5722 -0.8189 +vn -0.0454 -0.5722 0.8189 +vn -0.4819 -0.5593 -0.6745 +vn 0.8647 -0.4422 -0.2382 +vn -0.8648 0.4420 0.2382 +vn -0.0845 -0.6634 0.7435 +vn -0.4726 -0.8715 -0.1308 +vn 0.8786 -0.4579 -0.1355 +vn -0.3658 -0.3771 -0.8509 +vn 0.8663 -0.4232 -0.2653 +vn -0.4761 -0.8178 -0.3232 +vn 0.4775 0.8480 0.2300 +vn -0.8787 0.4578 0.1351 +vn 0.4747 0.8684 0.1433 +vn -0.2776 -0.2588 -0.9252 +vn -0.8665 0.4226 0.2656 +vn -0.3469 -0.8067 0.4784 +vn 0.3541 0.8151 -0.4585 +vn 0.1628 -0.0615 0.9847 +vn 0.8568 -0.4751 -0.2006 +vn 0.2800 0.7501 -0.5991 +vn -0.5447 -0.4299 -0.7200 +vn 0.4256 0.8796 -0.2127 +vn 0.8579 -0.4775 -0.1900 +vn -0.8598 0.4755 0.1863 +vn -0.2801 -0.7502 0.5989 +vn -0.8529 0.4825 0.1994 +vn -0.5057 -0.3784 -0.7753 +vn 0.5057 0.3784 0.7753 +vn -0.4201 -0.8787 0.2267 +vn 0.8005 -0.5268 -0.2859 +vn -0.8002 0.5268 0.2867 +vn 0.4460 0.3694 0.8153 +vn -0.2243 -0.7033 0.6746 +vn 0.8294 -0.4964 -0.2561 +vn -0.5356 -0.7179 -0.4448 +vn 0.8203 -0.5116 -0.2556 +vn -0.2452 -0.7296 0.6384 +vn 0.2393 0.7244 -0.6465 +vn -0.8295 0.4964 0.2560 +vn 0.2196 0.7065 -0.6728 +vn -0.5624 -0.6131 -0.5548 +vn -0.8202 0.5117 0.2558 +vn -0.0777 -0.5591 0.8255 +vn 0.0773 0.5586 -0.8259 +vn 0.5648 0.5117 0.6474 +vn 0.8585 -0.4611 -0.2246 +vn -0.1249 0.2282 -0.9656 +vn -0.3670 -0.9229 -0.1169 +vn 0.1574 0.6457 -0.7472 +vn 0.8452 -0.4823 -0.2303 +vn -0.8463 0.4806 0.2299 +vn 0.1251 -0.2277 0.9657 +vn -0.8585 0.4607 0.2253 +vn -0.4285 -0.8775 -0.2153 +vn 0.4285 0.8775 0.2153 +vn -0.1583 -0.6461 0.7466 +vn 0.9097 -0.3629 -0.2019 +vn -0.9096 0.3632 0.2019 +vn 0.4878 0.8093 0.3273 +vn 0.1643 -0.1423 0.9761 +vn 0.9414 -0.2751 -0.1949 +vn -0.2445 -0.9684 0.0496 +vn 0.8859 -0.4118 -0.2136 +vn 0.1494 -0.1876 0.9708 +vn -0.1491 0.1976 -0.9689 +vn -0.9412 0.2761 0.1949 +vn -0.1649 0.1411 -0.9762 +vn -0.2571 -0.9658 0.0336 +vn -0.8861 0.4116 0.2133 +vn 0.1891 -0.0512 0.9806 +vn -0.1897 0.0490 -0.9806 +vn 0.3084 0.9507 0.0334 +vn 0.9413 -0.2756 -0.1949 +vn -0.1894 0.0503 -0.9806 +vn -0.1889 0.0506 -0.9807 +vn 0.9414 -0.2756 -0.1945 +vn -0.9413 0.2756 0.1948 +vn 0.1894 -0.0503 0.9806 +vn -0.9413 0.2757 0.1949 +vn 0.2445 0.9684 -0.0496 +vn 0.1893 -0.0499 0.9806 +vn -0.9414 0.2756 0.1945 +vn 0.4814 0.8577 0.1808 +vn 0.2886 -0.3679 0.8840 +vn -0.8251 0.3728 0.4245 +vn -0.4890 -0.8471 -0.2081 +vn -0.2886 0.3679 -0.8840 +vn 0.8251 -0.3728 -0.4245 +vn -0.4814 -0.8577 -0.1808 +vn 0.2886 -0.3678 0.8840 +vn -0.2885 0.3679 -0.8840 +vn -0.8258 0.3716 0.4243 +vn -0.2562 0.4230 -0.8692 +vn -0.4988 -0.8313 -0.2452 +vn -0.8256 0.3719 0.4243 +vn 0.8256 -0.3719 -0.4243 +vn 0.2561 -0.4231 0.8691 +vn 0.8258 -0.3716 -0.4243 +vn -0.5017 -0.8262 -0.2565 +vn 0.5017 0.8262 0.2565 +vn -0.8265 0.3704 0.4239 +vn 0.8265 -0.3704 -0.4239 +vn 0.4975 0.8336 0.2400 +vn 0.2752 -0.3908 0.8784 +vn -0.8230 0.3766 0.4252 +vn -0.4454 -0.8928 -0.0673 +vn -0.8264 0.3705 0.4239 +vn 0.2700 -0.3999 0.8759 +vn -0.2717 0.3970 -0.8767 +vn 0.8230 -0.3766 -0.4252 +vn -0.2748 0.3918 -0.8781 +vn -0.4697 -0.8714 -0.1417 +vn 0.8264 -0.3705 -0.4239 +vn 0.3369 -0.2789 0.8993 +vn -0.3367 0.2793 -0.8992 +vn 0.4884 0.8481 0.2056 +vn -0.8243 0.3736 0.4253 +vn -0.3768 0.1992 -0.9046 +vn -0.3732 -0.9266 -0.0465 +vn -0.2984 0.3504 -0.8878 +vn -0.8246 0.3736 0.4247 +vn 0.8245 -0.3739 -0.4248 +vn 0.3768 -0.1992 0.9046 +vn 0.8245 -0.3738 -0.4247 +vn -0.3954 -0.9181 -0.0259 +vn 0.3954 0.9181 0.0259 +vn 0.2983 -0.3506 0.8877 +vn -0.8432 0.3304 0.4241 +vn 0.8433 -0.3301 -0.4242 +vn 0.4195 0.9077 0.0142 +vn 0.3841 -0.1795 0.9057 +vn -0.8445 0.3292 0.4224 +vn -0.3110 -0.9359 0.1657 +vn -0.8285 0.3644 0.4252 +vn 0.3844 -0.1820 0.9051 +vn -0.3853 0.1801 -0.9051 +vn 0.8445 -0.3294 -0.4224 +vn -0.3846 0.1811 -0.9051 +vn -0.3333 -0.9421 0.0372 +vn 0.8284 -0.3647 -0.4251 +vn 0.4244 -0.0680 0.9029 +vn -0.4263 0.0623 -0.9024 +vn 0.3527 0.9352 0.0314 +vn -0.8188 0.3931 0.4184 +vn -0.5938 -0.4815 -0.6446 +vn -0.1708 -0.6069 0.7762 +vn -0.3964 0.1476 -0.9061 +vn -0.8159 0.3718 0.4428 +vn 0.8249 -0.3737 -0.4242 +vn 0.5941 0.4827 0.6435 +vn 0.8197 -0.3909 -0.4186 +vn -0.2286 -0.7692 0.5967 +vn 0.2286 0.7692 -0.5967 +vn 0.3963 -0.1476 0.9062 +vn -0.7752 0.5470 0.3159 +vn 0.7755 -0.5462 -0.3166 +vn 0.2777 0.8866 -0.3698 +vn 0.6142 0.6347 0.4690 +vn -0.7512 0.6577 0.0559 +vn 0.0981 0.0951 0.9906 +vn -0.8013 0.4610 0.3814 +vn 0.5797 0.5703 0.5820 +vn -0.5799 -0.5803 -0.5718 +vn 0.7516 -0.6573 -0.0553 +vn -0.6141 -0.6322 -0.4724 +vn 0.0074 -0.1476 0.9890 +vn 0.8003 -0.4630 -0.3811 +vn 0.6535 0.7566 -0.0240 +vn -0.6533 -0.7569 0.0186 +vn 0.0967 0.4128 -0.9057 +vn -0.7561 0.6544 -0.0102 +vn -0.6167 -0.7065 0.3472 +vn 0.1706 0.2972 0.9394 +vn -0.6541 -0.7207 -0.2296 +vn -0.7241 0.6892 0.0263 +vn 0.7262 -0.6867 -0.0344 +vn 0.6167 0.7065 -0.3471 +vn 0.7477 -0.6639 0.0100 +vn 0.1714 0.2999 0.9385 +vn -0.1714 -0.2999 -0.9385 +vn 0.6552 0.7200 0.2285 +vn -0.7677 0.6374 -0.0667 +vn 0.7677 -0.6374 0.0667 +vn -0.1497 -0.2387 -0.9595 +vn 0.6236 0.7187 -0.3076 +vn -0.7570 0.6534 0.0044 +vn 0.1041 0.1051 0.9890 +vn -0.7656 0.6408 -0.0565 +vn 0.6221 0.7200 -0.3075 +vn -0.6228 -0.7175 0.3118 +vn 0.7570 -0.6534 -0.0046 +vn -0.6238 -0.7192 0.3060 +vn 0.1236 0.1633 0.9788 +vn 0.7657 -0.6408 0.0559 +vn 0.6436 0.7479 -0.1624 +vn -0.6439 -0.7483 0.1599 +vn -0.1541 -0.2499 -0.9559 +vn -0.7561 0.6543 0.0105 +vn -0.6450 -0.7489 0.1521 +vn 0.1094 0.1064 0.9883 +vn -0.6328 -0.7337 0.2475 +vn -0.7577 0.6527 0.0006 +vn 0.7558 -0.6548 -0.0002 +vn 0.6450 0.7489 -0.1521 +vn 0.7562 -0.6543 -0.0104 +vn 0.1086 0.1050 0.9885 +vn 0.6328 0.7337 -0.2475 +vn -0.7563 0.6541 0.0134 +vn 0.7563 -0.6541 -0.0134 +vn -0.1049 -0.1001 -0.9894 +vn 0.6453 0.7493 -0.1488 +vn -0.7563 0.6541 0.0135 +vn 0.0908 0.0843 0.9923 +vn -0.7563 0.6541 0.0138 +vn 0.6454 0.7493 -0.1486 +vn -0.6454 -0.7493 0.1486 +vn 0.7563 -0.6541 -0.0135 +vn -0.6453 -0.7493 0.1487 +vn 0.0998 0.0952 0.9904 +vn 0.7563 -0.6541 -0.0138 +vn 0.6473 0.7511 -0.1298 +vn -0.6473 -0.7511 0.1298 +vn -0.1063 -0.1029 -0.9890 +vn -0.7563 0.6541 0.0136 +vn -0.6502 -0.7538 0.0956 +vn 0.0617 0.0718 0.9955 +vn -0.6459 -0.7498 0.1436 +vn 0.6502 0.7538 -0.0956 +vn 0.7563 -0.6541 -0.0136 +vn 0.0720 0.0672 0.9951 +vn -0.0720 -0.0672 -0.9951 +vn 0.6459 0.7498 -0.1436 +vn -0.7569 0.6535 0.0056 +vn 0.7569 -0.6535 -0.0056 +vn -0.0812 -0.0727 -0.9940 +vn 0.6505 0.7541 -0.0908 +vn -0.7576 0.6527 -0.0055 +vn 0.0373 0.0414 0.9984 +vn 0.6503 0.7539 -0.0934 +vn -0.6503 -0.7539 0.0935 +vn 0.7576 -0.6527 0.0056 +vn -0.6505 -0.7541 0.0907 +vn 0.0423 0.0639 0.9971 +vn 0.6515 0.7558 -0.0662 +vn -0.6515 -0.7557 0.0662 +vn -0.0512 -0.0733 -0.9960 +vn -0.7566 0.6538 0.0125 +vn -0.6541 -0.7564 -0.0030 +vn 0.0446 -0.0652 0.9969 +vn -0.6508 -0.7546 0.0838 +vn -0.7568 0.6536 0.0069 +vn 0.7569 -0.6535 -0.0064 +vn 0.6541 0.7564 0.0031 +vn 0.7567 -0.6537 -0.0126 +vn 0.0405 -0.0241 0.9989 +vn -0.0405 0.0241 -0.9989 +vn 0.6508 0.7546 -0.0838 +vn -0.7550 0.6529 0.0601 +vn 0.7550 -0.6529 -0.0600 +vn -0.0370 -0.0100 -0.9993 +vn 0.6550 0.7535 0.0574 +vn -0.7486 0.6278 0.2132 +vn 0.0297 -0.3131 0.9493 +vn -0.7561 0.6536 0.0327 +vn 0.6514 0.7576 0.0414 +vn -0.6538 -0.7558 -0.0359 +vn 0.7487 -0.6279 -0.2126 +vn -0.6550 -0.7534 -0.0587 +vn 0.0340 -0.2477 0.9682 +vn 0.7562 -0.6536 -0.0326 +vn 0.6616 0.7240 0.1954 +vn -0.6616 -0.7237 -0.1963 +vn -0.0416 0.1472 -0.9882 +vn -0.7478 0.6239 0.2270 +vn -0.6582 -0.7417 -0.1288 +vn 0.0551 -0.1427 0.9882 +vn -0.6592 -0.7407 -0.1298 +vn -0.7492 0.6281 0.2103 +vn 0.7457 -0.6314 -0.2127 +vn 0.6582 0.7416 0.1291 +vn 0.7478 -0.6240 -0.2268 +vn 0.0398 -0.2709 0.9618 +vn -0.0397 0.2709 -0.9618 +vn 0.6590 0.7408 0.1300 +vn -0.7500 0.6379 0.1751 +vn 0.7502 -0.6377 -0.1747 +vn -0.0314 0.3232 -0.9458 +vn 0.6394 0.7688 -0.0060 +vn -0.7703 0.6291 -0.1041 +vn 0.1066 0.3374 0.9353 +vn -0.7484 0.6221 0.2300 +vn 0.6483 0.7589 0.0619 +vn -0.6458 -0.7621 -0.0456 +vn 0.7703 -0.6291 0.1039 +vn -0.6423 -0.7665 0.0035 +vn 0.0885 0.2070 0.9743 +vn 0.7482 -0.6226 -0.2292 +vn 0.6287 0.7277 -0.2743 +vn -0.6285 -0.7282 0.2734 +vn -0.0729 -0.0347 -0.9967 +vn -0.7725 0.6110 -0.1728 +vn -0.5782 -0.5336 0.6173 +vn 0.1235 0.7624 0.6353 +vn -0.6382 -0.7538 0.1564 +vn -0.7605 0.6337 -0.1417 +vn 0.7605 -0.6338 0.1415 +vn 0.5779 0.5347 -0.6165 +vn 0.7725 -0.6113 0.1718 +vn 0.1324 0.6074 0.7833 +vn -0.1324 -0.6074 -0.7833 +vn 0.6392 0.7531 -0.1557 +vn -0.8020 0.4978 -0.3301 +vn 0.8024 -0.4968 0.3306 +vn -0.1247 -0.4567 -0.8808 +vn 0.5384 0.4203 -0.7304 +vn -0.8424 0.1551 -0.5160 +vn 0.0572 0.9907 0.1235 +vn -0.7872 0.5693 -0.2370 +vn 0.5426 0.4922 -0.6807 +vn -0.5411 -0.4891 0.6841 +vn 0.8424 -0.1553 0.5160 +vn -0.5410 -0.4201 0.7286 +vn 0.0687 0.9611 0.2674 +vn 0.7872 -0.5689 0.2381 +vn 0.5330 0.1318 -0.8358 +vn -0.5330 -0.1322 0.8357 +vn -0.0988 -0.8823 -0.4601 +vn -0.8412 0.0596 -0.5374 +vn -0.5162 0.2487 0.8196 +vn 0.0156 0.9426 -0.3334 +vn -0.5430 -0.2747 0.7935 +vn -0.8287 0.1139 -0.5480 +vn 0.8292 -0.1185 0.5463 +vn 0.5161 -0.2494 -0.8194 +vn 0.8412 -0.0595 0.5374 +vn 0.0297 0.9782 -0.2053 +vn -0.0297 -0.9782 0.2053 +vn 0.5420 0.2745 -0.7943 +vn -0.8548 -0.1265 -0.5033 +vn 0.8548 0.1254 0.5036 +vn -0.0441 -0.9981 0.0441 +vn 0.5096 -0.3253 -0.7965 +vn -0.8565 -0.2636 -0.4438 +vn -0.0157 0.8700 -0.4929 +vn -0.8519 -0.0392 -0.5223 +vn 0.5107 -0.2880 -0.8101 +vn -0.5018 0.2754 0.8200 +vn 0.8565 0.2635 0.4438 +vn -0.5094 0.3272 0.7959 +vn -0.0072 0.8803 -0.4743 +vn 0.8521 0.0376 0.5220 +vn 0.5160 -0.4177 -0.7479 +vn -0.5158 0.4173 0.7482 +vn -0.0032 -0.9066 0.4220 +vn -0.8563 -0.2650 -0.4433 +vn -0.5135 0.3388 0.7884 +vn -0.0324 0.9311 -0.3634 +vn -0.5154 0.3892 0.7635 +vn -0.8559 -0.2585 -0.4478 +vn 0.8560 0.2578 0.4482 +vn 0.5135 -0.3381 -0.7887 +vn 0.8565 0.2650 0.4430 +vn -0.0282 0.8983 -0.4384 +vn 0.0282 -0.8983 0.4384 +vn 0.5156 -0.3890 -0.7635 +vn -0.8573 -0.2351 -0.4579 +vn 0.8573 0.2357 0.4576 +vn 0.0226 -0.8768 0.4803 +vn 0.5074 -0.2529 -0.8238 +vn -0.8635 -0.0521 -0.5016 +vn -0.0333 0.9974 0.0645 +vn -0.8565 -0.2603 -0.4456 +vn 0.5002 -0.2822 -0.8187 +vn -0.5092 0.2941 0.8088 +vn 0.8635 0.0535 0.5014 +vn -0.5071 0.2499 0.8249 +vn -0.0353 0.9939 -0.1046 +vn 0.8566 0.2607 0.4452 +vn 0.5002 -0.0129 -0.8658 +vn -0.5017 0.0219 0.8647 +vn 0.0350 -0.9672 0.2516 +vn -0.8602 0.0460 -0.5079 +vn -0.4862 -0.4101 0.7716 +vn -0.0392 0.8540 0.5188 +vn -0.5054 0.1483 0.8500 +vn -0.8544 0.0024 -0.5196 +vn 0.8544 -0.0023 0.5196 +vn 0.4863 0.4094 -0.7720 +vn 0.8602 -0.0456 0.5079 +vn -0.0344 0.9261 0.3757 +vn 0.0344 -0.9261 -0.3757 +vn 0.5062 -0.1485 -0.8495 +vn -0.8718 0.1920 -0.4507 +vn 0.8717 -0.1922 0.4508 +vn 0.0320 -0.9741 -0.2236 +vn 0.4745 0.5305 -0.7024 +vn -0.8803 0.3400 -0.3308 +vn -0.0491 0.6001 0.7984 +vn -0.8694 0.1259 -0.4778 +vn 0.4662 0.4726 -0.7479 +vn -0.4652 -0.4777 0.7452 +vn 0.8803 -0.3402 0.3306 +vn -0.4720 -0.5291 0.7052 +vn -0.0474 0.6737 0.7375 +vn 0.8691 -0.1280 0.4778 +vn 0.4708 0.6981 -0.5394 +vn -0.4707 -0.6995 0.5378 +vn 0.0441 -0.7643 -0.6433 +vn -0.8806 0.3589 -0.3093 +vn -0.4662 -0.7592 0.4541 +vn -0.0493 0.5489 0.8344 +vn -0.4756 -0.6298 0.6142 +vn -0.8801 0.3458 -0.3253 +vn 0.8768 -0.3513 0.3283 +vn 0.4662 0.7593 -0.4540 +vn 0.8806 -0.3586 0.3096 +vn -0.0499 0.5366 0.8424 +vn 0.0499 -0.5366 -0.8424 +vn 0.4752 0.6299 -0.6143 +vn -0.8833 0.3707 -0.2871 +vn 0.8833 -0.3706 0.2871 +vn 0.0498 -0.5534 -0.8314 +vn 0.4662 0.7393 -0.4859 +vn -0.8792 0.3203 -0.3527 +vn -0.0432 0.7269 0.6853 +vn -0.8832 0.3698 -0.2885 +vn 0.4675 0.7452 -0.4756 +vn -0.4676 -0.7431 0.4787 +vn 0.8792 -0.3202 0.3529 +vn -0.4677 -0.7397 0.4839 +vn -0.0462 0.6500 0.7585 +vn 0.8832 -0.3699 0.2884 +vn 0.4736 0.6611 -0.5819 +vn -0.4737 -0.6587 0.5845 +vn 0.0481 -0.5881 -0.8073 +vn -0.8741 0.2804 -0.3966 +vn -0.4858 -0.4114 0.7712 +vn -0.0299 0.9102 0.4131 +vn -0.4701 -0.7118 0.5219 +vn -0.8730 0.3024 -0.3826 +vn 0.8741 -0.3008 0.3814 +vn 0.4860 0.4109 -0.7713 +vn 0.8739 -0.2807 0.3968 +vn -0.0351 0.8651 0.5003 +vn 0.0351 -0.8651 -0.5003 +vn 0.4698 0.7119 -0.5220 +vn -0.8729 0.1958 -0.4469 +vn 0.8729 -0.1960 0.4468 +vn 0.0392 -0.8081 -0.5877 +vn 0.4831 0.3369 -0.8082 +vn -0.8686 0.0405 -0.4938 +vn -0.0100 0.9999 0.0041 +vn -0.8738 0.2274 -0.4298 +vn 0.4804 0.3757 -0.7925 +vn -0.4803 -0.3733 0.7937 +vn 0.8686 -0.0404 0.4938 +vn -0.4853 -0.3388 0.8061 +vn -0.0180 0.9799 0.1989 +vn 0.8744 -0.2289 0.4279 +vn 0.4922 0.1024 -0.8644 +vn -0.4922 -0.0995 0.8648 +vn 0.0248 -0.9412 -0.3368 +vn -0.8598 -0.0538 -0.5077 +vn -0.4934 0.4055 0.7695 +vn 0.0174 0.8282 -0.5602 +vn -0.4903 -0.2512 0.8346 +vn -0.8530 -0.0087 -0.5218 +vn 0.8560 0.0097 0.5168 +vn 0.4926 -0.4024 -0.7716 +vn 0.8593 0.0537 0.5086 +vn 0.0053 0.9281 -0.3724 +vn -0.0053 -0.9281 0.3724 +vn 0.4898 0.2512 -0.8348 +vn -0.8674 -0.2199 -0.4465 +vn 0.8679 0.2199 0.4455 +vn 0.0026 -0.9806 0.1962 +vn 0.4753 -0.5680 -0.6719 +vn -0.8740 -0.3893 -0.2908 +vn 0.0264 0.5483 -0.8359 +vn -0.8675 -0.1410 -0.4771 +vn 0.4711 -0.5045 -0.7235 +vn -0.4664 0.4970 0.7318 +vn 0.8741 0.3893 0.2905 +vn -0.4747 0.5713 0.6695 +vn 0.0302 0.5811 -0.8133 +vn 0.8674 0.1411 0.4771 +vn 0.4848 -0.7354 -0.4734 +vn -0.4847 0.7348 0.4745 +vn -0.0274 -0.6879 0.7253 +vn -0.8734 -0.3861 -0.2967 +vn -0.4866 0.6515 0.5820 +vn 0.0014 0.6666 -0.7454 +vn -0.4860 0.6899 0.5366 +vn -0.8716 -0.3832 -0.3056 +vn 0.8717 0.3823 0.3066 +vn 0.4866 -0.6517 -0.5818 +vn 0.8739 0.3855 0.2961 +vn 0.0077 0.6484 -0.7612 +vn 0.0078 0.6484 -0.7612 +vn -0.0077 -0.6484 0.7612 +vn 0.4865 -0.6897 -0.5363 +vn -0.8736 -0.3601 -0.3274 +vn 0.8735 0.3602 0.3275 +vn -0.0181 -0.5837 0.8118 +vn 0.4867 -0.6551 -0.5779 +vn -0.8735 -0.3772 -0.3079 +vn -0.0122 0.6458 -0.7634 +vn -0.8736 -0.3753 -0.3097 +vn 0.4855 -0.6655 -0.5670 +vn -0.4854 0.6639 0.5689 +vn 0.8735 0.3772 0.3079 +vn -0.4866 0.6552 0.5779 +vn -0.0078 0.6492 -0.7606 +vn 0.8736 0.3752 0.3099 +vn 0.4868 -0.6634 -0.5683 +vn -0.4868 0.6634 0.5683 +vn 0.0031 -0.6577 0.7533 +vn -0.8734 -0.3782 -0.3067 +vn -0.4863 0.6441 0.5904 +vn -0.0191 0.6769 -0.7359 +vn -0.4867 0.6604 0.5718 +vn -0.8734 -0.3768 -0.3085 +vn 0.8734 0.3767 0.3085 +vn 0.4863 -0.6441 -0.5905 +vn 0.8734 0.3782 0.3067 +vn -0.0181 0.6605 -0.7506 +vn 0.0181 -0.6605 0.7506 +vn 0.4867 -0.6604 -0.5718 +vn -0.8736 -0.3730 -0.3126 +vn 0.8736 0.3730 0.3126 +vn 0.0158 -0.6491 0.7605 +vn 0.4857 -0.6294 -0.6066 +vn -0.8743 -0.3446 -0.3417 +vn -0.0179 0.7398 -0.6725 +vn -0.8735 -0.3779 -0.3070 +vn 0.4855 -0.6360 -0.5998 +vn -0.4858 0.6361 0.5995 +vn 0.8743 0.3447 0.3417 +vn -0.4857 0.6294 0.6066 +vn -0.0178 0.7151 -0.6988 +vn 0.8735 0.3779 0.3070 +vn 0.4849 -0.5952 -0.6408 +vn -0.4849 0.5954 0.6406 +vn 0.0188 -0.6957 0.7181 +vn -0.8742 -0.3296 -0.3565 +vn -0.4824 0.5004 0.7189 +vn -0.0242 0.8226 -0.5681 +vn -0.4854 0.6131 0.6233 +vn -0.8741 -0.3363 -0.3505 +vn 0.8741 0.3365 0.3504 +vn 0.4825 -0.5005 -0.7189 +vn 0.8744 0.3295 0.3563 +vn -0.0224 0.8017 -0.5973 +vn 0.0224 -0.8017 0.5973 +vn 0.4854 -0.6131 -0.6233 +vn -0.8756 -0.2975 -0.3807 +vn 0.8755 0.2975 0.3807 +vn 0.0199 -0.7717 0.6357 +vn 0.4821 -0.4871 -0.7282 +vn -0.8756 -0.2974 -0.3807 +vn -0.0222 0.7984 -0.6017 +vn -0.8751 -0.3123 -0.3697 +vn 0.4816 -0.4992 -0.7203 +vn -0.4815 0.4980 0.7212 +vn 0.8755 0.2974 0.3808 +vn -0.4819 0.4874 0.7282 +vn -0.0241 0.8213 -0.5699 +vn 0.8751 0.3122 0.3697 +vn 0.4825 -0.4997 -0.7194 +vn -0.4825 0.5002 0.7190 +vn 0.0248 -0.8293 0.5583 +vn -0.8745 -0.3181 -0.3661 +vn -0.4855 0.6260 0.6103 +vn -0.0211 0.6831 -0.7300 +vn -0.4819 0.4809 0.7325 +vn -0.8739 -0.3117 -0.3730 +vn 0.8748 0.3109 0.3716 +vn 0.4856 -0.6265 -0.6096 +vn 0.8745 0.3180 0.3661 +vn -0.0156 0.7154 -0.6986 +vn 0.0156 -0.7154 0.6986 +vn 0.4819 -0.4809 -0.7325 +vn -0.8739 -0.3591 -0.3275 +vn 0.8740 0.3590 0.3276 +vn 0.0192 -0.7611 0.6484 +vn 0.4854 -0.6188 -0.6176 +vn -0.8721 -0.3912 -0.2939 +vn -0.0965 0.7185 -0.6888 +vn -0.8744 -0.3378 -0.3483 +vn 0.4847 -0.6106 -0.6263 +vn -0.4843 0.6098 0.6273 +vn 0.8721 0.3912 0.2940 +vn -0.4854 0.6186 0.6178 +vn -0.0789 0.7138 -0.6958 +vn -0.0789 0.7138 -0.6959 +vn 0.8744 0.3379 0.3482 +vn 0.4808 -0.5733 -0.6634 +vn -0.4809 0.5731 0.6636 +vn 0.0476 -0.6914 0.7209 +vn -0.8710 -0.4002 -0.2850 +vn -0.4902 0.6424 0.5891 +vn -0.0603 0.5922 -0.8035 +vn -0.4835 0.5971 0.6401 +vn -0.8709 -0.3969 -0.2899 +vn 0.8719 0.3954 0.2889 +vn 0.4901 -0.6416 -0.5900 +vn 0.8710 0.4002 0.2851 +vn -0.0913 0.6682 -0.7384 +vn 0.0913 -0.6682 0.7384 +vn 0.4835 -0.5973 -0.6399 +vn -0.8676 -0.4226 -0.2620 +vn 0.8677 0.4224 0.2620 +vn 0.1013 -0.7051 0.7019 +vn 0.4907 -0.7513 -0.4414 +vn -0.8715 -0.4648 -0.1566 +vn 0.2449 -0.1950 -0.9497 +vn -0.8694 -0.4101 -0.2755 +vn 0.4921 -0.6870 -0.5347 +vn -0.4925 0.7253 0.4810 +vn 0.8712 0.4652 0.1572 +vn -0.4954 0.7387 0.4570 +vn 0.1191 0.1608 -0.9798 +vn 0.1192 0.1608 -0.9798 +vn 0.8694 0.4102 0.2755 +vn 0.4556 -0.8872 0.0725 +vn -0.4513 0.8875 -0.0932 +vn -0.0034 -0.4448 0.8956 +vn -0.8744 -0.4647 -0.1394 +vn -0.2897 0.7325 -0.6161 +vn 0.4643 -0.4895 -0.7381 +vn -0.4936 0.8355 0.2414 +vn -0.8634 -0.4810 -0.1522 +vn 0.8636 0.4799 0.1546 +vn 0.2899 -0.7328 0.6156 +vn 0.8731 0.4673 0.1391 +vn 0.4090 -0.4572 -0.7897 +vn -0.4090 0.4572 0.7897 +vn 0.4937 -0.8351 -0.2426 +vn -0.8496 -0.4929 -0.1877 +vn 0.8493 0.4932 0.1885 +vn -0.3339 0.4041 0.8516 +vn 0.2509 -0.6926 0.6762 +vn -0.8396 -0.5031 -0.2049 +vn 0.5176 -0.6728 -0.5287 +vn -0.8712 -0.4686 -0.1463 +vn 0.2760 -0.7076 0.6505 +vn -0.2761 0.7077 -0.6503 +vn 0.8396 0.5030 0.2049 +vn -0.2554 0.6918 -0.6754 +vn 0.5166 -0.6027 -0.6082 +vn 0.8713 0.4686 0.1460 +vn 0.1575 -0.5869 0.7942 +vn -0.1569 0.5862 -0.7949 +vn -0.4991 0.5398 0.6779 +vn -0.8537 -0.4858 -0.1876 +vn 0.0091 0.3396 -0.9405 +vn 0.4371 -0.8625 -0.2551 +vn -0.2091 0.6468 -0.7334 +vn -0.8480 -0.4945 -0.1906 +vn 0.8487 0.4931 0.1913 +vn -0.0093 -0.3390 0.9407 +vn 0.8536 0.4860 0.1878 +vn 0.4752 -0.8082 -0.3478 +vn -0.4752 0.8082 0.3478 +vn 0.2091 -0.6470 0.7333 +vn -0.8896 -0.4271 -0.1616 +vn 0.8896 0.4272 0.1616 +vn -0.5032 0.7434 0.4407 +vn -0.0560 -0.2561 0.9650 +vn -0.9375 -0.3182 -0.1407 +vn 0.3008 -0.9536 -0.0136 +vn -0.8699 -0.4608 -0.1762 +vn -0.0378 -0.3010 0.9529 +vn 0.0358 0.3044 -0.9519 +vn 0.9376 0.3180 0.1407 +vn 0.0565 0.2553 -0.9652 +vn 0.3469 -0.9339 -0.0863 +vn 0.8700 0.4607 0.1760 +vn -0.1151 -0.0997 0.9883 +vn 0.1156 0.0982 -0.9884 +vn -0.3931 0.9042 0.1670 +vn -0.9468 -0.2903 -0.1386 +vn 0.1420 0.0159 -0.9897 +vn 0.2445 -0.9673 0.0672 +vn 0.0895 0.1685 -0.9816 +vn -0.9423 -0.3062 -0.1351 +vn 0.9421 0.3068 0.1353 +vn -0.1420 -0.0159 0.9897 +vn 0.9469 0.2904 0.1381 +vn -0.2445 0.9673 -0.0672 +vn -0.0895 -0.1684 0.9816 +vn -0.9509 -0.2761 -0.1397 +vn 0.9509 0.2761 0.1397 +vn -0.0000 0.0001 -1.0000 +vn 0.0001 -1.0000 0.0001 +vn -0.0001 -0.0000 -1.0000 +vn -0.0001 1.0000 -0.0000 +vn 0.2544 0.3761 -0.8910 +vn 0.2703 0.3920 -0.8794 +vn 0.2703 0.3920 -0.8793 +vn 0.2941 0.3940 -0.8708 +vn -0.2704 -0.3919 0.8794 +vn -0.2941 -0.3941 0.8708 +vn -0.2543 -0.3761 0.8910 +vn -0.4978 0.8341 0.2378 +vn -0.2728 -0.3876 0.8805 +vn 0.8241 0.3783 0.4216 +vn 0.8268 0.3741 0.4200 +vn 0.8264 0.3741 0.4210 +vn 0.8263 0.3741 0.4210 +vn 0.8262 0.3735 0.4217 +vn -0.2676 -0.3967 0.8781 +vn 0.2693 0.3938 -0.8789 +vn -0.8241 -0.3783 -0.4216 +vn -0.8264 -0.3741 -0.4210 +vn -0.8262 -0.3735 -0.4217 +vn -0.8263 -0.3741 -0.4210 +vn -0.8268 -0.3741 -0.4200 +vn 0.8256 0.3749 0.4218 +vn 0.3738 0.1973 -0.9063 +vn 0.3738 0.1975 -0.9062 +vn 0.3738 0.1972 -0.9063 +vn 0.3732 -0.9266 -0.0462 +vn 0.4346 0.2929 -0.8517 +vn 0.3626 0.2224 -0.9050 +vn 0.3624 0.2229 -0.9050 +vn 0.2533 0.2129 -0.9437 +vn 0.8258 0.3752 0.4211 +vn -0.8256 -0.3754 -0.4212 +vn -0.3737 -0.1975 0.9063 +vn -0.3738 -0.1974 0.9062 +vn -0.8258 -0.3751 -0.4211 +vn -0.3633 -0.2210 0.9051 +vn -0.2587 -0.2136 0.9421 +vn -0.3631 -0.2214 0.9051 +vn -0.4311 -0.2894 0.8546 +vn -0.2958 -0.3475 0.8898 +vn 0.8446 0.3313 0.4206 +vn -0.8448 -0.3309 -0.4205 +vn -0.3809 -0.1780 0.9073 +vn 0.8470 0.3273 0.4189 +vn 0.8463 0.3282 0.4196 +vn 0.8296 0.3232 0.4553 +vn 0.8504 0.3178 0.4193 +vn 0.8505 0.3176 0.4193 +vn 0.8602 0.3360 0.3836 +vn 0.8299 0.3653 0.4216 +vn -0.3812 -0.1804 0.9067 +vn 0.3821 0.1785 -0.9067 +vn -0.8463 -0.3284 -0.4195 +vn -0.8469 -0.3277 -0.4189 +vn 0.3814 0.1796 -0.9068 +vn -0.8505 -0.3177 -0.4193 +vn -0.8601 -0.3356 -0.3843 +vn -0.8505 -0.3174 -0.4193 +vn -0.8300 -0.3230 -0.4546 +vn -0.8299 -0.3656 -0.4215 +vn -0.4210 -0.0668 0.9046 +vn 0.4230 0.0610 -0.9041 +vn 0.8146 0.3969 0.4229 +vn 0.5912 -0.4857 -0.6438 +vn 0.5918 -0.4845 -0.6442 +vn 0.6057 0.0255 -0.7953 +vn 0.4625 -0.1227 -0.8781 +vn 0.4641 -0.1262 -0.8767 +vn 0.2454 -0.1520 -0.9574 +vn 0.3931 0.1463 -0.9078 +vn 0.8304 0.3655 0.4206 +vn -0.8171 -0.3781 -0.4351 +vn -0.5924 0.4861 0.6425 +vn -0.5917 0.4879 0.6418 +vn -0.8148 -0.3954 -0.4239 +vn -0.4584 0.1141 0.8814 +vn -0.2681 0.1315 0.9544 +vn -0.4608 0.1190 0.8795 +vn -0.5831 -0.0304 0.8118 +vn -0.3930 -0.1463 0.9078 +vn 0.7776 0.5452 0.3132 +vn -0.7779 -0.5444 -0.3139 +vn -0.2776 0.8865 -0.3702 +vn -0.6114 0.6372 0.4692 +vn 0.7538 0.6549 0.0537 +vn 0.7542 0.6543 0.0547 +vn 0.8101 0.5323 0.2457 +vn 0.7440 0.6179 0.2544 +vn 0.7442 0.6183 0.2527 +vn 0.4876 0.7378 0.4668 +vn 0.8033 0.4601 0.3781 +vn -0.5769 0.5727 0.5824 +vn 0.5780 -0.5823 -0.5717 +vn -0.7539 -0.6547 -0.0557 +vn -0.7542 -0.6543 -0.0550 +vn 0.6113 -0.6348 -0.4726 +vn -0.7440 -0.6179 -0.2542 +vn -0.4444 -0.7519 -0.4870 +vn -0.7442 -0.6183 -0.2527 +vn -0.8155 -0.5268 -0.2396 +vn -0.8023 -0.4620 -0.3779 +vn -0.6499 0.7596 -0.0236 +vn 0.6506 -0.7592 0.0196 +vn 0.7587 0.6513 -0.0096 +vn 0.8228 -0.5607 0.0927 +vn 0.6344 -0.7499 0.1874 +vn 0.6347 -0.7506 0.1839 +vn 0.2757 -0.9601 0.0477 +vn 0.6512 -0.7234 -0.2296 +vn 0.7272 0.6859 0.0265 +vn -0.7292 -0.6835 -0.0344 +vn -0.6137 0.7090 -0.3473 +vn -0.7504 -0.6609 0.0094 +vn -0.6336 0.7478 -0.1986 +vn -0.3492 0.9345 -0.0696 +vn -0.6339 0.7487 -0.1940 +vn -0.7855 0.6083 -0.1140 +vn -0.6523 0.7227 0.2284 +vn -0.6192 0.7227 -0.3071 +vn 0.7598 0.6501 0.0048 +vn 0.7595 0.6504 0.0051 +vn 0.7644 0.6427 -0.0520 +vn 0.7661 0.6408 -0.0502 +vn 0.7661 0.6407 -0.0509 +vn 0.7696 0.6365 -0.0510 +vn 0.7681 0.6380 -0.0553 +vn -0.6205 0.7212 -0.3080 +vn 0.6183 -0.7215 0.3115 +vn -0.7595 -0.6505 -0.0053 +vn -0.7598 -0.6502 -0.0050 +vn 0.6195 -0.7231 0.3055 +vn -0.7661 -0.6408 0.0505 +vn -0.7695 -0.6366 0.0512 +vn -0.7661 -0.6406 0.0511 +vn -0.7645 -0.6425 0.0521 +vn -0.7681 -0.6379 0.0547 +vn -0.6406 0.7505 -0.1623 +vn 0.6409 -0.7508 0.1597 +vn 0.7591 0.6508 0.0114 +vn 0.5790 -0.7967 0.1736 +vn 0.6423 -0.7518 0.1495 +vn 0.6423 -0.7518 0.1493 +vn 0.6892 -0.7038 0.1721 +vn 0.7585 0.6517 0.0002 +vn -0.7601 -0.6498 -0.0022 +vn -0.7591 -0.6508 -0.0113 +vn -0.6422 0.7517 -0.1500 +vn -0.6924 0.7002 -0.1738 +vn -0.6422 0.7517 -0.1498 +vn -0.5746 0.7994 -0.1752 +vn -0.6424 0.7518 -0.1487 +vn 0.7591 0.6509 0.0141 +vn 0.7586 0.6514 0.0140 +vn -0.7586 -0.6514 -0.0140 +vn -0.7591 -0.6509 -0.0141 +vn 0.6289 -0.7678 0.1224 +vn 0.6456 -0.7549 0.1157 +vn 0.6607 -0.7405 0.1229 +vn -0.6456 0.7549 -0.1157 +vn -0.6609 0.7404 -0.1229 +vn -0.6288 0.7679 -0.1224 +vn -0.6474 0.7567 -0.0907 +vn 0.7682 0.6402 0.0023 +vn 0.7601 0.6498 -0.0032 +vn 0.7516 0.6597 -0.0001 +vn -0.7602 -0.6497 0.0053 +vn 0.6474 -0.7567 0.0907 +vn -0.7601 -0.6498 0.0032 +vn -0.7515 -0.6597 0.0001 +vn -0.7683 -0.6401 -0.0023 +vn 0.7592 0.6508 0.0127 +vn 0.6512 -0.7589 -0.0034 +vn 0.6511 -0.7590 -0.0033 +vn 0.6511 -0.7589 -0.0034 +vn 0.6250 -0.7788 0.0530 +vn 0.6489 -0.7596 0.0433 +vn 0.6489 -0.7596 0.0435 +vn 0.6709 -0.7396 0.0541 +vn 0.7594 0.6506 0.0071 +vn -0.7594 -0.6505 -0.0066 +vn -0.6511 0.7589 0.0033 +vn -0.6511 0.7590 0.0034 +vn -0.7592 -0.6507 -0.0128 +vn -0.6489 0.7596 -0.0433 +vn -0.6713 0.7393 -0.0540 +vn -0.6489 0.7596 -0.0434 +vn -0.6247 0.7791 -0.0529 +vn -0.6478 0.7572 -0.0839 +vn 0.7576 0.6499 0.0602 +vn -0.7576 -0.6499 -0.0600 +vn -0.6503 0.7574 0.0590 +vn 0.7514 0.6248 0.2122 +vn 0.7512 0.6249 0.2125 +vn 0.7126 0.6955 0.0922 +vn 0.7526 0.6498 0.1070 +vn 0.7525 0.6500 0.1061 +vn 0.7874 0.6107 0.0843 +vn -0.6508 0.7582 0.0409 +vn 0.6479 -0.7608 -0.0378 +vn -0.7512 -0.6248 -0.2127 +vn -0.7514 -0.6247 -0.2124 +vn 0.6504 -0.7572 -0.0602 +vn -0.7525 -0.6499 -0.1065 +vn -0.7863 -0.6122 -0.0835 +vn -0.7525 -0.6501 -0.1055 +vn -0.7142 -0.6939 -0.0915 +vn -0.7587 -0.6506 -0.0328 +vn -0.6587 0.7264 0.1963 +vn 0.6587 -0.7261 -0.1972 +vn 0.7509 0.6204 0.2263 +vn 0.6553 -0.7441 -0.1299 +vn 0.6550 -0.7444 -0.1296 +vn 0.6054 -0.7691 -0.2051 +vn 0.6591 -0.7216 -0.2119 +vn 0.6591 -0.7215 -0.2121 +vn 0.6977 -0.6927 -0.1827 +vn 0.6563 -0.7431 -0.1308 +vn 0.7486 0.6291 0.2094 +vn -0.7516 -0.6245 -0.2123 +vn -0.6550 0.7443 0.1301 +vn -0.6553 0.7440 0.1304 +vn -0.7509 -0.6205 -0.2261 +vn -0.6591 0.7216 0.2118 +vn -0.7005 0.6905 0.1804 +vn -0.6591 0.7216 0.2119 +vn -0.6018 0.7720 0.2045 +vn -0.6560 0.7433 0.1311 +vn 0.7528 0.6347 0.1746 +vn -0.7526 -0.6351 -0.1737 +vn -0.6364 0.7714 -0.0062 +vn 0.7729 0.6258 -0.1045 +vn 0.7730 0.6257 -0.1041 +vn 0.8061 0.5794 0.1204 +vn 0.7481 0.6586 0.0808 +vn 0.7484 0.6585 0.0796 +vn 0.6449 0.7548 0.1199 +vn 0.7510 0.6193 0.2291 +vn -0.6453 0.7614 0.0620 +vn 0.6428 -0.7647 -0.0456 +vn -0.7730 -0.6258 0.1039 +vn -0.7729 -0.6259 0.1042 +vn 0.6392 -0.7690 0.0036 +vn -0.7483 -0.6585 -0.0799 +vn -0.6388 -0.7602 -0.1179 +vn -0.7485 -0.6584 -0.0789 +vn -0.8088 -0.5763 -0.1171 +vn -0.7508 -0.6198 -0.2283 +vn -0.6252 0.7301 -0.2757 +vn 0.6255 -0.7300 0.2755 +vn 0.7735 0.6089 -0.1760 +vn 0.5742 -0.5316 0.6227 +vn 0.5737 -0.5315 0.6232 +vn 0.7258 -0.6143 0.3095 +vn 0.6015 -0.6967 0.3909 +vn 0.6015 -0.6960 0.3921 +vn 0.4000 -0.8445 0.3562 +vn 0.6352 -0.7563 0.1569 +vn -0.7630 -0.6305 0.1427 +vn -0.5737 0.5318 -0.6230 +vn -0.5742 0.5320 -0.6223 +vn -0.7733 -0.6094 0.1753 +vn -0.6016 0.6975 -0.3894 +vn -0.4314 0.8297 -0.3544 +vn -0.6015 0.6967 -0.3909 +vn -0.7102 0.6304 -0.3135 +vn -0.6361 0.7556 -0.1562 +vn 0.8054 0.4924 -0.3300 +vn -0.8054 -0.4914 0.3314 +vn -0.5379 0.4236 -0.7288 +vn 0.8432 0.1695 -0.5102 +vn 0.8433 0.1697 -0.5100 +vn 0.8706 0.3881 -0.3026 +vn 0.8102 0.3997 -0.4289 +vn 0.8101 0.4000 -0.4287 +vn 0.6104 0.5621 -0.5581 +vn 0.7903 0.5641 -0.2393 +vn -0.5394 0.4913 -0.6838 +vn 0.5393 -0.4910 0.6842 +vn -0.8433 -0.1699 0.5099 +vn -0.8432 -0.1697 0.5102 +vn 0.5394 -0.4230 0.7281 +vn -0.8103 -0.3992 0.4291 +vn -0.5814 -0.5721 0.5784 +vn -0.8102 -0.3996 0.4289 +vn -0.8776 -0.3790 0.2935 +vn -0.7902 -0.5637 0.2403 +vn 0.8423 0.0801 -0.5330 +vn 0.5166 0.2029 0.8318 +vn 0.5171 0.2023 0.8317 +vn 0.6481 -0.0788 0.7575 +vn 0.5158 -0.0371 0.8559 +vn 0.5158 -0.0370 0.8559 +vn 0.2610 -0.1374 0.9555 +vn 0.5414 -0.2892 0.7895 +vn 0.8317 0.1313 -0.5395 +vn -0.8321 -0.1351 0.5380 +vn -0.5171 -0.2031 -0.8315 +vn -0.5165 -0.2039 -0.8316 +vn -0.8423 -0.0801 0.5330 +vn -0.5158 0.0373 -0.8559 +vn -0.2953 0.1334 -0.9460 +vn -0.5158 0.0372 -0.8559 +vn -0.6324 0.0806 -0.7705 +vn -0.5405 0.2890 -0.7902 +vn 0.8546 -0.0983 -0.5099 +vn -0.8546 0.0973 0.5100 +vn -0.5140 -0.2759 -0.8122 +vn 0.8562 -0.2322 -0.4616 +vn 0.8562 -0.2321 -0.4616 +vn 0.8922 -0.1088 -0.4383 +vn 0.8550 -0.1581 -0.4940 +vn 0.8549 -0.1566 -0.4946 +vn 0.7708 -0.1504 -0.6191 +vn 0.8519 -0.0140 -0.5235 +vn -0.5021 -0.2371 -0.8317 +vn 0.5109 0.2278 0.8289 +vn -0.8562 0.2319 0.4617 +vn -0.8562 0.2320 0.4616 +vn 0.5141 0.2779 0.8114 +vn -0.8549 0.1570 0.4944 +vn -0.7632 0.1512 0.6282 +vn -0.8548 0.1557 0.4950 +vn -0.8954 0.1049 0.4326 +vn -0.8522 0.0126 0.5231 +vn -0.5164 -0.3637 -0.7753 +vn 0.5165 0.3635 0.7753 +vn 0.8560 -0.2338 -0.4612 +vn 0.5138 0.2762 0.8122 +vn 0.5136 0.2768 0.8122 +vn 0.5261 0.3463 0.7767 +vn 0.5157 0.3529 0.7807 +vn 0.5158 0.3531 0.7806 +vn 0.5041 0.3521 0.7886 +vn 0.5160 0.3377 0.7872 +vn 0.8557 -0.2275 -0.4649 +vn -0.8557 0.2268 0.4651 +vn -0.5138 -0.2765 -0.8121 +vn -0.5136 -0.2763 -0.8123 +vn -0.8561 0.2338 0.4609 +vn 0.0289 0.9278 -0.3720 +vn -0.5157 -0.3525 -0.7809 +vn -0.5049 -0.3518 -0.7882 +vn -0.5157 -0.3527 -0.7808 +vn -0.5254 -0.3465 -0.7771 +vn -0.5162 -0.3375 -0.7872 +vn 0.8571 -0.2002 -0.4747 +vn -0.8571 0.2007 0.4745 +vn -0.5033 -0.1868 -0.8437 +vn 0.8629 -0.0149 -0.5051 +vn 0.8632 -0.0157 -0.5046 +vn 0.8120 -0.1840 -0.5539 +vn 0.8547 -0.1492 -0.4972 +vn 0.8546 -0.1504 -0.4971 +vn 0.8828 -0.1599 -0.4416 +vn 0.8562 -0.2284 -0.4634 +vn -0.5081 -0.2200 -0.8327 +vn 0.5006 0.2292 0.8348 +vn -0.8632 0.0162 0.5046 +vn -0.8629 0.0153 0.5052 +vn 0.5035 0.1847 0.8441 +vn -0.8546 0.1500 0.4971 +vn -0.8818 0.1618 0.4430 +vn -0.8544 0.1514 0.4970 +vn -0.8138 0.1845 0.5511 +vn -0.8563 0.2288 0.4630 +vn -0.5018 0.0441 -0.8639 +vn 0.5014 -0.0418 0.8642 +vn 0.8605 0.0656 -0.5052 +vn 0.4876 -0.4342 0.7574 +vn 0.4874 -0.4346 0.7574 +vn 0.2891 -0.1145 0.9504 +vn 0.4886 -0.1765 0.8545 +vn 0.6174 -0.1061 0.7794 +vn 0.5060 0.0828 0.8585 +vn 0.8555 0.0273 -0.5171 +vn -0.8555 -0.0269 0.5170 +vn -0.4874 0.4340 -0.7577 +vn -0.4876 0.4337 -0.7577 +vn -0.8608 -0.0651 0.5047 +vn -0.4886 0.1771 -0.8543 +vn -0.6325 0.1065 -0.7672 +vn -0.2603 0.1155 -0.9586 +vn -0.5064 -0.0829 -0.8583 +vn 0.8710 0.2029 -0.4475 +vn -0.8711 -0.2034 0.4470 +vn -0.4770 0.5438 -0.6905 +vn 0.8794 0.3325 -0.3407 +vn 0.8795 0.3327 -0.3402 +vn 0.8794 0.3331 -0.3401 +vn 0.7832 0.3032 -0.5429 +vn 0.8708 0.2598 -0.4173 +vn 0.8710 0.2605 -0.4166 +vn 0.9031 0.1986 -0.3807 +vn 0.8687 0.1418 -0.4747 +vn -0.4696 0.4888 -0.7352 +vn 0.4684 -0.4951 0.7318 +vn -0.8794 -0.3332 0.3400 +vn -0.8795 -0.3328 0.3401 +vn 0.4744 -0.5421 0.6936 +vn -0.8709 -0.2601 0.4169 +vn -0.9009 -0.2021 0.3841 +vn -0.8711 -0.2609 0.4162 +vn -0.7900 -0.2989 0.5353 +vn -0.8683 -0.1441 0.4747 +vn -0.4723 0.6910 -0.5472 +vn 0.4722 -0.6920 0.5461 +vn 0.8807 0.3451 -0.3245 +vn 0.4702 -0.7196 0.5109 +vn 0.4701 -0.7196 0.5111 +vn 0.4702 -0.7194 0.5113 +vn 0.3818 -0.7257 0.5724 +vn 0.4705 -0.7156 0.5163 +vn 0.4705 -0.7159 0.5159 +vn 0.5403 -0.6694 0.5099 +vn 0.4767 -0.6330 0.6099 +vn 0.8771 0.3379 -0.3414 +vn -0.8797 -0.3365 0.3361 +vn -0.4700 0.7198 -0.5108 +vn -0.4702 0.7198 -0.5107 +vn -0.8807 -0.3449 0.3247 +vn -0.4706 0.7150 -0.5171 +vn -0.5464 0.6649 -0.5092 +vn -0.4705 0.7153 -0.5167 +vn -0.3745 0.7262 -0.5766 +vn -0.4764 0.6331 -0.6100 +vn 0.8809 0.3476 -0.3212 +vn -0.8808 -0.3475 0.3215 +vn -0.4703 0.6814 -0.5609 +vn 0.8748 0.2657 -0.4051 +vn 0.8748 0.2657 -0.4052 +vn 0.8917 0.3182 -0.3218 +vn 0.8775 0.3314 -0.3465 +vn 0.8775 0.3308 -0.3471 +vn 0.8632 0.3573 -0.3567 +vn 0.8814 0.3530 -0.3138 +vn -0.4717 0.6969 -0.5402 +vn 0.4719 -0.6927 0.5455 +vn -0.8748 -0.2656 0.4052 +vn -0.8748 -0.2657 0.4051 +vn 0.4723 -0.6822 0.5581 +vn -0.8775 -0.3311 0.3468 +vn -0.8629 -0.3574 0.3574 +vn -0.8776 -0.3305 0.3474 +vn -0.8920 -0.3174 0.3220 +vn -0.8814 -0.3530 0.3139 +vn -0.4812 0.5540 -0.6794 +vn 0.8715 0.2253 -0.4356 +vn 0.4907 -0.3430 0.8010 +vn 0.4906 -0.3428 0.8011 +vn 0.5990 -0.4745 0.6450 +vn 0.4833 -0.4711 0.7379 +vn 0.4832 -0.4718 0.7375 +vn 0.3144 -0.5510 0.7730 +vn 0.4766 -0.6322 0.6108 +vn 0.8694 0.2501 -0.4261 +vn -0.8695 -0.2508 0.4254 +vn -0.4908 0.3428 -0.8011 +vn -0.4905 0.3432 -0.8010 +vn -0.4907 0.3434 -0.8008 +vn -0.8702 -0.2269 0.4373 +vn -0.4834 0.4695 -0.7388 +vn -0.3279 0.5479 -0.7696 +vn -0.4833 0.4704 -0.7383 +vn -0.5904 0.4767 -0.6512 +vn -0.4764 0.6323 -0.6109 +vn 0.8707 0.1641 -0.4636 +vn -0.8706 -0.1637 0.4640 +vn -0.4830 0.2334 -0.8440 +vn 0.8665 -0.0484 -0.4969 +vn 0.8666 -0.0479 -0.4966 +vn 0.8900 0.1233 -0.4390 +vn 0.8630 0.1157 -0.4917 +vn 0.8633 0.1130 -0.4919 +vn 0.8247 0.1503 -0.5452 +vn 0.8713 0.1871 -0.4536 +vn -0.4872 0.2877 -0.8245 +vn 0.4865 -0.2721 0.8303 +vn -0.8666 0.0478 0.4966 +vn -0.8665 0.0482 0.4969 +vn 0.4897 -0.2399 0.8382 +vn -0.8632 -0.1142 0.4918 +vn -0.8219 -0.1504 0.5494 +vn -0.8634 -0.1118 0.4920 +vn -0.8913 -0.1208 0.4371 +vn -0.8715 -0.1875 0.4532 +vn -0.4954 -0.0743 -0.8655 +vn 0.4956 0.0728 0.8655 +vn 0.8577 -0.1371 -0.4956 +vn 0.4903 0.5632 0.6651 +vn 0.4907 0.5627 0.6653 +vn 0.6642 0.1324 0.7357 +vn 0.4817 0.2401 0.8428 +vn 0.4817 0.2403 0.8428 +vn 0.1569 0.1762 0.9718 +vn 0.8512 -0.0930 -0.5165 +vn -0.8498 0.0945 0.5186 +vn -0.4908 -0.5637 -0.6644 +vn -0.4901 -0.5645 -0.6641 +vn -0.8577 0.1370 0.4956 +vn -0.4815 -0.2388 -0.8433 +vn -0.2117 -0.1732 -0.9619 +vn -0.4816 -0.2391 -0.8432 +vn -0.6377 -0.1351 -0.7584 +vn 0.8688 -0.2972 -0.3961 +vn -0.8688 0.2966 0.3964 +vn -0.4865 -0.6498 -0.5840 +vn 0.8733 -0.3737 -0.3126 +vn 0.8734 -0.3737 -0.3124 +vn 0.9033 -0.2786 -0.3263 +vn 0.8711 -0.3454 -0.3492 +vn 0.8708 -0.3431 -0.3522 +vn 0.7531 -0.4211 -0.5055 +vn 0.8671 -0.2130 -0.4504 +vn -0.4646 -0.6140 -0.6381 +vn 0.4828 0.5881 0.6489 +vn -0.8734 0.3737 0.3124 +vn -0.8733 0.3737 0.3126 +vn 0.4866 0.6544 0.5788 +vn -0.8709 0.3443 0.3507 +vn -0.7422 0.4276 0.5160 +vn -0.8707 0.3421 0.3534 +vn -0.9063 0.2716 0.3237 +vn -0.8668 0.2141 0.4503 +vn -0.4866 -0.6965 -0.5273 +vn 0.4864 0.6972 0.5266 +vn 0.8729 -0.3604 -0.3289 +vn 0.4361 0.6925 0.5747 +vn 0.4875 0.6602 0.5714 +vn 0.4875 0.6600 0.5716 +vn 0.5361 0.6512 0.5372 +vn 0.4861 0.7081 0.5122 +vn 0.8729 -0.3643 -0.3247 +vn -0.8729 0.3643 0.3246 +vn -0.8729 0.3605 0.3288 +vn -0.4875 -0.6606 -0.5709 +vn -0.5356 -0.6512 -0.5376 +vn -0.4875 -0.6604 -0.5711 +vn -0.4367 -0.6921 -0.5747 +vn -0.4862 -0.7080 -0.5122 +vn -0.4879 -0.6472 -0.5857 +vn 0.8817 -0.3509 -0.3154 +vn 0.8728 -0.3671 -0.3216 +vn 0.8728 -0.3670 -0.3216 +vn 0.8633 -0.3751 -0.3376 +vn 0.8729 -0.3499 -0.3401 +vn -0.4878 -0.6428 -0.5907 +vn 0.4878 0.6428 0.5907 +vn 0.4879 0.6472 0.5857 +vn -0.8728 0.3670 0.3216 +vn -0.8633 0.3752 0.3376 +vn -0.8818 0.3508 0.3153 +vn 0.4880 0.6519 0.5805 +vn 0.8727 -0.3730 -0.3151 +vn 0.4779 0.6497 0.5912 +vn 0.4876 0.6431 0.5905 +vn 0.4876 0.6432 0.5904 +vn 0.4976 0.6414 0.5839 +vn 0.8728 -0.3731 -0.3148 +vn -0.8728 0.3731 0.3147 +vn -0.8728 0.3729 0.3150 +vn -0.4876 -0.6431 -0.5906 +vn -0.4977 -0.6413 -0.5839 +vn -0.4876 -0.6431 -0.5905 +vn -0.4778 -0.6497 -0.5913 +vn -0.4859 -0.5964 -0.6389 +vn 0.8741 -0.3187 -0.3665 +vn 0.8612 -0.3670 -0.3516 +vn 0.8732 -0.3475 -0.3418 +vn 0.8732 -0.3476 -0.3418 +vn 0.8832 -0.3400 -0.3230 +vn 0.8729 -0.3680 -0.3203 +vn -0.4862 -0.6054 -0.6302 +vn 0.4858 0.6059 0.6300 +vn -0.8741 0.3187 0.3665 +vn -0.8741 0.3187 0.3666 +vn 0.4859 0.5963 0.6390 +vn -0.8732 0.3475 0.3418 +vn -0.8831 0.3402 0.3232 +vn -0.8732 0.3476 0.3417 +vn -0.8614 0.3669 0.3514 +vn -0.8729 0.3680 0.3202 +vn 0.8744 -0.3022 -0.3797 +vn 0.4830 0.4647 0.7421 +vn 0.4248 0.5459 0.7222 +vn 0.4838 0.5091 0.7119 +vn 0.4838 0.5089 0.7120 +vn 0.5357 0.5066 0.6756 +vn 0.4859 0.5756 0.6578 +vn 0.8736 -0.3114 -0.3739 +vn -0.8738 0.3110 0.3738 +vn -0.4831 -0.4647 -0.7421 +vn -0.8744 0.3022 0.3797 +vn -0.4838 -0.5093 -0.7117 +vn -0.5373 -0.5061 -0.6747 +vn -0.4838 -0.5092 -0.7118 +vn -0.4228 -0.5466 -0.7228 +vn -0.4859 -0.5755 -0.6577 +vn -0.4830 -0.4791 -0.7329 +vn 0.8742 -0.3163 -0.3685 +vn 0.8741 -0.3164 -0.3685 +vn 0.8754 -0.2864 -0.3894 +vn 0.8748 -0.2874 -0.3902 +vn 0.8748 -0.2875 -0.3900 +vn 0.8744 -0.2877 -0.3907 +vn 0.8751 -0.2861 -0.3904 +vn -0.4834 -0.4778 -0.7335 +vn 0.4834 0.4785 0.7331 +vn -0.8741 0.3165 0.3684 +vn -0.8742 0.3163 0.3684 +vn 0.4834 0.4785 0.7330 +vn -0.8748 0.2875 0.3901 +vn -0.8744 0.2878 0.3907 +vn -0.8748 0.2876 0.3900 +vn -0.8754 0.2864 0.3893 +vn -0.8750 0.2860 0.3905 +vn -0.4849 -0.5380 -0.6895 +vn 0.4849 0.5384 0.6891 +vn 0.8734 -0.3396 -0.3491 +vn 0.4866 0.6107 0.6248 +vn 0.4866 0.6106 0.6248 +vn 0.5501 0.5364 0.6400 +vn 0.4849 0.5834 0.6515 +vn 0.4849 0.5833 0.6516 +vn 0.4063 0.5899 0.6978 +vn 0.4840 0.4998 0.7183 +vn 0.8727 -0.3303 -0.3595 +vn -0.8727 0.3304 0.3594 +vn -0.4866 -0.6105 -0.6249 +vn -0.8728 0.3400 0.3501 +vn -0.4850 -0.5839 -0.6510 +vn -0.4092 -0.5894 -0.6966 +vn -0.4850 -0.5838 -0.6511 +vn -0.5479 -0.5378 -0.6408 +vn -0.4839 -0.4998 -0.7184 +vn 0.8727 -0.3736 -0.3143 +vn -0.8727 0.3735 0.3144 +vn -0.4847 -0.5814 -0.6535 +vn 0.8699 -0.3983 -0.2911 +vn 0.8698 -0.3983 -0.2911 +vn 0.8828 -0.3633 -0.2977 +vn 0.8721 -0.3811 -0.3070 +vn 0.8721 -0.3812 -0.3069 +vn 0.8624 -0.3880 -0.3251 +vn 0.8731 -0.3614 -0.3272 +vn -0.4863 -0.5923 -0.6425 +vn 0.4860 0.5927 0.6423 +vn -0.8698 0.3983 0.2911 +vn -0.8699 0.3983 0.2911 +vn 0.4847 0.5816 0.6533 +vn -0.8721 0.3811 0.3070 +vn -0.8622 0.3882 0.3255 +vn -0.8721 0.3812 0.3069 +vn -0.8831 0.3629 0.2974 +vn -0.8731 0.3612 0.3273 +vn -0.4825 -0.5645 -0.6697 +vn 0.4826 0.5649 0.6693 +vn 0.8668 -0.4122 -0.2806 +vn 0.5004 0.7555 0.4228 +vn 0.5002 0.7557 0.4227 +vn 0.5003 0.7558 0.4224 +vn 0.5255 0.5744 0.6277 +vn 0.4862 0.6053 0.6303 +vn 0.4862 0.6055 0.6300 +vn 0.4414 0.6142 0.6542 +vn 0.4819 0.5593 0.6746 +vn 0.8690 -0.4046 -0.2849 +vn -0.8669 0.4079 0.2865 +vn -0.5004 -0.7549 -0.4240 +vn -0.5002 -0.7548 -0.4245 +vn -0.8668 0.4121 0.2807 +vn -0.4858 -0.6031 -0.6327 +vn -0.4438 -0.6109 -0.6556 +vn -0.4859 -0.6034 -0.6323 +vn -0.5227 -0.5733 -0.6309 +vn -0.4818 -0.5594 -0.6745 +vn 0.8648 -0.4420 -0.2383 +vn -0.8647 0.4422 0.2382 +vn -0.4740 -0.8709 -0.1301 +vn 0.8793 -0.4573 -0.1334 +vn 0.8793 -0.4569 -0.1347 +vn 0.8795 -0.4242 -0.2158 +vn 0.8571 -0.4748 -0.1996 +vn 0.8580 -0.4743 -0.1974 +vn 0.7775 -0.5797 -0.2437 +vn 0.8666 -0.4225 -0.2656 +vn -0.4903 -0.8082 -0.3262 +vn 0.4788 0.8472 0.2300 +vn -0.8795 0.4566 0.1341 +vn -0.8795 0.4571 0.1325 +vn -0.8572 0.4748 0.1996 +vn -0.7736 0.5845 0.2448 +vn -0.8579 0.4743 0.1975 +vn -0.8800 0.4236 0.2146 +vn -0.8663 0.4232 0.2653 +vn -0.3468 -0.8069 0.4781 +vn 0.3547 0.8144 -0.4593 +vn 0.8531 -0.4823 -0.1989 +vn 0.2798 0.7501 -0.5992 +vn 0.2798 0.7500 -0.5994 +vn 0.5764 0.6646 -0.4755 +vn 0.3368 0.7915 -0.5100 +vn 0.3372 0.7918 -0.5093 +vn 0.1366 0.9212 -0.3644 +vn 0.4230 0.8801 -0.2158 +vn 0.8667 -0.4592 -0.1949 +vn -0.8676 0.4596 0.1898 +vn -0.2799 -0.7500 0.5992 +vn -0.2799 -0.7502 0.5991 +vn -0.8565 0.4752 0.2013 +vn -0.3348 -0.7902 0.5134 +vn -0.1848 -0.8985 0.3982 +vn -0.3351 -0.7904 0.5129 +vn -0.5114 -0.7066 0.4891 +vn -0.4236 -0.8784 0.2214 +vn 0.8004 -0.5266 -0.2864 +vn -0.8003 0.5269 0.2862 +vn 0.4460 0.3694 0.8152 +vn -0.2185 -0.7055 0.6742 +vn 0.8289 -0.4970 -0.2566 +vn 0.8291 -0.4970 -0.2561 +vn -0.5355 -0.7179 -0.4448 +vn 0.8005 -0.5391 -0.2618 +vn 0.8012 -0.5269 -0.2837 +vn 0.8015 -0.5266 -0.2834 +vn 0.8148 -0.4959 -0.3002 +vn -0.2579 -0.7244 0.6393 +vn 0.2520 0.7186 -0.6481 +vn -0.8292 0.4968 0.2560 +vn -0.8290 0.4969 0.2565 +vn 0.2256 0.7044 -0.6730 +vn -0.8013 0.5268 0.2836 +vn -0.8142 0.4974 0.2994 +vn -0.8015 0.5265 0.2834 +vn -0.8007 0.5384 0.2628 +vn -0.0781 -0.5592 0.8253 +vn 0.0776 0.5586 -0.8258 +vn 0.8586 -0.4605 -0.2252 +vn -0.1251 0.2277 -0.9657 +vn -0.1248 0.2278 -0.9657 +vn 0.2050 0.4046 -0.8912 +vn -0.0084 0.4571 -0.8894 +vn -0.0087 0.4567 -0.8896 +vn -0.1822 0.6092 -0.7718 +vn 0.1581 0.6458 -0.7469 +vn 0.8451 -0.4821 -0.2311 +vn -0.8462 0.4808 0.2296 +vn 0.1250 -0.2272 0.9658 +vn 0.1254 -0.2271 0.9658 +vn -0.8583 0.4612 0.2247 +vn 0.0089 -0.4564 0.8897 +vn 0.1567 -0.5983 0.7858 +vn 0.0091 -0.4559 0.8900 +vn -0.1851 -0.4183 0.8892 +vn -0.1577 -0.6459 0.7470 +vn 0.9096 -0.3632 -0.2017 +vn -0.9095 0.3634 0.2017 +vn 0.1632 -0.1414 0.9764 +vn 0.9411 -0.2763 -0.1949 +vn 0.9414 -0.2755 -0.1945 +vn 0.9102 -0.3315 -0.2483 +vn 0.9275 -0.3203 -0.1930 +vn 0.9272 -0.3209 -0.1930 +vn 0.9268 -0.3642 -0.0916 +vn 0.8861 -0.4115 -0.2133 +vn 0.1530 -0.1903 0.9697 +vn -0.1468 0.1962 -0.9695 +vn -0.9415 0.2749 0.1950 +vn -0.9415 0.2753 0.1946 +vn -0.1636 0.1400 -0.9765 +vn -0.9274 0.3205 0.1930 +vn -0.9269 0.3654 0.0857 +vn -0.9272 0.3211 0.1929 +vn -0.9094 0.3314 0.2515 +vn -0.8859 0.4118 0.2136 +vn 0.1886 -0.0515 0.9807 +vn -0.1893 0.0493 -0.9807 +vn -0.1891 0.0502 -0.9807 +vn -0.1894 0.0502 -0.9806 +vn -0.1894 0.0501 -0.9806 +vn -0.1896 0.0503 -0.9806 +vn -0.1892 0.0503 -0.9807 +vn 0.9413 -0.2757 -0.1948 +vn -0.9414 0.2755 0.1945 +vn 0.1893 -0.0505 0.9806 +vn 0.1891 -0.0502 0.9807 +vn 0.1894 -0.0504 0.9806 +vn 0.1896 -0.0505 0.9806 +vn 0.1890 -0.0503 0.9807 +vn -0.2885 0.3679 -0.8839 +vn -0.8258 0.3716 0.4242 +vn -0.2966 0.3971 -0.8685 +vn -0.2728 0.3952 -0.8772 +vn -0.2568 0.3792 -0.8890 +vn 0.8258 -0.3716 -0.4242 +vn 0.2729 -0.3950 0.8772 +vn 0.2728 -0.3950 0.8772 +vn 0.2567 -0.3792 0.8890 +vn 0.2966 -0.3972 0.8685 +vn 0.2753 -0.3909 0.8783 +vn -0.8255 0.3710 0.4252 +vn -0.8257 0.3717 0.4244 +vn -0.8262 0.3718 0.4233 +vn 0.2699 -0.3998 0.8760 +vn -0.2715 0.3969 -0.8768 +vn -0.2747 0.3917 -0.8782 +vn 0.8257 -0.3717 -0.4244 +vn 0.8262 -0.3718 -0.4233 +vn 0.8255 -0.3710 -0.4252 +vn -0.8245 0.3739 0.4248 +vn -0.3770 0.1992 -0.9046 +vn -0.3770 0.1989 -0.9046 +vn -0.3769 0.1989 -0.9046 +vn -0.2556 0.2155 -0.9425 +vn -0.3652 0.2254 -0.9032 +vn -0.3654 0.2250 -0.9033 +vn -0.4374 0.2955 -0.8493 +vn -0.2984 0.3503 -0.8878 +vn -0.8245 0.3733 0.4253 +vn 0.8243 -0.3736 -0.4253 +vn 0.3770 -0.1989 0.9046 +vn 0.3770 -0.1991 0.9046 +vn 0.8244 -0.3734 -0.4253 +vn 0.3661 -0.2235 0.9033 +vn 0.3658 -0.2240 0.9033 +vn 0.4339 -0.2920 0.8523 +vn 0.2610 -0.2162 0.9408 +vn -0.8431 0.3304 0.4242 +vn 0.8434 -0.3300 -0.4241 +vn 0.3850 -0.1802 0.9051 +vn -0.8446 0.3280 0.4231 +vn -0.8453 0.3271 0.4225 +vn -0.8588 0.3353 0.3873 +vn -0.8490 0.3168 0.4229 +vn -0.8489 0.3171 0.4229 +vn -0.8281 0.3223 0.4586 +vn -0.8285 0.3646 0.4251 +vn 0.3834 -0.1813 0.9056 +vn -0.3842 0.1793 -0.9057 +vn 0.8452 -0.3275 -0.4224 +vn 0.8446 -0.3282 -0.4231 +vn -0.3838 0.1803 -0.9056 +vn 0.8490 -0.3169 -0.4229 +vn 0.8491 -0.3166 -0.4229 +vn 0.8285 -0.3222 -0.4580 +vn 0.8587 -0.3349 -0.3880 +vn 0.8285 -0.3645 -0.4252 +vn 0.4240 -0.0668 0.9032 +vn -0.4259 0.0616 -0.9027 +vn -0.8126 0.3972 0.4265 +vn -0.5948 -0.4821 -0.6433 +vn -0.5942 -0.4833 -0.6429 +vn -0.2490 -0.1503 -0.9568 +vn -0.4672 -0.1244 -0.8754 +vn -0.4655 -0.1208 -0.8767 +vn -0.6080 0.0270 -0.7935 +vn -0.3964 0.1473 -0.9062 +vn -0.8285 0.3655 0.4241 +vn 0.8152 -0.3782 -0.4387 +vn 0.5947 0.4856 0.6408 +vn 0.5954 0.4837 0.6415 +vn 0.8128 -0.3957 -0.4274 +vn 0.4615 0.1123 0.8800 +vn 0.4638 0.1173 0.8781 +vn 0.5855 -0.0320 0.8100 +vn 0.2717 0.1299 0.9536 +vn 0.3963 -0.1480 0.9061 +vn -0.7757 0.5474 0.3141 +vn 0.7759 -0.5463 -0.3155 +vn -0.7516 0.6573 0.0550 +vn -0.7512 0.6579 0.0540 +vn -0.4827 0.7392 0.4696 +vn -0.7415 0.6207 0.2548 +vn -0.7413 0.6203 0.2565 +vn -0.8083 0.5341 0.2478 +vn -0.8003 0.4627 0.3813 +vn 0.5767 0.5736 0.5818 +vn -0.5807 -0.5799 -0.5714 +vn 0.7512 -0.6577 -0.0560 +vn 0.7512 -0.6578 -0.0545 +vn -0.6133 -0.6331 -0.4723 +vn 0.7413 -0.6203 -0.2564 +vn 0.7415 -0.6207 -0.2549 +vn 0.8138 -0.5285 -0.2416 +vn 0.4389 -0.7532 -0.4899 +vn 0.8011 -0.4615 -0.3812 +vn 0.6529 0.7571 -0.0227 +vn -0.6536 -0.7566 0.0189 +vn -0.7478 0.6638 -0.0086 +vn -0.6167 -0.7065 0.3471 +vn -0.2788 -0.9592 0.0472 +vn -0.6377 -0.7481 0.1834 +vn -0.6375 -0.7475 0.1868 +vn -0.8245 -0.5583 0.0923 +vn -0.6550 -0.7193 -0.2316 +vn -0.7488 0.6625 0.0201 +vn 0.7462 -0.6650 -0.0302 +vn 0.7565 -0.6539 0.0119 +vn 0.1713 0.2999 0.9385 +vn 0.6366 0.7453 -0.1981 +vn 0.6370 0.7462 -0.1935 +vn 0.7874 0.6059 -0.1137 +vn 0.3523 0.9333 -0.0691 +vn 0.6541 0.7222 0.2251 +vn 0.6222 0.7201 -0.3071 +vn -0.7573 0.6531 0.0041 +vn -0.7571 0.6532 0.0035 +vn -0.7671 0.6394 -0.0523 +vn -0.7636 0.6435 -0.0521 +vn -0.7636 0.6436 -0.0515 +vn -0.7620 0.6454 -0.0532 +vn -0.7657 0.6408 -0.0559 +vn 0.6235 0.7186 -0.3079 +vn -0.6213 -0.7190 0.3114 +vn 0.7571 -0.6533 -0.0036 +vn 0.7573 -0.6531 -0.0043 +vn -0.6225 -0.7205 0.3055 +vn 0.7636 -0.6436 0.0518 +vn 0.7637 -0.6435 0.0524 +vn 0.7621 -0.6453 0.0533 +vn 0.7670 -0.6395 0.0525 +vn 0.7656 -0.6408 0.0564 +vn 0.6439 0.7477 -0.1622 +vn -0.6442 -0.7481 0.1595 +vn -0.7566 0.6538 0.0108 +vn -0.6922 -0.7009 0.1722 +vn -0.6453 -0.7492 0.1494 +vn -0.6453 -0.7492 0.1495 +vn -0.5819 -0.7945 0.1738 +vn -0.7559 0.6547 -0.0005 +vn 0.7576 -0.6527 -0.0014 +vn 0.7566 -0.6538 -0.0107 +vn 0.6452 0.7491 -0.1501 +vn 0.6452 0.7492 -0.1499 +vn 0.5776 0.7973 -0.1754 +vn 0.6953 0.6973 -0.1739 +vn -0.7561 0.6543 0.0134 +vn -0.7563 0.6541 0.0133 +vn -0.7565 0.6538 0.0135 +vn 0.7563 -0.6541 -0.0133 +vn 0.7565 -0.6538 -0.0135 +vn 0.7561 -0.6543 -0.0134 +vn -0.6636 -0.7379 0.1230 +vn -0.6486 -0.7523 0.1158 +vn -0.6320 -0.7652 0.1225 +vn 0.6486 0.7523 -0.1158 +vn 0.6318 0.7654 -0.1225 +vn 0.6638 0.7378 -0.1230 +vn 0.6504 0.7541 -0.0907 +vn -0.7490 0.6626 -0.0005 +vn -0.7575 0.6528 -0.0036 +vn -0.7657 0.6432 0.0019 +vn -0.6503 -0.7539 0.0934 +vn 0.7576 -0.6527 0.0055 +vn -0.6504 -0.7541 0.0907 +vn 0.7575 -0.6528 0.0036 +vn 0.7575 -0.6528 0.0035 +vn 0.7657 -0.6432 -0.0019 +vn 0.7490 -0.6626 0.0004 +vn 0.6515 0.7557 -0.0662 +vn -0.6515 -0.7558 0.0662 +vn -0.7567 0.6537 0.0124 +vn -0.6541 -0.7564 -0.0032 +vn -0.6737 -0.7370 0.0542 +vn -0.6519 -0.7571 0.0436 +vn -0.6519 -0.7571 0.0435 +vn -0.6282 -0.7762 0.0531 +vn -0.6508 -0.7546 0.0839 +vn -0.7567 0.6538 0.0069 +vn 0.7567 -0.6538 -0.0064 +vn 0.6541 0.7564 0.0032 +vn 0.7566 -0.6538 -0.0126 +vn 0.6519 0.7571 -0.0435 +vn 0.6519 0.7571 -0.0436 +vn 0.6278 0.7765 -0.0530 +vn 0.6741 0.7367 -0.0541 +vn -0.7550 0.6530 0.0602 +vn 0.7550 -0.6530 -0.0601 +vn 0.6533 0.7548 0.0584 +vn -0.7488 0.6277 0.2129 +vn -0.7487 0.6280 0.2125 +vn -0.7851 0.6136 0.0843 +vn -0.7499 0.6529 0.1061 +vn -0.7500 0.6528 0.1071 +vn -0.7097 0.6985 0.0922 +vn -0.7562 0.6536 0.0327 +vn 0.6538 0.7556 0.0404 +vn -0.6509 -0.7583 -0.0373 +vn 0.7486 -0.6277 -0.2134 +vn 0.7488 -0.6276 -0.2130 +vn -0.6534 -0.7547 -0.0596 +vn 0.7499 -0.6529 -0.1065 +vn 0.7499 -0.6531 -0.1055 +vn 0.7114 -0.6969 -0.0914 +vn 0.7839 -0.6152 -0.0835 +vn 0.7561 -0.6536 -0.0327 +vn 0.6618 0.7238 0.1955 +vn -0.6618 -0.7235 -0.1965 +vn -0.7483 0.6233 0.2271 +vn -0.6580 -0.7418 -0.1294 +vn -0.6583 -0.7415 -0.1296 +vn -0.7006 -0.6901 -0.1817 +vn -0.6621 -0.7191 -0.2112 +vn -0.6621 -0.7191 -0.2110 +vn -0.6083 -0.7670 -0.2042 +vn -0.6590 -0.7407 -0.1305 +vn -0.7460 0.6320 0.2100 +vn 0.7490 -0.6274 -0.2130 +vn 0.6582 0.7417 0.1291 +vn 0.6583 0.7414 0.1302 +vn 0.6580 0.7417 0.1298 +vn 0.7483 -0.6233 -0.2269 +vn -0.0398 0.2709 -0.9618 +vn 0.6621 0.7192 0.2108 +vn 0.6621 0.7191 0.2110 +vn 0.6048 0.7699 0.2036 +vn 0.7034 0.6878 0.1794 +vn 0.6592 0.7407 0.1294 +vn -0.7502 0.6376 0.1754 +vn 0.7500 -0.6380 -0.1745 +vn 0.6420 0.7667 -0.0052 +vn -0.7705 0.6288 -0.1045 +vn -0.7704 0.6289 -0.1049 +vn -0.6416 0.7575 0.1204 +vn -0.7457 0.6614 0.0799 +vn -0.7455 0.6616 0.0812 +vn -0.8040 0.5823 0.1209 +vn -0.7482 0.6226 0.2294 +vn 0.6350 0.7703 0.0588 +vn -0.6362 -0.7702 -0.0443 +vn 0.7704 -0.6290 0.1045 +vn 0.7705 -0.6289 0.1042 +vn -0.6393 -0.7689 0.0045 +vn 0.7457 -0.6615 -0.0802 +vn 0.7459 -0.6613 -0.0792 +vn 0.8068 -0.5791 -0.1175 +vn 0.6355 -0.7630 -0.1184 +vn 0.7484 -0.6222 -0.2298 +vn 0.6284 0.7280 -0.2740 +vn -0.6287 -0.7279 0.2736 +vn -0.7709 0.6126 -0.1747 +vn -0.5779 -0.5344 0.6168 +vn -0.5784 -0.5345 0.6162 +vn -0.4097 -0.8418 0.3514 +vn -0.6057 -0.6955 0.3865 +vn -0.6057 -0.6962 0.3853 +vn -0.7268 -0.6150 0.3060 +vn -0.6392 -0.7533 0.1544 +vn -0.7607 0.6335 -0.1417 +vn 0.7606 -0.6336 0.1415 +vn 0.5782 0.5337 -0.6171 +vn 0.5786 0.5350 -0.6157 +vn 0.7707 -0.6130 0.1739 +vn 0.6057 0.6970 -0.3838 +vn 0.6057 0.6962 -0.3853 +vn 0.7115 0.6306 -0.3099 +vn 0.4400 0.8271 -0.3496 +vn 0.6380 0.7536 -0.1583 +vn -0.8023 0.4979 -0.3293 +vn 0.8023 -0.4968 0.3310 +vn 0.5410 0.4199 -0.7287 +vn -0.8426 0.1544 -0.5159 +vn -0.8424 0.1540 -0.5163 +vn -0.5957 0.5674 -0.5684 +vn -0.8057 0.4021 -0.4349 +vn -0.8057 0.4022 -0.4348 +vn -0.8689 0.3914 -0.3029 +vn -0.7871 0.5691 -0.2379 +vn 0.5308 0.4946 -0.6882 +vn -0.5312 -0.4922 0.6896 +vn 0.8424 -0.1544 0.5162 +vn 0.8426 -0.1547 0.5159 +vn -0.5384 -0.4203 0.7304 +vn 0.8059 -0.4014 0.4352 +vn 0.8059 -0.4014 0.4351 +vn 0.8764 -0.3814 0.2941 +vn 0.5642 -0.5775 0.5901 +vn 0.7873 -0.5690 0.2374 +vn 0.5329 0.1319 -0.8358 +vn -0.5330 -0.1321 0.8357 +vn -0.5166 0.2496 0.8190 +vn -0.5161 0.2502 0.8192 +vn -0.5162 0.2488 0.8196 +vn -0.2328 -0.1074 0.9666 +vn -0.5148 -0.0020 0.8573 +vn -0.5148 -0.0021 0.8573 +vn -0.6548 -0.0504 0.7541 +vn -0.5420 -0.2734 0.7947 +vn -0.8319 0.1119 -0.5436 +vn 0.8307 -0.1177 0.5442 +vn 0.5160 -0.2512 -0.8189 +vn 0.5166 -0.2504 -0.8188 +vn 0.5148 0.0022 -0.8573 +vn 0.5148 0.0021 -0.8573 +vn 0.6368 0.0516 -0.7693 +vn 0.2738 0.1029 -0.9563 +vn 0.5432 0.2764 -0.7928 +vn -0.8551 -0.1270 -0.5026 +vn 0.8551 0.1257 0.5030 +vn 0.5132 -0.3258 -0.7940 +vn -0.8565 -0.2637 -0.4436 +vn -0.8565 -0.2638 -0.4437 +vn -0.7652 -0.1877 -0.6158 +vn -0.8550 -0.1861 -0.4841 +vn -0.8551 -0.1876 -0.4833 +vn -0.8931 -0.1335 -0.4296 +vn -0.8521 -0.0379 -0.5219 +vn 0.4999 -0.2865 -0.8173 +vn -0.5097 0.2761 0.8149 +vn 0.8565 0.2637 0.4437 +vn 0.8565 0.2636 0.4437 +vn -0.5133 0.3278 0.7931 +vn 0.8550 0.1865 0.4839 +vn 0.8549 0.1852 0.4845 +vn 0.8966 0.1289 0.4236 +vn 0.7567 0.1892 0.6258 +vn 0.8519 0.0387 0.5223 +vn 0.5158 -0.4176 -0.7480 +vn -0.5160 0.4174 0.7481 +vn -0.8565 -0.2650 -0.4430 +vn -0.5132 0.3385 0.7887 +vn -0.5135 0.3377 0.7889 +vn -0.5135 0.3377 0.7888 +vn -0.5008 0.4070 0.7639 +vn -0.5152 0.4076 0.7539 +vn -0.5152 0.4074 0.7540 +vn -0.5279 0.3990 0.7497 +vn -0.5156 0.3888 0.7636 +vn -0.8566 -0.2583 -0.4466 +vn 0.8567 0.2576 0.4470 +vn 0.5135 -0.3372 -0.7891 +vn 0.5132 -0.3379 -0.7890 +vn 0.8563 0.2650 0.4433 +vn 0.5152 -0.4070 -0.7542 +vn 0.5152 -0.4072 -0.7541 +vn 0.5271 -0.3993 -0.7502 +vn 0.5017 -0.4067 -0.7635 +vn 0.5154 -0.3895 -0.7633 +vn -0.8572 -0.2349 -0.4583 +vn 0.8571 0.2354 0.4581 +vn 0.5022 -0.2520 -0.8272 +vn -0.8628 -0.0503 -0.5030 +vn -0.8636 -0.0478 -0.5019 +vn -0.8821 -0.1934 -0.4295 +vn -0.8542 -0.1883 -0.4846 +vn -0.8544 -0.1867 -0.4849 +vn -0.8140 -0.2237 -0.5361 +vn -0.8566 -0.2606 -0.4453 +vn 0.5081 -0.2823 -0.8137 +vn -0.4993 0.2933 0.8153 +vn 0.8636 0.0484 0.5019 +vn 0.8627 0.0513 0.5031 +vn -0.5024 0.2492 0.8280 +vn 0.8543 0.1877 0.4847 +vn 0.8541 0.1896 0.4844 +vn 0.8158 0.2241 0.5332 +vn 0.8810 0.1957 0.4307 +vn 0.8565 0.2604 0.4456 +vn 0.5012 -0.0138 -0.8652 +vn -0.5001 0.0197 0.8657 +vn -0.8609 0.0463 -0.5067 +vn -0.4864 -0.4098 0.7717 +vn -0.4863 -0.4095 0.7719 +vn -0.4862 -0.4095 0.7719 +vn -0.6280 -0.0683 0.7752 +vn -0.4865 -0.1437 0.8618 +vn -0.4865 -0.1430 0.8619 +vn -0.2568 -0.0674 0.9641 +vn -0.5063 0.1502 0.8491 +vn -0.8536 0.0028 -0.5209 +vn 0.8536 -0.0028 0.5208 +vn 0.4862 0.4098 -0.7718 +vn 0.4864 0.4096 -0.7718 +vn 0.8608 -0.0458 0.5068 +vn 0.4864 0.1426 -0.8620 +vn 0.4865 0.1431 -0.8619 +vn 0.2235 0.0675 -0.9724 +vn 0.6444 0.0688 -0.7616 +vn 0.5054 -0.1470 -0.8503 +vn -0.8717 0.1919 -0.4509 +vn 0.8718 -0.1923 0.4505 +vn 0.4718 0.5304 -0.7043 +vn -0.8805 0.3395 -0.3309 +vn -0.8803 0.3393 -0.3316 +vn -0.9055 0.1900 -0.3793 +vn -0.8709 0.2565 -0.4193 +vn -0.8707 0.2559 -0.4199 +vn -0.7727 0.3012 -0.5588 +vn -0.8691 0.1275 -0.4780 +vn 0.4703 0.4724 -0.7454 +vn -0.4708 -0.4781 0.7415 +vn 0.8803 -0.3394 0.3315 +vn 0.8805 -0.3396 0.3307 +vn -0.4744 -0.5291 0.7036 +vn 0.8708 -0.2562 0.4196 +vn 0.8709 -0.2569 0.4189 +vn 0.7811 -0.2961 0.5497 +vn 0.9030 -0.1938 0.3834 +vn 0.8694 -0.1262 0.4776 +vn 0.4711 0.6982 -0.5391 +vn -0.4710 -0.6997 0.5372 +vn -0.8818 0.3576 -0.3074 +vn -0.4661 -0.7593 0.4540 +vn -0.4662 -0.7593 0.4540 +vn -0.5536 -0.6751 0.4877 +vn -0.4680 -0.7337 0.4925 +vn -0.4681 -0.7333 0.4932 +vn -0.3520 -0.7474 0.5635 +vn -0.4752 -0.6306 0.6137 +vn -0.8769 0.3494 -0.3300 +vn 0.8804 -0.3473 0.3229 +vn 0.4662 0.7594 -0.4539 +vn 0.4661 0.7594 -0.4539 +vn 0.8818 -0.3573 0.3078 +vn 0.4681 0.7324 -0.4945 +vn 0.4681 0.7328 -0.4939 +vn 0.3406 0.7484 -0.5691 +vn 0.5624 0.6685 -0.4866 +vn 0.4756 0.6293 -0.6147 +vn -0.8833 0.3707 -0.2870 +vn 0.8833 -0.3706 0.2872 +vn 0.4677 0.7390 -0.4849 +vn -0.8790 0.3214 -0.3523 +vn -0.8793 0.3215 -0.3514 +vn -0.8761 0.3726 -0.3060 +vn -0.8814 0.3620 -0.3035 +vn -0.8814 0.3624 -0.3030 +vn -0.8879 0.3551 -0.2926 +vn -0.8832 0.3699 -0.2884 +vn 0.4652 0.7457 -0.4769 +vn -0.4655 -0.7436 0.4799 +vn 0.8793 -0.3213 0.3517 +vn 0.8790 -0.3212 0.3525 +vn -0.4661 -0.7400 0.4849 +vn 0.8814 -0.3622 0.3032 +vn 0.8814 -0.3618 0.3037 +vn 0.8880 -0.3548 0.2927 +vn 0.8760 -0.3726 0.3064 +vn 0.8832 -0.3698 0.2885 +vn 0.4731 0.6608 -0.5827 +vn -0.4733 -0.6586 0.5850 +vn -0.8739 0.2808 -0.3968 +vn -0.4860 -0.4111 0.7712 +vn -0.4858 -0.4110 0.7714 +vn -0.3142 -0.6530 0.6891 +vn -0.4742 -0.5754 0.6664 +vn -0.4742 -0.5753 0.6664 +vn -0.5889 -0.5669 0.5761 +vn -0.4698 -0.7115 0.5225 +vn -0.8742 0.3014 -0.3806 +vn 0.8731 -0.3017 0.3830 +vn 0.4858 0.4112 -0.7713 +vn 0.4859 0.4108 -0.7715 +vn 0.8741 -0.2803 0.3966 +vn 0.4743 0.5750 -0.6666 +vn 0.4743 0.5752 -0.6665 +vn 0.5813 0.5712 -0.5795 +vn 0.3259 0.6514 -0.6851 +vn 0.4701 0.7122 -0.5213 +vn -0.8730 0.1956 -0.4469 +vn 0.8730 -0.1958 0.4468 +vn 0.4852 0.3372 -0.8067 +vn -0.8684 0.0414 -0.4941 +vn -0.8687 0.0420 -0.4935 +vn -0.8320 0.2051 -0.5154 +vn -0.8688 0.1617 -0.4680 +vn -0.8687 0.1626 -0.4678 +vn -0.8912 0.1630 -0.4232 +vn -0.8744 0.2286 -0.4281 +vn 0.4786 0.3755 -0.7936 +vn -0.4789 -0.3732 0.7946 +vn 0.8687 -0.0416 0.4936 +vn 0.8684 -0.0411 0.4941 +vn -0.4829 -0.3383 0.8076 +vn 0.8688 -0.1621 0.4679 +vn 0.8688 -0.1613 0.4681 +vn 0.8925 -0.1617 0.4211 +vn 0.8295 -0.2066 0.5189 +vn 0.8739 -0.2279 0.4295 +vn 0.4917 0.1016 -0.8648 +vn -0.4919 -0.0993 0.8650 +vn -0.8594 -0.0536 -0.5086 +vn -0.4927 0.4044 0.7705 +vn -0.4935 0.4033 0.7706 +vn -0.1801 0.0019 0.9837 +vn -0.4808 0.0792 0.8732 +vn -0.4808 0.0794 0.8732 +vn -0.6595 -0.0073 0.7516 +vn -0.4899 -0.2505 0.8350 +vn -0.8565 -0.0069 -0.5161 +vn 0.8534 0.0108 0.5212 +vn 0.4935 -0.4042 -0.7701 +vn 0.4937 -0.4009 -0.7718 +vn 0.8599 0.0540 0.5077 +vn 0.4809 -0.0801 -0.8731 +vn 0.4809 -0.0797 -0.8732 +vn 0.6399 0.0102 -0.7684 +vn 0.2202 0.0008 -0.9755 +vn 0.4903 0.2522 -0.8343 +vn -0.8679 -0.2182 -0.4462 +vn 0.8675 0.2209 0.4458 +vn 0.4797 -0.5678 -0.6690 +vn -0.8741 -0.3894 -0.2904 +vn -0.8740 -0.3896 -0.2903 +vn -0.7219 -0.3744 -0.5819 +vn -0.8636 -0.3072 -0.3997 +vn -0.8640 -0.3088 -0.3977 +vn -0.9041 -0.2285 -0.3611 +vn -0.8674 -0.1411 -0.4771 +vn 0.4649 -0.5043 -0.7277 +vn -0.4699 0.4966 0.7298 +vn 0.8740 0.3892 0.2909 +vn 0.8740 0.3896 0.2904 +vn -0.4801 0.5713 0.6657 +vn 0.8638 0.3080 0.3987 +vn 0.8635 0.3067 0.4003 +vn 0.9074 0.2237 0.3559 +vn 0.7056 0.3834 0.5959 +vn 0.8675 0.1410 0.4771 +vn 0.4846 -0.7354 -0.4737 +vn -0.4848 0.7348 0.4743 +vn -0.8739 -0.3856 -0.2960 +vn -0.4867 0.6515 0.5819 +vn -0.4866 0.6517 0.5818 +vn -0.4468 0.7275 0.5207 +vn -0.4841 0.7203 0.4967 +vn -0.4842 0.7200 0.4972 +vn -0.5156 0.6987 0.4960 +vn -0.4865 0.6889 0.5373 +vn -0.8735 -0.3811 -0.3028 +vn 0.8736 0.3801 0.3039 +vn 0.4866 -0.6519 -0.5816 +vn 0.4867 -0.6517 -0.5817 +vn 0.8734 0.3860 0.2969 +vn -0.0078 -0.6484 0.7612 +vn 0.4842 -0.7193 -0.4981 +vn 0.4842 -0.7196 -0.4977 +vn 0.5114 -0.7012 -0.4969 +vn 0.4514 -0.7262 -0.5185 +vn 0.4859 -0.6908 -0.5354 +vn -0.8735 -0.3603 -0.3274 +vn 0.8736 0.3601 0.3275 +vn 0.4866 -0.6551 -0.5779 +vn -0.8783 -0.3613 -0.3130 +vn -0.8735 -0.3657 -0.3213 +vn -0.8672 -0.3768 -0.3255 +vn -0.8736 -0.3753 -0.3099 +vn 0.4868 -0.6647 -0.5668 +vn -0.4868 0.6630 0.5687 +vn -0.4867 0.6551 0.5779 +vn 0.8735 0.3657 0.3213 +vn 0.8674 0.3766 0.3253 +vn 0.8782 0.3615 0.3132 +vn 0.8736 0.3753 0.3097 +vn -0.4863 0.6441 0.5905 +vn -0.4869 0.6603 0.5718 +vn -0.4867 0.6603 0.5720 +vn -0.4865 0.6604 0.5720 +vn -0.8735 -0.3767 -0.3084 +vn 0.8735 0.3767 0.3084 +vn 0.4867 -0.6603 -0.5720 +vn 0.4865 -0.6604 -0.5720 +vn 0.4869 -0.6602 -0.5718 +vn 0.4855 -0.6294 -0.6067 +vn -0.8743 -0.3446 -0.3418 +vn -0.8804 -0.3592 -0.3096 +vn -0.8737 -0.3649 -0.3218 +vn -0.8659 -0.3780 -0.3275 +vn 0.4858 -0.6359 -0.5997 +vn -0.4855 0.6361 0.5996 +vn 0.8743 0.3446 0.3418 +vn -0.4855 0.6294 0.6067 +vn 0.8737 0.3649 0.3218 +vn 0.8660 0.3779 0.3274 +vn 0.8804 0.3593 0.3096 +vn -0.4849 0.5953 0.6407 +vn -0.8744 -0.3295 -0.3563 +vn -0.4825 0.5004 0.7189 +vn -0.4825 0.5005 0.7189 +vn -0.4824 0.5005 0.7189 +vn -0.5243 0.5611 0.6405 +vn -0.4834 0.5649 0.6687 +vn -0.4834 0.5649 0.6688 +vn -0.4384 0.5936 0.6748 +vn -0.8738 -0.3366 -0.3511 +vn 0.8737 0.3367 0.3510 +vn 0.4825 -0.5004 -0.7189 +vn 0.4824 -0.5005 -0.7189 +vn 0.8742 0.3296 0.3565 +vn 0.4834 -0.5647 -0.6689 +vn 0.4834 -0.5648 -0.6689 +vn 0.4370 -0.5939 -0.6755 +vn 0.5255 -0.5604 -0.6401 +vn -0.8755 -0.2975 -0.3807 +vn 0.8756 0.2975 0.3807 +vn 0.0199 -0.7717 0.6356 +vn 0.4819 -0.4872 -0.7283 +vn -0.8755 -0.2973 -0.3809 +vn -0.8756 -0.2972 -0.3809 +vn -0.8842 -0.2871 -0.3685 +vn -0.8758 -0.2910 -0.3852 +vn -0.8758 -0.2911 -0.3851 +vn -0.8649 -0.3076 -0.3968 +vn 0.4824 -0.4987 -0.7201 +vn -0.4824 0.4975 0.7210 +vn 0.8756 0.2972 0.3808 +vn -0.4821 0.4872 0.7281 +vn 0.8758 0.2911 0.3851 +vn 0.8758 0.2910 0.3852 +vn 0.8650 0.3073 0.3966 +vn 0.8840 0.2872 0.3688 +vn 0.8751 0.3123 0.3697 +vn 0.4824 -0.4998 -0.7193 +vn -0.4824 0.5003 0.7190 +vn -0.8742 -0.3187 -0.3664 +vn -0.4856 0.6262 0.6099 +vn -0.4854 0.6264 0.6098 +vn -0.4854 0.6260 0.6103 +vn -0.4293 0.5455 0.7198 +vn -0.4821 0.5424 0.6880 +vn -0.4821 0.5422 0.6882 +vn -0.5299 0.5090 0.6783 +vn -0.4819 0.4809 0.7324 +vn -0.8748 -0.3103 -0.3720 +vn 0.8739 0.3122 0.3725 +vn 0.4854 -0.6263 -0.6100 +vn 0.4855 -0.6263 -0.6100 +vn 0.4854 -0.6268 -0.6095 +vn 0.8742 0.3186 0.3665 +vn 0.4821 -0.5418 -0.6885 +vn 0.4821 -0.5420 -0.6883 +vn 0.5286 -0.5087 -0.6795 +vn 0.4308 -0.5443 -0.7198 +vn 0.4819 -0.4808 -0.7325 +vn -0.8740 -0.3591 -0.3273 +vn 0.8740 0.3590 0.3274 +vn -0.8721 -0.3912 -0.2940 +vn -0.0965 0.7185 -0.6889 +vn -0.8541 -0.3866 -0.3481 +vn -0.8741 -0.3714 -0.3131 +vn -0.8741 -0.3718 -0.3127 +vn -0.8893 -0.3448 -0.3005 +vn -0.8744 -0.3379 -0.3483 +vn 0.4843 -0.6107 -0.6265 +vn -0.4847 0.6097 0.6271 +vn 0.8721 0.3912 0.2939 +vn -0.4854 0.6186 0.6179 +vn 0.8741 0.3717 0.3128 +vn 0.8741 0.3713 0.3132 +vn 0.8897 0.3441 0.3001 +vn 0.8536 0.3870 0.3488 +vn 0.8744 0.3378 0.3483 +vn 0.4809 -0.5733 -0.6634 +vn -0.4808 0.5731 0.6636 +vn -0.8704 -0.4011 -0.2855 +vn -0.4900 0.6423 0.5894 +vn -0.4901 0.6420 0.5895 +vn -0.4977 0.5775 0.6472 +vn -0.4815 0.5806 0.6566 +vn -0.4675 0.5911 0.6574 +vn -0.4835 0.5972 0.6400 +vn -0.8719 -0.3953 -0.2890 +vn 0.8709 0.3970 0.2899 +vn 0.4900 -0.6411 -0.5906 +vn 0.4898 -0.6414 -0.5905 +vn 0.8704 0.4010 0.2855 +vn 0.4814 -0.5802 -0.6570 +vn 0.4814 -0.5803 -0.6569 +vn 0.4666 -0.5914 -0.6577 +vn 0.4986 -0.5770 -0.6469 +vn 0.4835 -0.5972 -0.6400 +vn -0.8677 -0.4224 -0.2621 +vn 0.8676 0.4227 0.2619 +vn 0.4952 -0.7482 -0.4416 +vn -0.8711 -0.4652 -0.1573 +vn -0.8713 -0.4644 -0.1588 +vn -0.8353 -0.4778 -0.2720 +vn -0.8597 -0.4500 -0.2415 +vn -0.8591 -0.4494 -0.2448 +vn -0.8782 -0.4131 -0.2410 +vn -0.8694 -0.4102 -0.2755 +vn 0.4804 -0.6954 -0.5344 +vn -0.4870 0.7287 0.4814 +vn 0.8715 0.4648 0.1566 +vn 0.8713 0.4645 0.1585 +vn -0.4894 0.7431 0.4564 +vn 0.8592 0.4495 0.2444 +vn 0.8598 0.4501 0.2412 +vn 0.8786 0.4129 0.2399 +vn 0.8344 0.4791 0.2725 +vn 0.8694 0.4101 0.2755 +vn 0.4540 -0.8878 0.0752 +vn -0.4511 0.8876 -0.0933 +vn -0.8731 -0.4673 -0.1392 +vn -0.2896 0.7326 -0.6160 +vn -0.2899 0.7327 -0.6158 +vn 0.0519 0.9944 -0.0926 +vn -0.4015 0.8429 -0.3582 +vn -0.3991 0.8410 -0.3653 +vn -0.7547 0.5974 -0.2712 +vn -0.8681 -0.4723 -0.1524 +vn 0.8671 0.4736 0.1545 +vn 0.2897 -0.7325 0.6160 +vn 0.2897 -0.7327 0.6158 +vn 0.8745 0.4646 0.1393 +vn 0.3901 -0.8338 0.3906 +vn 0.3934 -0.8365 0.3816 +vn 0.6857 -0.6647 0.2966 +vn 0.0422 -0.9896 0.1378 +vn 0.4937 -0.8350 -0.2428 +vn -0.8496 -0.4928 -0.1879 +vn 0.8493 0.4932 0.1882 +vn -0.3340 0.4041 0.8516 +vn 0.2550 -0.6913 0.6761 +vn -0.8393 -0.5035 -0.2050 +vn -0.8392 -0.5036 -0.2054 +vn -0.8664 -0.4402 -0.2357 +vn -0.8407 -0.5018 -0.2036 +vn -0.8361 -0.5245 -0.1608 +vn -0.8712 -0.4686 -0.1460 +vn 0.2681 -0.7104 0.6507 +vn -0.2685 0.7108 -0.6501 +vn 0.8392 0.5035 0.2054 +vn 0.8393 0.5035 0.2049 +vn -0.2514 0.6931 -0.6756 +vn 0.8405 0.5020 0.2038 +vn 0.8363 0.5236 0.1625 +vn 0.8656 0.4424 0.2347 +vn 0.8712 0.4686 0.1463 +vn 0.1572 -0.5869 0.7943 +vn -0.1567 0.5861 -0.7949 +vn -0.8537 -0.4860 -0.1869 +vn 0.0091 0.3394 -0.9406 +vn 0.0093 0.3393 -0.9406 +vn 0.0220 0.6230 -0.7819 +vn -0.0959 0.5140 -0.8524 +vn -0.0963 0.5146 -0.8520 +vn -0.2584 0.4673 -0.8455 +vn -0.2089 0.6468 -0.7335 +vn -0.8480 -0.4939 -0.1922 +vn 0.8486 0.4936 0.1902 +vn -0.0093 -0.3393 0.9406 +vn -0.0095 -0.3389 0.9408 +vn 0.8536 0.4862 0.1870 +vn 0.0965 -0.5149 0.8518 +vn 0.0961 -0.5142 0.8523 +vn 0.2472 -0.4762 0.8439 +vn -0.0079 -0.6171 0.7868 +vn 0.2094 -0.6471 0.7331 +vn -0.8897 -0.4270 -0.1616 +vn 0.8897 0.4271 0.1616 +vn -0.0557 -0.2558 0.9651 +vn -0.9374 -0.3187 -0.1405 +vn -0.9372 -0.3191 -0.1408 +vn -0.8980 -0.4344 -0.0701 +vn -0.9084 -0.3912 -0.1473 +vn -0.9086 -0.3909 -0.1473 +vn -0.8974 -0.3943 -0.1979 +vn -0.8699 -0.4607 -0.1760 +vn -0.0377 -0.3010 0.9529 +vn 0.0363 0.3045 -0.9518 +vn 0.9373 0.3189 0.1408 +vn 0.9374 0.3186 0.1405 +vn 0.0561 0.2549 -0.9653 +vn 0.9086 0.3909 0.1473 +vn 0.9084 0.3912 0.1473 +vn 0.8973 0.3936 0.1996 +vn 0.8978 0.4353 0.0666 +vn 0.8699 0.4607 0.1761 +vn -0.1155 -0.0995 0.9883 +vn 0.1159 0.0981 -0.9884 +vn -0.9469 -0.2905 -0.1381 +vn 0.2302 0.1109 -0.9668 +vn 0.1346 0.0442 -0.9899 +vn 0.1346 0.0441 -0.9899 +vn 0.0361 0.0465 -0.9983 +vn 0.0894 0.1686 -0.9816 +vn -0.9422 -0.3055 -0.1374 +vn 0.9420 0.3062 0.1374 +vn 0.9469 0.2902 0.1386 +vn -0.1347 -0.0436 0.9899 +vn -0.1347 -0.0438 0.9899 +vn -0.0433 -0.0476 0.9979 +vn -0.2227 -0.1073 0.9690 +vn -0.0896 -0.1683 0.9817 +vt 0.937500 1.000000 +vt 0.062500 0.937500 +vt 0.937500 0.937500 +vt -0.000000 0.062500 +vt -0.000000 0.937500 +vt 0.562500 0.562500 +vt 0.437500 0.500000 +vt 0.562500 0.500000 +vt 0.437500 0.437500 +vt 0.562500 0.437500 +vt 1.000000 0.062500 +vt 0.937500 0.062500 +vt 0.062500 0.062500 +vt 0.562500 0.375000 +vt 0.000000 1.000000 +vt 0.062500 1.000000 +vt 0.937500 0.000000 +vt 0.062500 0.000000 +vt 0.375000 0.625000 +vt 0.375000 0.437500 +vt 0.375000 0.500000 +vt 0.437500 0.375000 +vt 0.500000 0.437500 +vt 0.500000 0.375000 +vt 0.625000 0.500000 +vt 0.625000 0.625000 +vt 0.562500 0.625000 +vt 0.437500 0.562500 +vt -0.000000 0.625000 +vt 1.000000 0.625000 +vt 0.937500 0.625000 +vt 0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.875000 0.625000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt -0.000000 0.000000 +vt -0.000000 0.000000 +vt 0.062500 0.000000 +vt 0.062500 0.062500 +vt 0.562500 0.687500 +vt 0.625000 0.687500 +vt 0.562500 0.750000 +vt 0.937500 0.687500 +vt 0.062500 0.687500 +vt 1.000000 0.937500 +vt 1.000000 0.687500 +vt 0.437500 0.687500 +vt 0.375000 0.687500 +vt 0.375000 0.750000 +vt 0.500000 0.687500 +vt 0.500000 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.750000 +vt -0.000000 0.687500 +vt 0.125000 0.937500 +vt 0.875000 0.937500 +vt 0.062500 0.562500 +vt -0.000000 0.562500 +vt 0.937500 0.562500 +vt 0.875000 0.125000 +vt 0.125000 0.062500 +vt 0.812500 1.000000 +vt 0.187500 0.625000 +vt 0.625000 0.437500 +vt 0.500000 1.000000 +vt 0.312500 0.937500 +vt 0.312500 1.000000 +vt 0.750000 0.937500 +vt 0.750000 1.000000 +vt 0.250000 0.937500 +vt 0.250000 1.000000 +vt 0.250000 0.687500 +vt 0.250000 0.625000 +vt -0.000000 0.500000 +vt 0.062500 0.437500 +vt -0.000000 0.375000 +vt -0.000000 0.437500 +vt 0.187500 0.687500 +vt 0.812500 0.937500 +vt 0.812500 0.000000 +vt 0.812500 0.062500 +vt 0.812500 0.687500 +vt 0.812500 0.625000 +vt 0.500000 -0.000000 +vt 0.312500 0.062500 +vt 0.500000 0.062500 +vt 0.562500 0.000000 +vt 0.250000 0.062500 +vt 0.250000 0.000000 +vt 0.750000 0.625000 +vt 0.062500 0.312500 +vt -0.000000 0.312500 +vt 0.062500 0.500000 +vt 0.750000 0.687500 +vt 0.562500 0.062500 +vt 0.312500 0.000000 +vt 0.500000 0.937500 +vt 0.062500 0.375000 +vt 0.625000 0.562500 +vt 0.375000 0.562500 +vt 0.125000 0.625000 +vt 1.000000 -0.000000 +vt 0.062500 1.000000 +vt 0.000000 1.000000 +vt 0.625000 0.750000 +vt 0.125000 1.000000 +vt 0.875000 1.000000 +vt 1.000000 0.562500 +vt 0.875000 0.875000 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.125000 +vt 0.062500 0.125000 +vt 0.937500 0.375000 +s 0 +g Chest_chest-front +usemtl chest-front +f 35/6/1 32/7/1 5/8/1 +f 11/8/1 40/9/1 57/10/1 +f 33/13/1 55/12/1 38/14/1 +f 6/19/3 27/9/3 26/20/3 +f 13/7/4 26/20/4 27/21/4 +f 25/22/3 13/23/3 7/24/3 +f 25/22/4 38/10/4 30/14/4 +f 38/14/2 57/23/2 30/24/2 +f 17/25/4 57/10/4 56/8/4 +f 9/26/2 8/27/2 29/6/2 +f 5/8/6 16/9/6 11/10/6 +f 36/6/3 5/25/3 11/8/3 +f 54/28/4 35/27/4 36/6/4 +f 12/28/2 16/21/2 32/7/2 +f 33/13/6 37/17/6 55/12/6 +f 33/13/2 18/29/2 39/4/2 +f 37/12/3 21/30/3 55/11/3 +f 6/19/1 54/28/1 36/6/1 +f 126/38/9 22/39/9 104/40/9 +f 106/26/2 66/41/2 86/27/2 +f 66/42/10 88/43/10 73/41/10 +f 94/44/11 85/31/11 124/30/11 +f 125/32/11 105/48/11 80/49/11 +f 119/2/11 120/45/11 68/50/11 +f 86/26/10 123/44/10 106/42/10 +f 94/44/3 89/46/3 123/47/3 +f 73/51/3 118/27/3 112/52/3 +f 105/53/10 118/41/10 87/48/10 +f 87/52/2 78/48/2 105/53/2 +f 69/49/10 67/54/10 68/50/10 +f 80/19/3 68/48/3 79/53/3 +f 80/19/10 120/45/10 108/33/10 +f 119/2/2 108/55/2 120/45/2 +f 119/16/9 95/3/9 116/2/9 +f 149/56/9 70/57/9 85/1/9 +f 37/12/1 39/13/1 15/18/1 +f 48/1/6 23/35/6 81/3/6 +f 24/29/6 18/58/6 50/59/6 +f 28/30/6 20/60/6 21/31/6 +f 122/37/3 82/37/3 123/37/3 +f 118/37/12 106/37/12 70/37/12 +f 121/37/2 103/37/2 104/37/2 +f 122/37/11 104/37/11 102/37/11 +f 127/31/5 128/13/5 130/33/5 +f 144/2/12 148/44/12 145/45/12 +f 6/49/6 9/26/6 14/19/6 +f 35/6/1 12/28/1 32/7/1 +f 11/8/1 16/7/1 40/9/1 +f 40/9/1 25/22/1 30/14/1 +f 57/10/1 31/65/1 11/8/1 +f 31/65/1 29/100/1 11/8/1 +f 40/9/1 30/14/1 57/10/1 +f 29/100/1 36/6/1 11/8/1 +f 7/22/1 13/9/1 27/20/1 +f 27/20/1 14/19/1 50/33/1 +f 55/12/1 21/31/1 17/65/1 +f 21/31/1 9/26/1 17/65/1 +f 17/65/1 56/10/1 38/14/1 +f 27/20/1 50/33/1 33/13/1 +f 7/22/1 27/20/1 33/13/1 +f 55/12/1 17/65/1 38/14/1 +f 38/14/1 7/22/1 33/13/1 +f 6/19/3 14/53/3 27/9/3 +f 13/7/4 40/9/4 26/20/4 +f 25/22/3 40/9/3 13/23/3 +f 25/22/4 7/9/4 38/10/4 +f 38/14/2 56/10/2 57/23/2 +f 17/25/4 31/65/4 57/10/4 +f 29/6/2 31/10/2 17/65/2 +f 17/65/2 9/26/2 29/6/2 +f 5/8/6 32/7/6 16/9/6 +f 36/6/3 35/100/3 5/25/3 +f 54/28/4 12/53/4 35/27/4 +f 12/28/2 54/101/2 16/21/2 +f 33/13/6 39/18/6 37/17/6 +f 33/13/2 50/33/2 18/29/2 +f 37/12/3 28/31/3 21/30/3 +f 29/100/1 8/26/1 36/6/1 +f 8/26/1 6/19/1 36/6/1 +f 6/19/1 26/20/1 54/28/1 +f 26/20/1 40/9/1 16/7/1 +f 54/28/1 26/20/1 16/7/1 +f 103/104/9 84/105/9 104/40/9 +f 84/105/9 126/38/9 104/40/9 +f 106/26/2 71/42/2 66/41/2 +f 66/42/10 71/106/10 88/43/10 +f 124/30/11 63/35/11 95/3/11 +f 63/35/11 74/1/11 95/3/11 +f 95/3/11 94/44/11 124/30/11 +f 95/3/11 74/1/11 116/2/11 +f 74/1/11 65/15/11 116/2/11 +f 125/32/11 85/31/11 105/48/11 +f 85/31/11 94/44/11 86/42/11 +f 86/42/11 66/106/11 112/41/11 +f 66/106/11 73/43/11 112/41/11 +f 85/31/11 86/42/11 112/41/11 +f 105/48/11 85/31/11 112/41/11 +f 108/45/11 116/2/11 125/32/11 +f 116/2/11 65/15/11 125/32/11 +f 105/48/11 78/54/11 69/50/11 +f 105/48/11 69/50/11 80/49/11 +f 80/49/11 108/45/11 125/32/11 +f 87/48/11 118/41/11 88/43/11 +f 71/106/11 106/42/11 123/44/11 +f 67/54/11 87/48/11 88/43/11 +f 71/106/11 123/44/11 89/3/11 +f 67/54/11 88/43/11 89/3/11 +f 88/43/11 71/106/11 89/3/11 +f 120/45/11 79/49/11 68/50/11 +f 68/50/11 67/54/11 119/2/11 +f 119/2/11 67/54/11 89/3/11 +f 86/26/10 94/31/10 123/44/10 +f 94/44/3 95/3/3 89/46/3 +f 73/51/3 88/41/3 118/27/3 +f 105/53/10 112/27/10 118/41/10 +f 87/52/2 67/51/2 78/48/2 +f 69/49/10 78/48/10 67/54/10 +f 80/19/3 69/49/3 68/48/3 +f 80/19/10 79/49/10 120/45/10 +f 119/2/2 116/5/2 108/55/2 +f 119/16/9 89/1/9 95/3/9 +f 102/12/9 104/13/9 22/18/9 +f 22/18/9 81/17/9 102/12/9 +f 81/17/9 61/103/9 83/11/9 +f 83/11/9 124/35/9 82/3/9 +f 124/35/9 85/1/9 82/3/9 +f 81/17/9 83/11/9 102/12/9 +f 85/1/9 125/15/9 149/56/9 +f 125/15/9 84/5/9 103/2/9 +f 125/15/9 103/2/9 149/56/9 +f 102/12/9 83/11/9 82/3/9 +f 70/57/9 82/3/9 85/1/9 +f 39/13/1 18/33/1 60/32/1 +f 60/32/1 4/37/1 39/13/1 +f 4/37/1 15/18/1 39/13/1 +f 2/36/1 59/30/1 37/12/1 +f 59/30/1 28/31/1 37/12/1 +f 2/36/1 37/12/1 15/18/1 +f 22/2/6 126/5/6 19/15/6 +f 51/16/6 135/107/6 22/2/6 +f 135/107/6 136/108/6 22/2/6 +f 22/2/6 19/15/6 51/16/6 +f 23/35/6 61/46/6 81/3/6 +f 81/3/6 22/2/6 136/108/6 +f 136/108/6 48/1/6 81/3/6 +f 24/29/6 60/33/6 18/58/6 +f 28/30/6 59/109/6 20/60/6 +f 122/37/3 102/37/3 82/37/3 +f 79/37/12 68/37/12 87/37/12 +f 68/37/12 67/37/12 87/37/12 +f 103/37/12 120/37/12 149/37/12 +f 120/37/12 79/37/12 149/37/12 +f 79/37/12 87/37/12 149/37/12 +f 87/37/12 118/37/12 149/37/12 +f 118/37/12 88/37/12 106/37/12 +f 88/37/12 71/37/12 106/37/12 +f 106/37/12 123/37/12 70/37/12 +f 123/37/12 82/37/12 70/37/12 +f 70/37/12 149/37/12 118/37/12 +f 121/37/2 120/37/2 103/37/2 +f 122/37/11 121/37/11 104/37/11 +f 127/31/5 133/12/5 128/13/5 +f 144/2/12 141/3/12 148/44/12 +f 6/49/6 8/42/6 9/26/6 +g Chest_chest-top +usemtl chest-top +f 53/1/1 34/2/1 44/3/1 +f 33/4/2 34/2/2 58/5/2 +f 53/3/3 43/11/3 55/12/3 +f 3/15/4 10/16/4 34/2/4 +f 33/13/4 53/3/4 55/12/4 +f 33/13/5 43/17/5 45/18/5 +f 1/35/4 2/36/4 44/3/4 +f 107/13/10 74/17/10 93/12/10 +f 119/13/10 90/3/10 117/2/10 +f 90/3/11 91/16/11 117/2/11 +f 90/46/3 93/12/3 92/3/3 +f 117/2/2 107/4/2 119/13/2 +f 89/17/12 107/13/12 93/12/12 +f 77/16/10 92/3/10 72/1/10 +f 130/61/6 51/13/6 50/12/6 +f 136/2/6 131/62/6 129/56/6 +f 137/13/13 138/3/13 140/2/13 +f 142/3/9 144/13/9 143/2/9 +f 148/56/9 149/13/9 145/62/9 +f 104/12/9 102/3/9 146/61/9 +f 53/1/1235 58/16/1235 34/2/1235 +f 33/4/2 45/13/2 34/2/2 +f 53/3/3 44/46/3 43/11/3 +f 34/2/4 45/13/4 4/37/4 +f 45/13/4 15/18/4 4/37/4 +f 4/37/4 3/15/4 34/2/4 +f 33/13/1236 58/2/1236 53/3/1236 +f 33/13/5 55/12/5 43/17/5 +f 2/36/4 15/18/4 43/12/4 +f 15/18/4 45/13/4 43/12/4 +f 34/2/4 10/16/4 44/3/4 +f 10/16/4 1/35/4 44/3/4 +f 2/36/4 43/12/4 44/3/4 +f 107/13/10 91/2/10 76/4/10 +f 91/2/10 77/16/10 64/15/10 +f 76/4/10 91/2/10 64/15/10 +f 76/4/10 65/37/10 107/13/10 +f 65/37/10 74/17/10 107/13/10 +f 74/17/10 63/36/10 93/12/10 +f 63/36/10 75/46/10 93/12/10 +f 75/46/10 62/35/10 92/3/10 +f 62/35/10 72/1/10 92/3/10 +f 75/46/10 92/3/10 93/12/10 +f 119/13/10 89/12/10 90/3/10 +f 90/3/11 92/1/11 91/16/11 +f 90/46/3 89/11/3 93/12/3 +f 117/2/2 91/5/2 107/4/2 +f 89/17/12 119/18/12 107/13/12 +f 77/16/10 91/2/10 92/3/10 +f 21/3/6 48/2/6 127/110/6 +f 48/2/6 136/111/6 129/112/6 +f 127/110/6 48/2/6 129/112/6 +f 130/61/6 131/113/6 51/13/6 +f 131/113/6 135/114/6 51/13/6 +f 21/3/6 127/110/6 9/31/6 +f 127/110/6 130/61/6 9/31/6 +f 50/12/6 14/115/6 130/61/6 +f 14/115/6 9/31/6 130/61/6 +f 136/2/6 135/13/6 131/62/6 +f 137/13/6 139/12/6 138/3/6 +f 142/3/9 141/12/9 144/13/9 +f 148/56/9 70/2/9 149/13/9 +f 102/3/9 82/2/9 148/112/9 +f 82/2/9 70/111/9 148/112/9 +f 149/114/9 103/13/9 145/113/9 +f 103/13/9 104/12/9 145/113/9 +f 102/3/9 148/112/9 147/110/9 +f 146/61/9 145/113/9 104/12/9 +f 102/3/9 147/110/9 146/61/9 +g Chest_chest-side +usemtl chest-side +f 42/18/7 33/12/7 58/13/7 +f 33/11/5 24/31/5 50/30/5 +f 19/32/1 58/13/1 51/33/1 +f 22/30/2 58/12/2 49/11/2 +f 58/18/8 52/12/8 49/13/8 +f 52/13/3 48/29/3 81/33/3 +f 136/34/5 48/31/5 53/12/5 +f 46/17/6 55/13/6 47/18/6 +f 23/30/1 53/12/1 46/11/1 +f 21/29/5 47/13/5 55/4/5 +f 55/13/2 48/31/2 21/33/2 +f 58/12/3 50/33/3 51/31/3 +f 47/13/2 2/37/2 1/36/2 +f 52/13/5 1/37/5 10/17/5 +f 61/32/12 111/45/12 113/2/12 +f 97/46/3 96/47/3 125/31/3 +f 114/2/2 63/15/2 124/32/2 +f 99/3/2 98/44/2 61/30/2 +f 101/46/12 100/47/12 126/31/12 +f 97/3/9 117/16/9 119/1/9 +f 96/44/12 119/46/12 120/47/12 +f 109/45/3 115/2/3 64/15/3 +f 96/31/10 121/45/10 109/33/10 +f 111/33/10 121/44/10 122/45/10 +f 98/31/10 123/45/10 110/33/10 +f 115/5/11 121/45/11 117/2/11 +f 117/3/3 120/45/3 119/2/3 +f 101/46/2 121/44/2 100/47/2 +f 122/55/3 113/2/3 111/45/3 +f 113/2/9 117/1/9 101/3/9 +f 121/45/12 90/3/12 122/44/12 +f 99/46/11 122/44/11 98/47/11 +f 90/1/9 114/2/9 89/16/9 +f 89/5/12 110/45/12 123/55/12 +f 90/3/2 123/45/2 122/44/2 +f 3/37/3 4/36/3 42/13/3 +f 134/13/1 129/31/1 131/33/1 +f 129/31/3 133/13/3 127/33/3 +f 130/33/2 134/12/2 131/31/2 +f 144/2/2 146/44/2 143/3/2 +f 147/44/11 143/2/11 146/45/11 +f 148/45/3 142/3/3 147/44/3 +f 42/18/6 41/17/6 33/12/6 +f 33/11/5 41/12/5 24/31/5 +f 19/32/1237 42/4/1237 58/13/1237 +f 22/30/2 51/31/2 58/12/2 +f 58/18/1238 53/17/1238 52/12/1238 +f 52/13/3 53/4/3 48/29/3 +f 53/12/5 58/13/5 136/34/5 +f 58/13/5 51/33/5 135/102/5 +f 58/13/5 135/102/5 136/34/5 +f 46/17/6 53/12/6 55/13/6 +f 23/30/1 48/31/1 53/12/1 +f 21/29/5 20/33/5 47/13/5 +f 55/13/2 53/12/2 48/31/2 +f 58/12/3 33/13/3 50/33/3 +f 1/36/2 61/30/2 46/12/2 +f 61/30/2 23/31/2 46/12/2 +f 20/33/2 59/32/2 47/13/2 +f 59/32/2 2/37/2 47/13/2 +f 1/36/2 46/12/2 47/13/2 +f 52/13/5 81/33/5 61/32/5 +f 10/17/5 3/103/5 49/12/5 +f 3/103/5 126/30/5 49/12/5 +f 126/30/5 22/31/5 49/12/5 +f 52/13/5 61/32/5 1/37/5 +f 49/12/5 52/13/5 10/17/5 +f 72/16/12 62/15/12 113/2/12 +f 62/15/12 61/32/12 113/2/12 +f 61/32/12 81/33/12 111/45/12 +f 81/33/12 22/31/12 111/45/12 +f 22/31/12 100/44/12 111/45/12 +f 113/2/12 101/3/12 72/16/12 +f 101/3/12 77/1/12 72/16/12 +f 125/31/3 65/1/3 97/46/3 +f 65/1/3 76/35/3 97/46/3 +f 96/47/3 84/30/3 125/31/3 +f 124/32/2 83/31/2 110/45/2 +f 83/31/2 98/44/2 110/45/2 +f 99/3/2 75/1/2 114/2/2 +f 75/1/2 63/15/2 114/2/2 +f 124/32/2 110/45/2 114/2/2 +f 61/30/2 62/35/2 99/3/2 +f 62/35/2 75/1/2 99/3/2 +f 98/44/2 83/31/2 61/30/2 +f 126/31/12 64/1/12 101/46/12 +f 64/1/12 77/35/12 101/46/12 +f 100/47/12 22/30/12 126/31/12 +f 97/3/9 115/2/9 117/16/9 +f 96/44/12 97/3/12 119/46/12 +f 126/32/3 84/31/3 109/45/3 +f 84/31/3 96/44/3 109/45/3 +f 97/3/3 76/1/3 115/2/3 +f 76/1/3 64/15/3 115/2/3 +f 126/32/3 109/45/3 64/15/3 +f 96/31/10 120/44/10 121/45/10 +f 111/33/10 100/31/10 121/44/10 +f 98/31/10 122/44/10 123/45/10 +f 115/5/11 109/55/11 121/45/11 +f 117/3/3 121/44/3 120/45/3 +f 101/46/2 117/3/2 121/44/2 +f 122/55/3 90/5/3 113/2/3 +f 113/2/9 90/16/9 117/1/9 +f 121/45/12 117/2/12 90/3/12 +f 99/46/11 90/3/11 122/44/11 +f 90/1/9 99/3/9 114/2/9 +f 89/5/12 114/2/12 110/45/12 +f 90/3/2 89/2/2 123/45/2 +f 42/13/3 19/33/3 126/32/3 +f 4/36/3 60/30/3 41/12/3 +f 60/30/3 24/31/3 41/12/3 +f 42/13/3 126/32/3 3/37/3 +f 4/36/3 41/12/3 42/13/3 +f 134/13/1 132/12/1 129/31/1 +f 129/31/3 132/12/3 133/13/3 +f 130/33/2 128/13/2 134/12/2 +f 144/2/2 145/45/2 146/44/2 +f 147/44/11 142/3/11 143/2/11 +f 148/45/3 141/2/3 142/3/3 +g Chest_chain.001 +usemtl chain.001 +f 158/63/14 150/46/14 152/35/14 +f 155/55/15 173/64/15 159/29/15 +f 173/6/16 172/8/16 162/65/16 +f 161/66/17 162/67/17 160/68/17 +f 157/7/16 159/28/16 158/19/16 +f 154/69/15 150/66/15 151/70/15 +f 153/15/18 165/71/18 163/72/18 +f 160/65/19 151/10/19 171/8/19 +f 156/53/18 172/73/18 171/74/18 +f 171/58/20 154/75/20 151/59/20 +f 163/76/20 173/77/20 175/78/20 +f 150/20/19 153/19/19 156/7/19 +f 159/74/20 156/79/20 155/73/20 +f 162/80/21 151/70/21 160/63/21 +f 163/72/22 164/67/22 161/68/22 +f 168/81/14 169/11/14 166/82/14 +f 190/30/23 175/83/23 171/84/23 +f 181/26/24 182/27/24 183/6/24 +f 181/85/25 176/86/25 177/87/25 +f 173/7/18 175/28/18 174/19/18 +f 170/82/26 166/88/26 167/81/26 +f 169/37/27 182/89/27 179/90/27 +f 177/26/28 180/8/28 190/6/28 +f 173/41/29 180/91/29 172/27/29 +f 180/77/30 170/92/30 167/93/30 +f 190/78/30 182/94/30 183/76/30 +f 180/91/31 183/83/31 190/95/31 +f 166/20/15 169/19/15 172/7/15 +f 175/33/20 172/59/20 171/29/20 +f 170/87/32 176/88/32 178/96/32 +f 182/89/33 177/97/33 179/90/33 +f 191/63/34 184/46/34 187/35/34 +f 183/55/35 206/64/35 192/29/35 +f 197/26/36 206/6/36 205/8/36 +f 197/98/37 193/68/37 194/66/37 +f 191/19/38 187/20/38 192/28/38 +f 189/69/39 184/66/39 185/70/39 +f 188/15/40 198/71/40 196/72/40 +f 194/26/41 204/8/41 186/6/41 +f 190/53/42 205/73/42 204/74/42 +f 185/59/43 205/94/43 189/75/43 +f 186/78/43 198/99/43 206/77/43 +f 206/27/43 204/51/43 186/41/43 +f 183/28/44 190/7/44 184/20/44 +f 189/69/45 193/63/45 195/80/45 +f 198/71/46 194/68/46 196/72/46 +f 207/36/47 199/82/47 201/81/47 +f 204/84/48 215/47/48 186/83/48 +f 213/26/49 214/27/49 215/6/49 +f 213/85/50 208/86/50 209/87/50 +f 206/7/51 186/28/51 207/19/51 +f 203/82/52 199/88/52 200/81/52 +f 202/37/53 214/89/53 211/90/53 +f 222/6/54 208/65/54 212/8/54 +f 205/27/55 224/95/55 212/91/55 +f 212/77/56 203/92/56 200/93/56 +f 222/78/56 214/94/56 215/76/56 +f 222/95/57 224/84/57 215/83/57 +f 199/20/58 202/19/58 205/7/58 +f 203/87/59 208/88/59 210/96/59 +f 214/89/60 209/97/60 211/90/60 +f 219/35/61 220/80/61 216/46/61 +f 215/55/62 233/64/62 224/29/62 +f 231/26/63 232/27/63 233/6/63 +f 231/98/64 225/68/64 226/66/64 +f 223/19/65 219/20/65 224/28/65 +f 221/69/66 216/66/66 217/70/66 +f 220/15/67 232/71/67 228/72/67 +f 226/26/68 229/8/68 218/6/68 +f 222/53/69 230/73/69 229/74/69 +f 229/58/70 221/75/70 217/59/70 +f 228/76/70 233/77/70 218/78/70 +f 218/41/70 230/52/70 229/51/70 +f 215/28/71 222/7/71 216/20/71 +f 227/80/72 217/70/72 225/63/72 +f 228/72/73 231/67/73 226/68/73 +f 240/36/74 234/82/74 237/81/74 +f 236/30/75 218/83/75 229/84/75 +f 246/26/76 247/27/76 254/6/76 +f 242/87/77 243/97/77 241/86/77 +f 233/7/78 218/28/78 240/19/78 +f 237/96/79 235/81/79 239/82/79 +f 240/4/80 244/90/80 238/37/80 +f 242/26/81 255/8/81 236/6/81 +f 233/41/82 255/91/82 230/27/82 +f 235/93/83 245/99/83 239/92/83 +f 244/75/83 254/76/83 236/78/83 +f 255/91/84 254/83/84 236/95/84 +f 234/20/85 238/19/85 230/7/85 +f 243/96/86 235/85/86 241/88/86 +f 244/90/87 246/86/87 242/97/87 +f 256/63/88 248/46/88 251/35/88 +f 250/79/89 245/29/89 254/55/89 +f 263/26/90 271/6/90 262/8/90 +f 258/66/91 259/67/91 257/68/91 +f 255/7/92 245/28/92 256/19/92 +f 253/69/93 248/66/93 249/70/93 +f 256/5/94 260/72/94 252/15/94 +f 257/65/95 249/10/95 261/8/95 +f 236/53/96 262/73/96 261/74/96 +f 261/58/97 253/75/97 249/59/97 +f 260/76/97 271/77/97 250/78/97 +f 271/27/97 261/51/97 250/41/97 +f 248/20/98 252/19/98 236/7/98 +f 253/69/99 257/63/99 259/80/99 +f 264/71/100 258/68/100 260/72/100 +f 272/36/101 265/82/101 268/81/101 +f 261/84/102 280/47/102 250/83/102 +f 278/26/103 280/6/103 287/8/103 +f 278/85/104 273/86/104 274/87/104 +f 271/7/105 250/28/105 272/19/105 +f 270/82/106 265/88/106 266/81/106 +f 269/37/107 279/89/107 276/90/107 +f 274/26/108 277/8/108 267/6/108 +f 262/27/109 287/95/109 277/91/109 +f 277/77/110 270/92/110 266/93/110 +f 276/75/110 280/76/110 267/78/110 +f 277/91/111 280/83/111 267/95/111 +f 265/20/112 269/19/112 262/7/112 +f 275/96/113 266/85/113 273/88/113 +f 276/90/114 278/86/114 274/97/114 +f 286/63/115 281/46/115 283/35/115 +f 304/79/116 287/29/116 280/55/116 +f 296/6/117 293/8/117 290/65/117 +f 294/98/118 288/68/118 289/66/118 +f 277/7/119 287/28/119 286/19/119 +f 283/98/120 282/70/120 285/69/120 +f 286/5/121 291/72/121 284/15/121 +f 288/65/122 282/10/122 292/8/122 +f 277/48/123 292/74/123 267/53/123 +f 282/59/124 293/94/124 285/75/124 +f 304/78/124 295/99/124 296/77/124 +f 296/27/124 292/51/124 304/41/124 +f 281/20/125 284/19/125 267/7/125 +f 290/80/126 282/70/126 288/63/126 +f 291/72/127 294/67/127 289/68/127 +f 303/36/128 297/82/128 300/81/128 +f 299/30/129 304/83/129 292/84/129 +f 309/26/130 310/27/130 316/6/130 +f 306/87/131 307/97/131 305/86/131 +f 303/19/132 300/20/132 304/28/132 +f 300/96/133 298/81/133 302/82/133 +f 303/4/134 308/90/134 301/37/134 +f 306/26/135 317/8/135 299/6/135 +f 296/41/136 317/91/136 293/27/136 +f 317/77/137 302/92/137 298/93/137 +f 308/75/137 316/76/137 299/78/137 +f 317/91/138 316/83/138 299/95/138 +f 292/28/139 293/7/139 297/20/139 +f 307/96/140 298/85/140 305/88/140 +f 308/90/141 309/86/141 306/97/141 +f 313/35/142 314/80/142 311/46/142 +f 335/79/143 319/29/143 316/55/143 +f 333/6/140 332/8/140 322/65/140 +f 325/98/144 320/68/144 321/66/144 +f 317/7/145 319/28/145 318/19/145 +f 313/98/146 312/70/146 315/69/146 +f 318/5/147 323/72/147 314/15/147 +f 320/65/141 312/10/141 324/8/141 +f 317/48/148 324/74/148 299/53/148 +f 312/59/149 332/94/149 315/75/149 +f 335/78/149 326/99/149 333/77/149 +f 333/27/149 324/51/149 335/41/149 +f 311/20/150 314/19/150 299/7/150 +f 315/69/151 320/63/151 322/80/151 +f 326/71/152 321/68/152 323/72/152 +f 334/36/153 327/82/153 329/81/153 +f 350/30/140 335/83/140 324/84/140 +f 342/26/154 343/27/154 349/6/154 +f 337/87/155 338/97/155 336/86/155 +f 334/19/156 329/20/156 335/28/156 +f 331/82/140 327/88/140 328/81/140 +f 330/37/141 343/89/141 339/90/141 +f 337/26/157 340/8/157 350/6/157 +f 333/41/141 340/91/141 332/27/141 +f 340/77/158 331/92/158 328/93/158 +f 339/75/158 349/76/158 350/78/158 +f 340/91/159 349/83/159 350/95/159 +f 324/28/160 332/7/160 327/20/160 +f 331/87/161 336/88/161 338/96/161 +f 343/89/162 337/97/162 339/90/162 +f 351/63/163 344/46/163 346/35/163 +f 368/79/164 341/29/164 349/55/164 +f 358/6/165 366/8/165 354/65/165 +f 356/98/166 352/68/166 353/66/166 +f 351/19/167 346/20/167 341/28/167 +f 346/98/168 345/70/168 348/69/168 +f 351/5/169 355/72/169 347/15/169 +f 352/65/170 345/10/170 365/8/170 +f 340/48/171 365/74/171 350/53/171 +f 345/59/172 366/94/172 348/75/172 +f 368/78/172 357/99/172 358/77/172 +f 358/27/172 365/51/172 368/41/172 +f 349/28/173 350/7/173 344/20/173 +f 348/69/174 352/63/174 354/80/174 +f 357/71/175 353/68/175 355/72/175 +f 367/36/176 359/82/176 362/81/176 +f 365/84/177 381/47/177 368/83/177 +f 373/26/178 374/27/178 381/6/178 +f 373/85/179 369/86/179 370/87/179 +f 367/19/180 362/20/180 368/28/180 +f 364/82/181 359/88/181 360/81/181 +f 363/37/182 374/89/182 372/90/182 +f 382/8/183 361/6/183 369/65/183 +f 366/27/184 384/95/184 382/91/184 +f 382/77/185 364/92/185 360/93/185 +f 372/75/185 381/76/185 361/78/185 +f 382/91/186 381/83/186 361/95/186 +f 365/28/187 366/7/187 359/20/187 +f 371/96/188 360/85/188 369/88/188 +f 372/90/189 373/86/189 370/97/189 +f 383/63/190 375/46/190 378/35/190 +f 377/79/191 384/29/191 381/55/191 +f 398/6/192 389/8/192 387/65/192 +f 386/66/193 387/67/193 385/68/193 +f 383/19/194 378/20/194 384/28/194 +f 378/98/195 376/70/195 380/69/195 +f 383/5/196 388/72/196 379/15/196 +f 377/6/197 385/65/197 397/8/197 +f 382/48/198 397/74/198 361/53/198 +f 397/58/199 380/75/199 376/59/199 +f 388/76/199 398/77/199 377/78/199 +f 377/41/199 389/52/199 397/51/199 +f 381/28/200 361/7/200 375/20/200 +f 387/80/201 376/70/201 385/63/201 +f 388/72/202 390/67/202 386/68/202 +f 399/36/203 392/82/203 394/81/203 +f 414/30/204 377/83/204 397/84/204 +f 405/26/205 406/27/205 413/6/205 +f 401/87/206 402/97/206 400/86/206 +f 399/19/207 394/20/207 377/28/207 +f 394/96/208 393/81/208 396/82/208 +f 399/4/209 403/90/209 395/37/209 +f 415/8/210 414/6/210 401/26/210 +f 398/41/211 415/91/211 389/27/211 +f 393/93/212 404/99/212 396/92/212 +f 403/75/212 413/76/212 414/78/212 +f 415/91/213 413/83/213 414/95/213 +f 397/28/214 389/7/214 392/20/214 +f 396/87/215 400/88/215 402/96/215 +f 406/89/216 401/97/216 403/90/216 +f 416/63/217 407/46/217 410/35/217 +f 413/55/218 423/64/218 404/29/218 +f 421/26/219 422/27/219 423/6/219 +f 418/66/220 419/67/220 417/68/220 +f 415/7/221 404/28/221 416/19/221 +f 412/69/222 407/66/222 408/70/222 +f 411/15/223 422/71/223 420/72/223 +f 418/26/224 429/8/224 409/6/224 +f 414/53/225 430/73/225 429/74/225 +f 408/59/226 430/94/226 412/75/226 +f 409/78/226 422/99/226 423/77/226 +f 409/41/226 430/52/226 429/51/226 +f 407/20/227 411/19/227 414/7/227 +f 412/69/228 417/63/228 419/80/228 +f 422/71/229 418/68/229 420/72/229 +f 431/36/230 424/82/230 426/81/230 +f 444/30/231 409/83/231 429/84/231 +f 436/26/232 443/6/232 447/8/232 +f 433/87/233 434/97/233 432/86/233 +f 423/7/234 409/28/234 431/19/234 +f 426/96/235 425/81/235 428/82/235 +f 431/4/236 435/90/236 427/37/236 +f 445/8/237 444/6/237 433/26/237 +f 423/41/238 445/91/238 430/27/238 +f 425/93/239 447/99/239 428/92/239 +f 444/78/239 437/94/239 443/76/239 +f 424/20/240 427/19/240 430/7/240 +f 428/87/241 432/88/241 434/96/241 +f 437/89/242 433/97/242 435/90/242 +f 446/63/243 438/46/243 440/35/243 +f 443/55/244 455/64/244 447/29/244 +f 453/26/245 455/6/245 462/8/245 +f 449/66/246 450/67/246 448/68/246 +f 445/7/247 447/28/247 446/19/247 +f 442/69/248 438/66/248 439/70/248 +f 441/15/249 454/71/249 451/72/249 +f 449/26/250 452/8/250 464/6/250 +f 444/53/251 462/73/251 452/74/251 +f 439/59/252 462/94/252 442/75/252 +f 451/76/252 455/77/252 464/78/252 +f 464/41/252 462/52/252 452/51/252 +f 438/20/253 441/19/253 444/7/253 +f 443/73/239 445/64/239 444/79/239 +f 442/69/254 448/63/254 450/80/254 +f 454/71/255 449/68/255 451/72/255 +f 463/36/256 456/82/256 459/81/256 +f 458/30/257 464/83/257 452/84/257 +f 469/26/258 471/6/258 479/8/258 +f 469/85/259 465/86/259 466/87/259 +f 455/7/260 464/28/260 463/19/260 +f 461/82/261 456/88/261 457/81/261 +f 460/37/262 470/89/262 468/90/262 +f 466/26/263 477/8/263 458/6/263 +f 455/41/264 477/91/264 462/27/264 +f 477/77/265 461/92/265 457/93/265 +f 468/75/265 471/76/265 458/78/265 +f 458/95/266 479/84/266 471/83/266 +f 456/20/267 460/19/267 462/7/267 +f 467/96/268 457/85/268 465/88/268 +f 468/90/269 469/86/269 466/97/269 +f 478/63/270 472/46/270 474/35/270 +f 496/79/271 479/29/271 471/55/271 +f 485/26/272 486/27/272 487/6/272 +f 485/98/273 480/68/273 481/66/273 +f 477/7/274 479/28/274 478/19/274 +f 474/98/275 473/70/275 476/69/275 +f 478/5/276 483/72/276 475/15/276 +f 480/65/277 473/10/277 494/8/277 +f 477/48/278 494/74/278 458/53/278 +f 494/58/279 476/75/279 473/59/279 +f 483/76/279 487/77/279 496/78/279 +f 487/27/279 494/51/279 496/41/279 +f 472/20/280 475/19/280 458/7/280 +f 476/69/281 480/63/281 482/80/281 +f 486/71/282 481/68/282 483/72/282 +f 495/36/283 488/82/283 491/81/283 +f 494/84/284 510/47/284 496/83/284 +f 502/26/285 503/27/285 510/6/285 +f 502/85/286 497/86/286 498/87/286 +f 487/7/287 496/28/287 495/19/287 +f 493/82/288 488/88/288 489/81/288 +f 492/37/289 503/89/289 500/90/289 +f 490/6/290 497/65/290 501/8/290 +f 484/27/291 512/95/291 501/91/291 +f 489/93/292 512/99/292 493/92/292 +f 500/75/292 510/76/292 490/78/292 +f 490/95/293 512/84/293 510/83/293 +f 488/20/294 492/19/294 484/7/294 +f 499/96/295 489/85/295 497/88/295 +f 500/90/296 502/86/296 498/97/296 +f 507/35/297 508/80/297 504/46/297 +f 506/79/298 512/29/298 510/55/298 +f 519/6/299 526/8/299 515/65/299 +f 517/98/300 513/68/300 514/66/300 +f 511/19/301 507/20/301 512/28/301 +f 507/98/302 505/70/302 509/69/302 +f 511/5/303 516/72/303 508/15/303 +f 506/6/304 513/65/304 525/8/304 +f 501/48/305 525/74/305 490/53/305 +f 525/58/306 509/75/306 505/59/306 +f 516/76/306 519/77/306 506/78/306 +f 506/41/307 526/52/307 525/51/307 +f 510/28/308 490/7/308 504/20/308 +f 509/69/309 513/63/309 515/80/309 +f 518/71/310 514/68/310 516/72/310 +f 522/81/311 523/11/311 520/82/311 +f 525/84/312 541/47/312 506/83/312 +f 541/6/313 532/8/313 530/65/313 +f 529/87/314 530/97/314 528/86/314 +f 527/19/315 522/20/315 506/28/315 +f 524/82/316 520/88/316 521/81/316 +f 523/37/317 534/89/317 531/90/317 +f 528/65/318 521/10/318 543/8/318 +f 526/27/319 532/95/319 543/91/319 +f 543/77/320 524/92/320 521/93/320 +f 531/75/320 541/76/320 542/78/320 +f 543/91/321 541/83/321 542/95/321 +f 525/28/322 526/7/322 520/20/322 +f 524/87/323 528/88/323 530/96/323 +f 534/89/324 529/97/324 531/90/324 +f 544/63/325 535/46/325 538/35/325 +f 541/55/326 559/64/326 532/29/326 +f 559/6/327 558/8/327 547/65/327 +f 550/98/328 545/68/328 546/66/328 +f 544/19/329 538/20/329 532/28/329 +f 540/69/330 535/66/330 536/70/330 +f 539/15/331 551/71/331 548/72/331 +f 537/6/332 545/65/332 549/8/332 +f 542/53/333 558/73/333 549/74/333 +f 549/58/334 540/75/334 536/59/334 +f 537/78/335 551/99/335 559/77/335 +f 559/27/334 549/51/334 537/41/334 +f 541/28/336 542/7/336 535/20/336 +f 547/80/337 536/70/337 545/63/337 +f 548/72/338 550/67/338 546/68/338 +f 555/81/339 556/11/339 552/82/339 +f 554/30/340 537/83/340 549/84/340 +f 566/26/341 567/27/341 568/6/341 +f 562/87/342 563/97/342 561/86/342 +f 560/19/343 555/20/343 537/28/343 +f 555/96/344 553/81/344 557/82/344 +f 560/4/345 564/90/345 556/37/345 +f 565/8/346 554/6/346 562/26/346 +f 559/41/347 565/91/347 558/27/347 +f 553/93/348 576/99/348 557/92/348 +f 564/75/348 568/76/348 554/78/348 +f 554/95/349 576/84/349 568/83/349 +f 549/28/350 558/7/350 552/20/350 +f 557/87/351 561/88/351 563/96/351 +f 567/89/352 562/97/352 564/90/352 +f 575/63/353 569/46/353 572/35/353 +f 568/55/354 584/64/354 576/29/354 +f 582/26/355 583/27/355 584/6/355 +f 578/66/356 579/67/356 577/68/356 +f 565/7/357 576/28/357 575/19/357 +f 574/69/358 569/66/358 570/70/358 +f 573/15/359 583/71/359 580/72/359 +f 578/26/360 581/8/360 571/6/360 +f 554/53/361 590/73/361 581/74/361 +f 570/59/362 590/94/362 574/75/362 +f 571/78/362 583/99/362 584/77/362 +f 584/27/363 581/51/363 571/41/363 +f 569/20/364 573/19/364 554/7/364 +f 579/80/365 570/70/365 577/63/365 +f 580/72/366 582/67/366 578/68/366 +f 591/36/367 585/82/367 587/81/367 +f 581/84/368 599/47/368 571/83/368 +f 597/26/369 599/6/369 596/8/369 +f 597/85/370 592/86/370 593/87/370 +f 584/7/371 571/28/371 591/19/371 +f 589/82/372 585/88/372 586/81/372 +f 588/37/373 598/89/373 595/90/373 +f 607/8/374 606/6/374 593/26/374 +f 590/27/375 596/95/375 607/91/375 +f 586/93/376 596/99/376 589/92/376 +f 595/75/376 599/76/376 606/78/376 +f 607/91/377 599/83/377 606/95/377 +f 585/20/378 588/19/378 590/7/378 +f 589/87/379 592/88/379 594/96/379 +f 598/89/380 593/97/380 595/90/380 +f 608/63/381 600/46/381 603/35/381 +f 599/55/382 622/64/382 596/29/382 +f 613/26/383 614/27/383 622/6/383 +f 613/98/384 609/68/384 610/66/384 +f 607/7/385 596/28/385 608/19/385 +f 605/69/386 600/66/386 601/70/386 +f 604/15/387 614/71/387 612/72/387 +f 610/26/388 620/8/388 602/6/388 +f 606/53/389 621/73/389 620/74/389 +f 601/59/390 621/94/390 605/75/390 +f 602/78/391 614/99/391 622/77/391 +f 602/41/391 621/52/391 620/51/391 +f 600/20/392 604/19/392 606/7/392 +f 605/69/393 609/63/393 611/80/393 +f 614/71/394 610/68/394 612/72/394 +f 623/36/395 615/82/395 617/81/395 +f 637/30/396 602/83/396 620/84/396 +f 629/26/397 630/27/397 631/6/397 +f 629/85/398 624/86/398 625/87/398 +f 622/7/399 602/28/399 623/19/399 +f 617/96/400 616/81/400 619/82/400 +f 623/4/401 627/90/401 618/37/401 +f 625/26/402 638/8/402 637/6/402 +f 622/41/403 638/91/403 621/27/403 +f 638/77/404 619/92/404 616/93/404 +f 627/75/404 631/76/404 637/78/404 +f 638/91/405 631/83/405 637/95/405 +f 615/20/406 618/19/406 621/7/406 +f 626/96/407 616/85/407 624/88/407 +f 627/90/408 629/86/408 625/97/408 +f 639/63/409 632/46/409 634/35/409 +f 655/79/410 628/29/410 631/55/410 +f 647/6/411 644/8/411 642/65/411 +f 645/98/412 640/68/412 641/66/412 +f 638/7/413 628/28/413 639/19/413 +f 634/98/414 633/70/414 636/69/414 +f 639/5/415 643/72/415 635/15/415 +f 640/65/416 633/10/416 653/8/416 +f 638/48/417 653/74/417 637/53/417 +f 633/59/418 644/94/418 636/75/418 +f 643/76/418 647/77/418 655/78/418 +f 655/41/418 644/52/418 653/51/418 +f 632/20/419 635/19/419 637/7/419 +f 636/69/420 640/63/420 642/80/420 +f 646/71/421 641/68/421 643/72/421 +f 650/81/422 651/11/422 648/82/422 +f 669/30/423 655/83/423 653/84/423 +f 661/26/424 662/27/424 668/6/424 +f 657/87/425 658/97/425 656/86/425 +f 647/7/426 655/28/426 654/19/426 +f 652/82/427 648/88/427 649/81/427 +f 651/37/428 662/89/428 659/90/428 +f 656/65/429 649/10/429 660/8/429 +f 647/41/430 660/91/430 644/27/430 +f 649/93/431 671/99/431 652/92/431 +f 659/75/431 668/76/431 669/78/431 +f 669/95/432 671/84/432 668/83/432 +f 648/20/433 651/19/433 644/7/433 +f 658/96/434 649/85/434 656/88/434 +f 659/90/435 661/86/435 657/97/435 +f 670/63/436 663/46/436 665/35/436 +f 687/79/437 671/29/437 668/55/437 +f 685/6/438 677/8/438 674/65/438 +f 678/98/439 672/68/439 673/66/439 +f 660/7/440 671/28/440 670/19/440 +f 667/69/441 663/66/441 664/70/441 +f 666/15/442 679/71/442 675/72/442 +f 687/6/443 672/65/443 676/8/443 +f 660/48/444 676/74/444 669/53/444 +f 664/59/445 677/94/445 667/75/445 +f 687/78/445 679/99/445 685/77/445 +f 687/41/445 677/52/445 676/51/445 +f 663/20/446 666/19/446 669/7/446 +f 667/69/447 672/63/447 674/80/447 +f 679/71/448 673/68/448 675/72/448 +f 686/36/449 680/82/449 682/81/449 +f 676/84/450 699/47/450 687/83/450 +f 699/6/451 703/8/451 690/65/451 +f 692/85/452 688/86/452 689/87/452 +f 685/7/453 687/28/453 686/19/453 +f 684/82/454 680/88/454 681/81/454 +f 683/37/455 693/89/455 691/90/455 +f 688/65/456 681/10/456 701/8/456 +f 677/27/457 703/95/457 701/91/457 +f 681/93/458 703/99/458 684/92/458 +f 700/78/458 693/94/458 699/76/458 +f 680/20/459 683/19/459 677/7/459 +f 684/87/460 688/88/460 690/96/460 +f 693/89/461 689/97/461 691/90/461 +f 696/35/462 697/80/462 694/46/462 +f 719/79/463 703/29/463 699/55/463 +f 717/6/464 709/8/464 706/65/464 +f 705/66/465 706/67/465 704/68/465 +f 702/19/466 696/20/466 703/28/466 +f 696/98/467 695/70/467 698/69/467 +f 702/5/468 707/72/468 697/15/468 +f 719/6/469 704/65/469 708/8/469 +f 701/48/470 708/74/470 700/53/470 +f 708/58/471 698/75/471 695/59/471 +f 707/76/472 717/77/472 719/78/472 +f 719/41/472 709/52/472 708/51/472 +f 699/28/473 700/7/473 694/20/473 +f 699/73/458 701/64/458 700/79/458 +f 698/69/474 704/63/474 706/80/474 +f 711/71/475 705/68/475 707/72/475 +f 714/81/476 715/11/476 712/82/476 +f 733/30/477 719/83/477 708/84/477 +f 724/26/478 725/27/478 726/6/478 +f 721/87/479 722/97/479 720/86/479 +f 718/19/480 714/20/480 719/28/480 +f 714/96/481 713/81/481 716/82/481 +f 718/4/482 723/90/482 715/37/482 +f 734/8/483 733/6/483 720/65/483 +f 717/41/484 734/91/484 709/27/484 +f 734/77/485 716/92/485 713/93/485 +f 733/78/485 725/94/485 726/76/485 +f 733/95/486 736/84/486 726/83/486 +f 708/28/487 709/7/487 712/20/487 +f 716/87/488 720/88/488 722/96/488 +f 725/89/489 721/97/489 723/90/489 +f 730/35/490 731/80/490 727/46/490 +f 726/55/491 750/64/491 736/29/491 +f 743/26/492 744/27/492 750/6/492 +f 743/98/493 737/68/493 738/66/493 +f 735/19/494 730/20/494 736/28/494 +f 732/69/495 727/66/495 728/70/495 +f 731/15/496 744/71/496 740/72/496 +f 738/26/497 741/8/497 729/6/497 +f 733/53/498 742/73/498 741/74/498 +f 741/58/499 732/75/499 728/59/499 +f 740/76/500 750/77/500 729/78/500 +f 729/41/501 742/52/501 741/51/501 +f 726/28/502 733/7/502 727/20/502 +f 739/80/503 728/70/503 737/63/503 +f 740/72/504 743/67/504 738/68/504 +f 747/81/505 748/11/505 745/82/505 +f 741/84/506 764/47/506 729/83/506 +f 756/26/507 757/27/507 764/6/507 +f 753/87/508 754/97/508 752/86/508 +f 750/7/509 729/28/509 751/19/509 +f 749/82/510 745/88/510 746/81/510 +f 748/37/511 757/89/511 755/90/511 +f 753/26/512 766/8/512 765/6/512 +f 742/27/513 768/95/513 766/91/513 +f 746/93/514 768/99/514 749/92/514 +f 765/78/514 757/94/514 764/76/514 +f 745/20/515 748/19/515 742/7/515 +f 754/96/516 746/85/516 752/88/516 +f 755/90/517 756/86/517 753/97/517 +f 767/63/518 758/46/518 761/35/518 +f 760/79/519 768/29/519 764/55/519 +f 774/26/520 775/27/520 783/6/520 +f 770/66/521 771/67/521 769/68/521 +f 766/7/522 768/28/522 767/19/522 +f 761/98/523 759/70/523 763/69/523 +f 767/5/524 772/72/524 762/15/524 +f 770/26/525 773/8/525 760/6/525 +f 766/48/526 773/74/526 765/53/526 +f 759/59/527 782/94/527 763/75/527 +f 772/76/527 783/77/527 760/78/527 +f 760/41/528 782/52/528 773/51/528 +f 764/28/529 765/7/529 758/20/529 +f 768/74/514 765/79/514 764/73/514 +f 771/80/530 759/70/530 769/63/530 +f 772/72/531 774/67/531 770/68/531 +f 784/36/532 776/82/532 779/81/532 +f 778/30/533 760/83/533 773/84/533 +f 789/26/534 796/6/534 799/8/534 +f 789/85/535 785/86/535 786/87/535 +f 783/7/536 760/28/536 784/19/536 +f 779/96/537 777/81/537 781/82/537 +f 784/4/538 788/90/538 780/37/538 +f 785/65/539 777/10/539 797/8/539 +f 783/41/540 797/91/540 782/27/540 +f 777/93/541 799/99/541 781/92/541 +f 778/78/541 790/94/541 796/76/541 +f 797/91/542 796/83/542 778/95/542 +f 776/20/543 780/19/543 782/7/543 +f 781/87/544 785/88/544 787/96/544 +f 790/89/545 786/97/545 788/90/545 +f 798/63/546 791/46/546 793/35/546 +f 815/79/547 799/29/547 796/55/547 +f 813/6/548 812/8/548 804/26/548 +f 801/66/549 802/67/549 800/68/549 +f 797/7/550 799/28/550 798/19/550 +f 795/69/551 791/66/551 792/70/551 +f 794/15/552 805/71/552 803/72/552 +f 811/8/553 815/6/553 801/26/553 +f 797/48/554 811/74/554 778/53/554 +f 792/59/555 812/94/555 795/75/555 +f 815/78/555 805/99/555 813/77/555 +f 791/20/556 794/19/556 778/7/556 +f 795/69/557 800/63/557 802/80/557 +f 805/71/558 801/68/558 803/72/558 +f 808/81/559 809/11/559 806/82/559 +f 811/84/560 823/47/560 815/83/560 +f 823/6/561 832/8/561 818/65/561 +f 821/85/562 816/86/562 817/87/562 +f 813/7/563 815/28/563 814/19/563 +f 810/82/564 806/88/564 807/81/564 +f 809/37/565 822/89/565 819/90/565 +f 820/8/566 830/6/566 816/65/566 +f 812/27/567 832/95/567 820/91/567 +f 820/77/568 810/92/568 807/93/568 +f 830/78/568 822/94/568 823/76/568 +f 830/95/569 832/84/569 823/83/569 +f 806/20/570 809/19/570 812/7/570 +f 815/33/555 812/59/555 811/29/555 +f 810/87/571 816/88/571 818/96/571 +f 822/89/572 817/97/572 819/90/572 +f 831/63/573 824/46/573 827/35/573 +f 823/55/574 839/64/574 832/29/574 +f 837/26/575 838/27/575 839/6/575 +f 837/98/576 833/68/576 834/66/576 +f 820/7/577 832/28/577 831/19/577 +f 829/69/578 824/66/578 825/70/578 +f 828/15/579 838/71/579 836/72/579 +f 834/26/580 846/8/580 826/6/580 +f 830/53/581 847/73/581 846/74/581 +f 846/58/582 829/75/582 825/59/582 +f 826/78/582 838/99/582 839/77/582 +f 839/27/582 846/51/582 826/41/582 +f 824/20/583 828/19/583 830/7/583 +f 835/80/584 825/70/584 833/63/584 +f 836/72/585 837/67/585 834/68/585 +f 848/36/586 840/82/586 843/81/586 +f 846/84/587 860/47/587 826/83/587 +f 853/26/588 854/27/588 860/6/588 +f 850/87/589 851/97/589 849/86/589 +f 839/7/590 826/28/590 848/19/590 +f 843/96/591 841/81/591 845/82/591 +f 844/37/592 854/89/592 852/90/592 +f 850/26/593 861/8/593 842/6/593 +f 847/27/594 863/95/594 861/91/594 +f 861/77/595 845/92/595 841/93/595 +f 852/75/595 860/76/595 842/78/595 +f 861/91/596 860/83/596 842/95/596 +f 840/20/597 844/19/597 847/7/597 +f 851/96/598 841/85/598 849/88/598 +f 852/90/599 853/86/599 850/97/599 +f 857/35/600 858/80/600 855/46/600 +f 880/79/601 863/29/601 860/55/601 +f 869/26/602 870/27/602 878/6/602 +f 865/66/603 866/67/603 864/68/603 +f 861/7/604 863/28/604 862/19/604 +f 857/98/605 856/70/605 859/69/605 +f 862/5/606 867/72/606 858/15/606 +f 880/6/607 864/65/607 868/8/607 +f 861/48/608 868/74/608 842/53/608 +f 868/58/609 859/75/609 856/59/609 +f 880/78/609 870/99/609 878/77/609 +f 880/41/609 877/52/609 868/51/609 +f 855/20/610 858/19/610 842/7/610 +f 866/80/611 856/70/611 864/63/611 +f 867/72/612 869/67/612 865/68/612 +f 874/81/613 875/11/613 871/82/613 +f 873/30/614 880/83/614 868/84/614 +f 889/6/615 886/8/615 883/65/615 +f 882/87/603 883/97/603 881/86/603 +f 878/7/616 880/28/616 879/19/616 +f 874/96/617 872/81/617 876/82/617 +f 879/4/618 884/90/618 875/37/618 +f 873/6/619 881/65/619 885/8/619 +f 878/41/620 885/91/620 877/27/620 +f 872/93/603 886/99/603 876/92/603 +f 884/75/603 889/76/603 873/78/603 +f 885/91/621 889/83/621 873/95/621 +f 871/20/622 875/19/622 877/7/622 +f 876/87/617 881/88/617 883/96/617 +f 888/89/623 882/97/623 884/90/623 +f 890/46/624 898/63/624 892/35/624 +f 895/55/625 914/64/625 916/79/625 +f 914/6/626 906/27/626 905/26/626 +f 900/68/627 905/98/627 901/66/627 +f 898/19/626 897/7/626 892/20/626 +f 894/69/625 890/66/625 892/98/625 +f 893/15/628 906/71/628 898/5/628 +f 901/26/629 903/27/629 916/6/629 +f 896/53/628 904/73/628 897/48/628 +f 891/59/630 904/94/630 913/58/630 +f 914/77/630 903/76/630 916/78/630 +f 913/51/630 914/27/630 916/41/630 +f 896/7/629 895/28/629 893/19/629 +f 896/79/630 899/74/630 895/73/630 +f 902/80/631 891/70/631 894/69/631 +f 903/72/632 905/67/632 906/71/632 +f 910/81/624 911/11/624 915/36/624 +f 916/83/633 909/30/633 913/84/633 +f 928/6/634 922/27/634 921/26/634 +f 918/87/635 919/97/635 921/85/635 +f 915/19/628 914/7/628 910/20/628 +f 912/82/636 907/88/636 910/96/636 +f 911/37/637 922/89/637 915/4/637 +f 918/26/638 920/27/638 909/6/638 +f 929/91/639 914/41/639 904/27/639 +f 908/93/640 931/99/640 929/77/640 +f 909/78/640 922/94/640 920/75/640 +f 909/95/641 931/84/641 929/91/641 +f 904/7/625 913/28/625 911/19/625 +f 917/88/642 912/87/642 919/96/642 +f 918/97/643 922/89/643 920/90/643 +f 925/35/644 926/80/644 930/63/644 +f 928/55/645 938/64/645 947/79/645 +f 938/6/646 937/27/646 936/26/646 +f 932/68/647 936/98/647 933/66/647 +f 931/28/648 929/7/648 925/20/648 +f 927/69/649 923/66/649 925/98/649 +f 926/15/650 937/71/650 930/5/650 +f 933/26/651 935/27/651 947/6/651 +f 909/53/652 945/73/652 929/48/652 +f 924/59/653 945/94/653 944/58/653 +f 947/78/653 937/99/653 935/76/653 +f 947/41/653 945/52/653 938/27/653 +f 928/28/654 926/19/654 923/20/654 +f 932/63/655 927/69/655 934/80/655 +f 933/68/656 937/71/656 935/72/656 +f 939/82/657 946/36/657 941/81/657 +f 944/84/658 956/47/658 963/30/658 +f 956/6/659 955/27/659 954/26/659 +f 949/87/660 950/97/660 954/85/660 +f 946/19/661 938/7/661 941/20/661 +f 943/82/662 939/88/662 941/96/662 +f 942/37/663 955/89/663 946/4/663 +f 949/26/664 951/27/664 963/6/664 +f 945/27/665 953/95/665 938/41/665 +f 943/92/666 952/77/666 940/93/666 +f 963/78/666 955/94/666 951/75/666 +f 956/83/667 952/91/667 963/95/667 +f 945/7/668 944/28/668 942/19/668 +f 948/88/669 943/87/669 950/96/669 +f 949/97/670 955/89/670 951/90/670 +f 957/46/671 964/63/671 960/35/671 +f 956/55/672 971/64/672 959/79/672 +f 971/6/673 970/27/673 969/26/673 +f 965/68/674 969/98/674 966/66/674 +f 953/28/675 952/7/675 960/20/675 +f 962/69/676 957/66/676 960/98/676 +f 961/15/677 970/71/677 964/5/677 +f 966/26/678 968/27/678 959/6/678 +f 963/53/679 979/73/679 952/48/679 +f 962/75/680 978/58/680 958/59/680 +f 971/77/680 968/76/680 959/78/680 +f 978/51/680 971/27/680 959/41/680 +f 956/28/681 961/19/681 957/20/681 +f 967/80/682 958/70/682 962/69/682 +f 968/72/683 969/67/683 970/71/683 +f 975/81/684 976/11/684 980/36/684 +f 959/83/685 974/30/685 978/84/685 +f 989/6/686 988/27/686 987/26/686 +f 982/87/687 983/97/687 987/85/687 +f 980/19/688 971/7/688 975/20/688 +f 973/81/689 975/96/689 977/82/689 +f 984/90/690 980/4/690 976/37/690 +f 982/26/691 984/27/691 974/6/691 +f 985/91/692 971/41/692 979/27/692 +f 973/93/693 986/99/693 985/77/693 +f 974/78/693 988/94/693 984/75/693 +f 974/95/694 986/84/694 985/91/694 +f 979/7/695 978/28/695 976/19/695 +f 983/96/696 973/85/696 977/87/696 +f 984/90/697 987/86/697 988/89/697 +f 990/46/698 995/63/698 992/35/698 +f 986/29/699 1011/79/699 989/55/699 +f 1003/6/700 1002/27/700 1001/26/700 +f 996/68/701 1001/98/701 997/66/701 +f 995/19/702 985/7/702 992/20/702 +f 994/69/703 990/66/703 992/98/703 +f 999/72/704 995/5/704 993/15/704 +f 996/65/705 997/26/705 1009/8/705 +f 974/53/706 1000/73/706 985/48/706 +f 994/75/707 1009/58/707 991/59/707 +f 1003/77/707 999/76/707 1011/78/707 +f 1011/41/707 1000/52/707 1003/27/707 +f 974/7/708 989/28/708 993/19/708 +f 996/63/709 994/69/709 998/80/709 +f 997/68/710 1002/71/710 999/72/710 +f 1004/82/711 1010/36/711 1006/81/711 +f 1009/84/712 1018/47/712 1025/30/712 +f 1018/6/713 1017/27/713 1016/26/713 +f 1012/86/714 1016/85/714 1013/87/714 +f 1010/19/715 1003/7/715 1006/20/715 +f 1008/82/716 1004/88/716 1006/96/716 +f 1007/37/717 1017/89/717 1010/4/717 +f 1025/6/718 1026/8/718 1013/26/718 +f 1000/27/719 1028/95/719 1003/41/719 +f 1005/93/720 1028/99/720 1026/77/720 +f 1025/78/720 1017/94/720 1015/75/720 +f 1025/95/721 1028/84/721 1026/91/721 +f 1000/7/722 1009/28/722 1007/19/722 +f 1014/96/723 1005/85/723 1008/87/723 +f 1015/90/724 1016/86/724 1017/89/724 +f 1022/35/725 1023/80/725 1027/63/725 +f 1028/29/726 1021/79/726 1018/55/726 +f 1042/6/727 1036/27/727 1035/26/727 +f 1029/68/728 1035/98/728 1030/66/728 +f 1027/19/729 1026/7/729 1022/20/729 +f 1020/70/730 1022/98/730 1024/69/730 +f 1032/72/731 1027/5/731 1023/15/731 +f 1030/26/732 1032/27/732 1021/6/732 +f 1033/74/733 1026/48/733 1025/53/733 +f 1024/75/734 1033/58/734 1020/59/734 +f 1042/77/734 1032/76/734 1021/78/734 +f 1021/41/734 1034/52/734 1042/27/734 +f 1025/7/735 1018/28/735 1023/19/735 +f 1031/80/736 1020/70/736 1024/69/736 +f 1032/72/737 1035/67/737 1036/71/737 +f 1039/81/738 1040/11/738 1043/36/738 +f 1021/83/739 1057/30/739 1033/84/739 +f 1060/8/740 1056/6/740 1048/26/740 +f 1045/87/741 1046/97/741 1048/85/741 +f 1021/28/742 1042/7/742 1039/20/742 +f 1038/81/743 1039/96/743 1041/82/743 +f 1047/90/744 1043/4/744 1040/37/744 +f 1045/26/745 1047/27/745 1057/6/745 +f 1058/91/746 1042/41/746 1034/27/746 +f 1038/93/747 1060/99/747 1058/77/747 +f 1056/76/747 1047/75/747 1057/78/747 +f 1033/28/748 1040/19/748 1037/20/748 +f 1046/96/749 1038/85/749 1041/87/749 +f 1047/90/750 1048/86/750 1049/89/750 +f 1050/46/751 1059/63/751 1053/35/751 +f 1060/29/752 1052/79/752 1056/55/752 +f 1069/6/753 1068/27/753 1067/26/753 +f 1061/68/754 1067/98/754 1062/66/754 +f 1059/19/755 1058/7/755 1053/20/755 +f 1051/70/756 1053/98/756 1055/69/756 +f 1064/72/757 1059/5/757 1054/15/757 +f 1062/26/758 1064/27/758 1052/6/758 +f 1065/74/759 1058/48/759 1057/53/759 +f 1051/59/760 1066/94/760 1065/58/760 +f 1069/77/760 1064/76/760 1052/78/760 +f 1052/41/760 1066/52/760 1069/27/760 +f 1057/7/761 1056/28/761 1054/19/761 +f 1057/79/747 1060/74/747 1056/73/747 +f 1061/63/762 1055/69/762 1063/80/762 +f 1062/68/763 1068/71/763 1064/72/763 +f 1070/82/764 1076/36/764 1073/81/764 +f 1052/83/765 1072/30/765 1065/84/765 +f 1085/6/766 1084/27/766 1083/26/766 +f 1077/86/767 1083/85/767 1078/87/767 +f 1052/28/768 1069/7/768 1073/20/768 +f 1075/82/753 1070/88/753 1073/96/753 +f 1074/37/758 1084/89/758 1076/4/758 +f 1078/26/769 1080/27/769 1072/6/769 +f 1081/91/770 1069/41/770 1066/27/770 +f 1071/93/771 1082/99/771 1081/77/771 +f 1072/78/771 1084/94/771 1080/75/771 +f 1072/95/772 1082/84/772 1081/91/772 +f 1065/28/773 1074/19/773 1070/20/773 +f 1077/88/774 1075/87/774 1079/96/774 +f 1078/97/775 1084/89/775 1080/90/775 +f 1089/35/776 1090/80/776 1092/63/776 +f 1082/29/777 1088/79/777 1085/55/777 +f 1107/6/778 1099/27/778 1098/26/778 +f 1093/68/779 1098/98/779 1094/66/779 +f 1082/28/753 1081/7/753 1089/20/753 +f 1087/70/780 1089/98/780 1091/69/780 +f 1096/72/781 1092/5/781 1090/15/781 +f 1094/26/782 1096/27/782 1088/6/782 +f 1097/74/783 1081/48/783 1072/53/783 +f 1091/75/784 1097/58/784 1087/59/784 +f 1107/77/784 1096/76/784 1088/78/784 +f 1088/41/784 1106/52/784 1107/27/784 +f 1085/28/758 1090/19/758 1086/20/758 +f 1093/63/785 1091/69/785 1095/80/785 +f 1094/68/786 1099/71/786 1096/72/786 +f 1103/81/787 1104/11/787 1108/36/787 +f 1097/84/788 1116/47/788 1102/30/788 +f 1116/6/789 1115/27/789 1114/26/789 +f 1109/86/790 1114/85/790 1110/87/790 +f 1088/28/791 1107/7/791 1103/20/791 +f 1105/82/792 1100/88/792 1103/96/792 +f 1104/37/793 1115/89/793 1108/4/793 +f 1110/26/794 1112/27/794 1102/6/794 +f 1106/27/795 1113/95/795 1107/41/795 +f 1105/92/796 1123/77/796 1101/93/796 +f 1102/78/796 1115/94/796 1112/75/796 +f 1102/95/797 1113/84/797 1123/91/797 +f 1097/28/798 1104/19/798 1100/20/798 +f 1111/96/799 1101/85/799 1105/87/799 +f 1112/90/800 1114/86/800 1115/89/800 +f 1120/35/801 1121/80/801 1124/63/801 +f 1113/29/802 1119/79/802 1116/55/802 +f 1133/6/803 1132/27/803 1131/26/803 +f 1125/68/804 1131/98/804 1126/66/804 +f 1113/28/805 1123/7/805 1120/20/805 +f 1118/70/806 1120/98/806 1122/69/806 +f 1128/72/807 1124/5/807 1121/15/807 +f 1129/8/808 1118/10/808 1125/65/808 +f 1129/74/809 1123/48/809 1102/53/809 +f 1122/75/810 1129/58/810 1118/59/810 +f 1133/77/810 1128/76/810 1119/78/810 +f 1119/41/810 1130/52/810 1133/27/810 +f 1116/28/811 1121/19/811 1117/20/811 +f 1127/80/812 1118/70/812 1122/69/812 +f 1128/72/813 1131/67/813 1132/71/813 +f 1137/81/814 1138/11/814 1140/36/814 +f 1119/83/815 1136/30/815 1129/84/815 +f 1149/6/816 1148/27/816 1147/26/816 +f 1142/87/817 1143/97/817 1147/85/817 +f 1119/28/818 1133/7/818 1137/20/818 +f 1135/81/819 1137/96/819 1139/82/819 +f 1144/90/820 1140/4/820 1138/37/820 +f 1142/26/821 1144/27/821 1136/6/821 +f 1145/91/822 1133/41/822 1130/27/822 +f 1139/92/823 1145/77/823 1135/93/823 +f 1149/76/823 1144/75/823 1136/78/823 +f 1149/83/824 1145/91/824 1136/95/824 +f 1129/28/825 1138/19/825 1134/20/825 +f 1141/88/826 1139/87/826 1143/96/826 +f 1142/97/827 1148/89/827 1144/90/827 +f 1150/46/828 1156/63/828 1153/35/828 +f 1149/55/829 1171/64/829 1152/79/829 +f 1171/6/830 1163/27/830 1162/26/830 +f 1158/66/831 1159/67/831 1162/98/831 +f 1156/19/832 1145/7/832 1153/20/832 +f 1155/69/833 1150/66/833 1153/98/833 +f 1154/15/834 1163/71/834 1156/5/834 +f 1158/26/835 1160/27/835 1152/6/835 +f 1136/53/836 1170/73/836 1145/48/836 +f 1155/75/837 1161/58/837 1151/59/837 +f 1171/77/837 1160/76/837 1152/78/837 +f 1152/41/837 1170/52/837 1171/27/837 +f 1136/7/838 1149/28/838 1154/19/838 +f 1157/63/839 1155/69/839 1159/80/839 +f 1158/68/840 1163/71/840 1160/72/840 +f 1164/82/841 1172/36/841 1167/81/841 +f 1152/83/842 1166/30/842 1161/84/842 +f 1187/8/843 1184/6/843 1177/26/843 +f 1173/86/844 1177/85/844 1174/87/844 +f 1172/19/845 1171/7/845 1167/20/845 +f 1169/82/846 1164/88/846 1167/96/846 +f 1168/37/847 1178/89/847 1172/4/847 +f 1173/65/848 1174/26/848 1185/8/848 +f 1185/91/849 1171/41/849 1170/27/849 +f 1165/93/850 1187/99/850 1185/77/850 +f 1166/78/850 1178/94/850 1176/75/850 +f 1184/83/851 1185/91/851 1166/95/851 +f 1170/7/852 1161/28/852 1168/19/852 +f 1173/88/853 1169/87/853 1175/96/853 +f 1174/97/854 1178/89/854 1176/90/854 +f 1181/35/855 1182/80/855 1186/63/855 +f 1184/55/856 1196/64/856 1204/79/856 +f 1196/6/857 1195/27/857 1194/26/857 +f 1188/68/858 1194/98/858 1189/66/858 +f 1186/19/859 1185/7/859 1181/20/859 +f 1183/69/860 1179/66/860 1181/98/860 +f 1182/15/861 1195/71/861 1186/5/861 +f 1189/26/862 1191/27/862 1204/6/862 +f 1166/53/863 1193/73/863 1185/48/863 +f 1180/59/864 1193/94/864 1192/58/864 +f 1204/78/864 1195/99/864 1191/76/864 +f 1204/41/864 1193/52/864 1196/27/864 +f 1166/7/865 1184/28/865 1182/19/865 +f 1188/63/866 1183/69/866 1190/80/866 +f 1189/68/867 1195/71/867 1191/72/867 +f 1197/82/868 1203/36/868 1200/81/868 +f 1204/83/869 1199/30/869 1192/84/869 +f 1219/6/870 1212/27/870 1211/26/870 +f 1205/86/871 1211/85/871 1206/87/871 +f 1203/19/872 1196/7/872 1200/20/872 +f 1202/82/873 1197/88/873 1200/96/873 +f 1201/37/874 1212/89/874 1203/4/874 +f 1206/26/875 1208/27/875 1199/6/875 +f 1209/91/876 1196/41/876 1193/27/876 +f 1198/93/877 1210/99/877 1209/77/877 +f 1199/78/877 1212/94/877 1208/75/877 +f 1219/83/878 1209/91/878 1199/95/878 +f 1193/7/879 1192/28/879 1201/19/879 +f 1207/96/880 1198/85/880 1202/87/880 +f 1208/90/881 1211/86/881 1212/89/881 +f 1216/35/882 1217/80/882 1220/63/882 +f 1210/29/883 1215/79/883 1219/55/883 +f 1228/6/884 1227/27/884 1226/26/884 +f 1221/68/885 1226/98/885 1222/66/885 +f 1220/19/886 1209/7/886 1216/20/886 +f 1214/70/887 1216/98/887 1218/69/887 +f 1224/72/888 1220/5/888 1217/15/888 +f 1222/26/889 1224/27/889 1215/6/889 +f 1235/74/890 1209/48/890 1199/53/890 +f 1218/75/891 1235/58/891 1214/59/891 +f 1228/77/891 1224/76/891 1215/78/891 +f 1235/51/891 1228/27/891 1215/41/891 +f 1199/7/892 1219/28/892 1217/19/892 +f 1221/63/893 1218/69/893 1223/80/893 +f 1222/68/894 1227/71/894 1224/72/894 +f 1232/81/895 1233/11/895 1236/36/895 +f 1235/84/896 1244/47/896 1231/30/896 +f 1244/6/897 1243/27/897 1242/26/897 +f 1237/86/898 1242/85/898 1238/87/898 +f 1236/19/899 1228/7/899 1232/20/899 +f 1234/82/900 1229/88/900 1232/96/900 +f 1233/37/901 1243/89/901 1236/4/901 +f 1238/26/902 1240/27/902 1231/6/902 +f 1225/27/903 1252/95/903 1228/41/903 +f 1230/93/904 1252/99/904 1241/77/904 +f 1231/78/904 1243/94/904 1240/75/904 +f 1231/95/905 1252/84/905 1241/91/905 +f 1225/7/906 1235/28/906 1233/19/906 +f 1239/96/907 1230/85/907 1234/87/907 +f 1240/90/908 1242/86/908 1243/89/908 +f 1245/46/909 1251/63/909 1248/35/909 +f 1252/29/910 1247/79/910 1244/55/910 +f 1259/6/911 1258/27/911 1257/26/911 +f 1253/68/912 1257/98/912 1254/66/912 +f 1252/28/913 1241/7/913 1248/20/913 +f 1246/70/914 1248/98/914 1250/69/914 +f 1256/72/915 1251/5/915 1249/15/915 +f 1254/26/916 1256/27/916 1247/6/916 +f 1266/74/917 1241/48/917 1231/53/917 +f 1250/75/918 1266/58/918 1246/59/918 +f 1247/78/918 1258/99/918 1256/76/918 +f 1247/41/918 1267/52/918 1259/27/918 +f 1244/28/919 1249/19/919 1245/20/919 +f 1253/63/920 1250/69/920 1255/80/920 +f 1254/68/921 1258/71/921 1256/72/921 +f 1260/82/922 1268/36/922 1263/81/922 +f 1247/83/923 1262/30/923 1266/84/923 +f 1281/6/924 1274/27/924 1273/26/924 +f 1269/86/925 1273/85/925 1270/87/925 +f 1247/28/926 1259/7/926 1263/20/926 +f 1265/82/927 1260/88/927 1263/96/927 +f 1264/37/928 1274/89/928 1268/4/928 +f 1282/8/929 1261/10/929 1269/65/929 +f 1282/91/930 1259/41/930 1267/27/930 +f 1261/93/931 1284/99/931 1282/77/931 +f 1281/76/931 1272/75/931 1262/78/931 +f 1281/83/932 1282/91/932 1262/95/932 +f 1266/28/933 1264/19/933 1260/20/933 +f 1269/88/934 1265/87/934 1271/96/934 +f 1270/97/935 1274/89/935 1272/90/935 +f 1278/35/936 1279/80/936 1283/63/936 +f 1281/55/937 1299/64/937 1277/79/937 +f 1299/6/938 1291/27/938 1290/26/938 +f 1286/66/939 1287/67/939 1290/98/939 +f 1284/28/940 1282/7/940 1278/20/940 +f 1280/69/941 1275/66/941 1278/98/941 +f 1279/15/942 1291/71/942 1283/5/942 +f 1286/26/943 1288/27/943 1277/6/943 +f 1262/53/944 1298/73/944 1282/48/944 +f 1280/75/945 1289/58/945 1276/59/945 +f 1299/77/945 1288/76/945 1277/78/945 +f 1289/51/945 1299/27/945 1277/41/945 +f 1281/28/946 1279/19/946 1275/20/946 +f 1287/80/947 1276/70/947 1280/69/947 +f 1288/72/948 1290/67/948 1291/71/948 +f 1292/82/949 1300/36/949 1295/81/949 +f 1277/83/950 1294/30/950 1289/84/950 +f 1314/6/951 1307/27/951 1306/26/951 +f 1301/86/952 1306/85/952 1302/87/952 +f 1277/28/953 1299/7/953 1295/20/953 +f 1293/81/954 1295/96/954 1297/82/954 +f 1304/90/955 1300/4/955 1296/37/955 +f 1302/26/956 1304/27/956 1294/6/956 +f 1305/91/957 1299/41/957 1298/27/957 +f 1293/93/958 1316/99/958 1305/77/958 +f 1314/76/958 1304/75/958 1294/78/958 +f 1294/95/959 1316/84/959 1305/91/959 +f 1289/28/960 1296/19/960 1292/20/960 +f 1301/88/961 1297/87/961 1303/96/961 +f 1302/97/962 1307/89/962 1304/90/962 +f 1311/35/963 1312/80/963 1315/63/963 +f 1314/55/964 1330/64/964 1310/79/964 +f 1330/6/965 1324/27/965 1323/26/965 +f 1317/68/966 1323/98/966 1318/66/966 +f 1316/28/967 1305/7/967 1311/20/967 +f 1313/69/968 1308/66/968 1311/98/968 +f 1312/15/969 1324/71/969 1315/5/969 +f 1318/26/970 1320/27/970 1310/6/970 +f 1294/53/971 1322/73/971 1305/48/971 +f 1313/75/972 1321/58/972 1309/59/972 +f 1330/77/972 1320/76/972 1310/78/972 +f 1321/51/972 1330/27/972 1310/41/972 +f 1314/28/973 1312/19/973 1308/20/973 +f 1319/80/974 1309/70/974 1313/69/974 +f 1320/72/975 1323/67/975 1324/71/975 +f 1327/81/976 1328/11/976 1331/36/976 +f 1321/84/977 1345/47/977 1346/30/977 +f 1336/8/978 1345/6/978 1337/26/978 +f 1333/87/979 1334/97/979 1337/85/979 +f 1331/19/980 1330/7/980 1327/20/980 +f 1326/81/981 1327/96/981 1329/82/981 +f 1335/90/982 1331/4/982 1328/37/982 +f 1332/65/983 1333/26/983 1347/8/983 +f 1322/27/984 1336/95/984 1330/41/984 +f 1326/93/985 1336/99/985 1347/77/985 +f 1346/78/985 1338/94/985 1335/75/985 +f 1345/83/986 1347/91/986 1346/95/986 +f 1322/7/987 1321/28/987 1328/19/987 +f 1334/96/988 1326/85/988 1329/87/988 +f 1335/90/989 1337/86/989 1338/89/989 +f 1339/46/990 1348/63/990 1342/35/990 +f 1345/55/991 1362/64/991 1341/79/991 +f 1362/6/992 1354/27/992 1353/26/992 +f 1349/68/993 1353/98/993 1350/66/993 +f 1348/19/994 1347/7/994 1342/20/994 +f 1344/69/995 1339/66/995 1342/98/995 +f 1343/15/996 1354/71/996 1348/5/996 +f 1350/26/997 1352/27/997 1341/6/997 +f 1346/53/998 1361/73/998 1347/48/998 +f 1340/59/999 1361/94/999 1360/58/999 +f 1362/77/999 1352/76/999 1341/78/999 +f 1341/41/999 1361/52/999 1362/27/999 +f 1346/7/1000 1345/28/1000 1343/19/1000 +f 1351/80/1001 1340/70/1001 1344/69/1001 +f 1352/72/1002 1353/67/1002 1354/71/1002 +f 1357/81/1003 1358/11/1003 1363/36/1003 +f 1360/84/1004 1376/47/1004 1377/30/1004 +f 1376/6/1005 1370/27/1005 1369/26/1005 +f 1364/86/1006 1369/85/1006 1365/87/1006 +f 1363/19/1007 1362/7/1007 1357/20/1007 +f 1356/81/1008 1357/96/1008 1359/82/1008 +f 1367/90/1009 1363/4/1009 1358/37/1009 +f 1364/65/1010 1365/26/1010 1378/8/1010 +f 1361/27/1011 1368/95/1011 1362/41/1011 +f 1356/93/1012 1368/99/1012 1378/77/1012 +f 1377/78/1012 1370/94/1012 1367/75/1012 +f 1377/95/1013 1368/84/1013 1378/91/1013 +f 1361/7/1014 1360/28/1014 1358/19/1014 +f 1364/88/1015 1359/87/1015 1366/96/1015 +f 1365/97/1016 1370/89/1016 1367/90/1016 +f 1371/46/1017 1379/63/1017 1373/35/1017 +f 1368/29/1018 1395/79/1018 1376/55/1018 +f 1393/6/1019 1386/27/1019 1385/26/1019 +f 1381/66/1020 1382/67/1020 1385/98/1020 +f 1379/19/1021 1378/7/1021 1373/20/1021 +f 1372/70/1022 1373/98/1022 1375/69/1022 +f 1383/72/1023 1379/5/1023 1374/15/1023 +f 1380/65/1024 1381/26/1024 1384/8/1024 +f 1384/74/1025 1378/48/1025 1377/53/1025 +f 1375/75/1026 1384/58/1026 1372/59/1026 +f 1393/77/1026 1383/76/1026 1395/78/1026 +f 1395/41/1026 1392/52/1026 1393/27/1026 +f 1377/7/1027 1376/28/1027 1374/19/1027 +f 1380/63/1028 1375/69/1028 1382/80/1028 +f 1381/68/1029 1386/71/1029 1383/72/1029 +f 1387/82/1030 1394/36/1030 1389/81/1030 +f 1384/84/1031 1410/47/1031 1411/30/1031 +f 1410/6/1032 1403/27/1032 1402/26/1032 +f 1396/86/1033 1402/85/1033 1397/87/1033 +f 1394/19/1034 1393/7/1034 1389/20/1034 +f 1391/82/1035 1387/88/1035 1389/96/1035 +f 1390/37/1036 1403/89/1036 1394/4/1036 +f 1397/26/1037 1399/27/1037 1411/6/1037 +f 1392/27/1038 1401/95/1038 1393/41/1038 +f 1391/92/1039 1400/77/1039 1388/93/1039 +f 1411/78/1040 1403/94/1040 1399/75/1040 +f 1410/83/1041 1400/91/1041 1411/95/1041 +f 1392/7/1042 1384/28/1042 1390/19/1042 +f 1396/88/1043 1391/87/1043 1398/96/1043 +f 1397/97/1044 1403/89/1044 1399/90/1044 +f 1404/46/1045 1412/63/1045 1407/35/1045 +f 1410/55/1046 1421/64/1046 1406/79/1046 +f 1421/6/1047 1420/27/1047 1419/26/1047 +f 1413/68/1048 1419/98/1048 1414/66/1048 +f 1401/28/1049 1400/7/1049 1407/20/1049 +f 1409/69/1050 1404/66/1050 1407/98/1050 +f 1408/15/1051 1420/71/1051 1412/5/1051 +f 1414/26/1052 1416/27/1052 1406/6/1052 +f 1411/53/1053 1418/73/1053 1400/48/1053 +f 1409/75/1054 1417/58/1054 1405/59/1054 +f 1421/77/1054 1416/76/1054 1406/78/1054 +f 1417/51/1054 1421/27/1054 1406/41/1054 +f 1410/28/1055 1408/19/1055 1404/20/1055 +f 1413/63/1056 1409/69/1056 1415/80/1056 +f 1414/68/1057 1420/71/1057 1416/72/1057 +f 1422/82/1058 1428/36/1058 1425/81/1058 +f 1417/84/1059 1436/47/1059 1424/30/1059 +f 1436/6/1060 1435/27/1060 1434/26/1060 +f 1429/86/1061 1434/85/1061 1430/87/1061 +f 1428/19/1062 1421/7/1062 1425/20/1062 +f 1427/82/1063 1422/88/1063 1425/96/1063 +f 1426/37/1064 1435/89/1064 1428/4/1064 +f 1424/6/1065 1443/8/1065 1429/65/1065 +f 1418/27/1066 1433/95/1066 1421/41/1066 +f 1427/92/1067 1443/77/1067 1423/93/1067 +f 1436/76/1067 1432/75/1067 1424/78/1067 +f 1424/95/1068 1433/84/1068 1443/91/1068 +f 1418/7/1069 1417/28/1069 1426/19/1069 +f 1431/96/1070 1423/85/1070 1427/87/1070 +f 1432/90/1071 1434/86/1071 1435/89/1071 +f 1437/46/1072 1444/63/1072 1440/35/1072 +f 1433/29/1073 1439/79/1073 1436/55/1073 +f 1452/6/1074 1451/27/1074 1450/26/1074 +f 1445/68/1075 1450/98/1075 1446/66/1075 +f 1433/28/1076 1443/7/1076 1440/20/1076 +f 1438/70/1077 1440/98/1077 1442/69/1077 +f 1448/72/1078 1444/5/1078 1441/15/1078 +f 1446/26/1079 1448/27/1079 1439/6/1079 +f 1449/74/1080 1443/48/1080 1424/53/1080 +f 1438/59/1081 1458/94/1081 1449/58/1081 +f 1452/77/1081 1448/76/1081 1439/78/1081 +f 1439/41/1081 1458/52/1081 1452/27/1081 +f 1436/28/1082 1441/19/1082 1437/20/1082 +f 1445/63/1083 1442/69/1083 1447/80/1083 +f 1446/68/1084 1451/71/1084 1448/72/1084 +f 1455/81/1085 1456/11/1085 1459/36/1085 +f 1449/84/1086 1467/47/1086 1474/30/1086 +f 1467/6/1087 1466/27/1087 1465/26/1087 +f 1460/86/1088 1465/85/1088 1461/87/1088 +f 1439/28/1089 1452/7/1089 1455/20/1089 +f 1457/82/1090 1453/88/1090 1455/96/1090 +f 1456/37/1091 1466/89/1091 1459/4/1091 +f 1475/8/1092 1454/10/1092 1460/65/1092 +f 1458/27/1093 1464/95/1093 1452/41/1093 +f 1457/92/1094 1475/77/1094 1454/93/1094 +f 1467/76/1094 1463/75/1094 1474/78/1094 +f 1474/95/1095 1464/84/1095 1475/91/1095 +f 1449/28/1096 1456/19/1096 1453/20/1096 +f 1460/88/1097 1457/87/1097 1462/96/1097 +f 1461/97/1098 1466/89/1098 1463/90/1098 +f 1468/46/1099 1476/63/1099 1471/35/1099 +f 1467/55/1100 1491/64/1100 1470/79/1100 +f 1491/6/1101 1483/27/1101 1482/26/1101 +f 1478/66/1102 1479/67/1102 1482/98/1102 +f 1464/28/1103 1475/7/1103 1471/20/1103 +f 1473/69/1104 1468/66/1104 1471/98/1104 +f 1472/15/1105 1483/71/1105 1476/5/1105 +f 1477/65/1106 1478/26/1106 1481/8/1106 +f 1474/53/1107 1490/73/1107 1475/48/1107 +f 1469/59/1108 1490/94/1108 1481/58/1108 +f 1491/77/1108 1480/76/1108 1470/78/1108 +f 1470/41/1108 1490/52/1108 1491/27/1108 +f 1467/28/1109 1472/19/1109 1468/20/1109 +f 1479/80/1110 1469/70/1110 1473/69/1110 +f 1480/72/1111 1482/67/1111 1483/71/1111 +f 1484/82/1112 1492/36/1112 1487/81/1112 +f 1470/83/1113 1486/30/1113 1481/84/1113 +f 1507/8/1114 1499/6/1114 1497/26/1114 +f 1494/87/1115 1495/97/1115 1497/85/1115 +f 1492/19/1116 1491/7/1116 1487/20/1116 +f 1485/81/1117 1487/96/1117 1489/82/1117 +f 1496/90/1118 1492/4/1118 1488/37/1118 +f 1493/65/1119 1494/26/1119 1505/8/1119 +f 1505/91/1120 1491/41/1120 1490/27/1120 +f 1489/92/1121 1505/77/1121 1485/93/1121 +f 1486/78/1121 1498/94/1121 1496/75/1121 +f 1486/95/1122 1507/84/1122 1505/91/1122 +f 1490/7/1123 1481/28/1123 1488/19/1123 +f 1495/96/1124 1485/85/1124 1489/87/1124 +f 1496/90/1125 1497/86/1125 1498/89/1125 +f 1502/35/1126 1503/80/1126 1506/63/1126 +f 1507/29/1127 1524/79/1127 1499/55/1127 +f 1522/6/1128 1515/27/1128 1514/26/1128 +f 1508/68/1129 1514/98/1129 1509/66/1129 +f 1506/19/1130 1505/7/1130 1502/20/1130 +f 1501/70/1131 1502/98/1131 1504/69/1131 +f 1511/72/1132 1506/5/1132 1503/15/1132 +f 1512/8/1133 1501/10/1133 1508/65/1133 +f 1512/74/1134 1505/48/1134 1486/53/1134 +f 1504/75/1135 1512/58/1135 1501/59/1135 +f 1524/78/1136 1515/99/1136 1511/76/1136 +f 1512/51/1136 1522/27/1136 1524/41/1136 +f 1486/7/1137 1499/28/1137 1503/19/1137 +f 1508/63/1138 1504/69/1138 1510/80/1138 +f 1509/68/1139 1515/71/1139 1511/72/1139 +f 1516/82/1140 1523/36/1140 1519/81/1140 +f 1524/83/1141 1518/30/1141 1512/84/1141 +f 1538/6/1142 1532/27/1142 1531/26/1142 +f 1526/87/1143 1527/97/1143 1531/85/1143 +f 1523/19/1144 1522/7/1144 1519/20/1144 +f 1517/81/1145 1519/96/1145 1521/82/1145 +f 1528/90/1146 1523/4/1146 1520/37/1146 +f 1518/6/1147 1529/8/1147 1526/26/1147 +f 1529/91/1148 1522/41/1148 1513/27/1148 +f 1521/92/1149 1529/77/1149 1517/93/1149 +f 1518/78/1149 1532/94/1149 1528/75/1149 +f 1518/95/1150 1530/84/1150 1529/91/1150 +f 1513/7/1151 1512/28/1151 1520/19/1151 +f 1525/88/1152 1521/87/1152 1527/96/1152 +f 1526/97/1153 1532/89/1153 1528/90/1153 +f 1535/35/1154 1536/80/1154 1539/63/1154 +f 1538/55/1155 1554/64/1155 1556/79/1155 +f 1554/6/1156 1546/27/1156 1545/26/1156 +f 1541/66/1157 1542/67/1157 1545/98/1157 +f 1539/19/1158 1529/7/1158 1535/20/1158 +f 1537/69/1159 1533/66/1159 1535/98/1159 +f 1536/15/1160 1546/71/1160 1539/5/1160 +f 1540/65/1161 1541/26/1161 1553/8/1161 +f 1518/53/1162 1544/73/1162 1529/48/1162 +f 1537/75/1163 1553/58/1163 1534/59/1163 +f 1556/78/1164 1546/99/1164 1543/76/1164 +f 1553/51/1164 1554/27/1164 1556/41/1164 +f 1518/7/1165 1538/28/1165 1536/19/1165 +f 1542/80/1166 1534/70/1166 1537/69/1166 +f 1543/72/1167 1545/67/1167 1546/71/1167 +f 1547/82/1168 1555/36/1168 1550/81/1168 +f 1553/84/1169 1569/47/1169 1549/30/1169 +f 1569/6/1170 1563/27/1170 1562/26/1170 +f 1558/87/1171 1559/97/1171 1562/85/1171 +f 1555/19/1172 1554/7/1172 1550/20/1172 +f 1552/82/1173 1547/88/1173 1550/96/1173 +f 1551/37/1174 1563/89/1174 1555/4/1174 +f 1570/8/1175 1548/10/1175 1557/65/1175 +f 1544/27/1176 1561/95/1176 1554/41/1176 +f 1548/93/1177 1561/99/1177 1570/77/1177 +f 1569/76/1177 1560/75/1177 1549/78/1177 +f 1549/95/1178 1561/84/1178 1570/91/1178 +f 1544/7/1179 1553/28/1179 1551/19/1179 +f 1557/88/1180 1552/87/1180 1559/96/1180 +f 1558/97/1181 1563/89/1181 1560/90/1181 +f 1566/35/1182 1567/80/1182 1571/63/1182 +f 1569/55/1183 1579/64/1183 1587/79/1183 +f 1579/6/1184 1578/27/1184 1577/26/1184 +f 1573/66/1185 1574/67/1185 1577/98/1185 +f 1571/19/1186 1570/7/1186 1566/20/1186 +f 1568/69/1187 1564/66/1187 1566/98/1187 +f 1567/15/1188 1578/71/1188 1571/5/1188 +f 1573/26/1189 1575/27/1189 1587/6/1189 +f 1549/53/1190 1576/73/1190 1570/48/1190 +f 1565/59/1191 1576/94/1191 1585/58/1191 +f 1579/77/1191 1575/76/1191 1587/78/1191 +f 1585/51/1191 1579/27/1191 1587/41/1191 +f 1549/7/1192 1569/28/1192 1567/19/1192 +f 1574/80/1193 1565/70/1193 1568/69/1193 +f 1575/72/1194 1577/67/1194 1578/71/1194 +f 1580/82/1195 1586/36/1195 1582/81/1195 +f 1587/83/1196 1602/30/1196 1585/84/1196 +f 1601/6/1197 1594/27/1197 1593/26/1197 +f 1588/86/1198 1593/85/1198 1589/87/1198 +f 1586/19/1199 1579/7/1199 1582/20/1199 +f 1581/81/1200 1582/96/1200 1584/82/1200 +f 1591/90/1201 1586/4/1201 1583/37/1201 +f 1588/65/1202 1589/26/1202 1603/8/1202 +f 1603/91/1203 1579/41/1203 1576/27/1203 +f 1581/93/1204 1592/99/1204 1603/77/1204 +f 1602/78/1204 1594/94/1204 1591/75/1204 +f 1601/83/1205 1603/91/1205 1602/95/1205 +f 1576/7/1206 1585/28/1206 1583/19/1206 +f 1590/96/1207 1581/85/1207 1584/87/1207 +f 1591/90/1208 1593/86/1208 1594/89/1208 +f 1595/46/1209 1604/63/1209 1598/35/1209 +f 1592/29/1210 1597/79/1210 1601/55/1210 +f 1619/8/1211 1611/6/1211 1609/26/1211 +f 1605/68/1212 1609/98/1212 1606/66/1212 +f 1604/19/1213 1603/7/1213 1598/20/1213 +f 1600/69/1214 1595/66/1214 1598/98/1214 +f 1599/15/1215 1610/71/1215 1604/5/1215 +f 1597/6/1216 1618/8/1216 1606/26/1216 +f 1618/74/1217 1603/48/1217 1602/53/1217 +f 1596/59/1218 1619/94/1218 1618/58/1218 +f 1611/77/1218 1608/76/1218 1597/78/1218 +f 1597/41/1218 1619/52/1218 1611/27/1218 +f 1602/7/1219 1601/28/1219 1599/19/1219 +f 1607/80/1220 1596/70/1220 1600/69/1220 +f 1608/72/1221 1609/67/1221 1610/71/1221 +f 1612/82/1222 1620/36/1222 1615/81/1222 +f 1618/84/1223 1629/47/1223 1614/30/1223 +f 1629/6/1224 1628/27/1224 1627/26/1224 +f 1622/87/1225 1623/97/1225 1627/85/1225 +f 1620/19/1226 1611/7/1226 1615/20/1226 +f 1617/82/1227 1612/88/1227 1615/96/1227 +f 1616/37/1228 1628/89/1228 1620/4/1228 +f 1625/8/1229 1613/10/1229 1621/65/1229 +f 1619/27/1230 1626/95/1230 1611/41/1230 +f 1613/93/1225 1626/99/1225 1625/77/1225 +f 1629/76/1225 1624/75/1225 1614/78/1225 +f 1629/83/1231 1625/91/1231 1614/95/1231 +f 1619/7/1232 1618/28/1232 1616/19/1232 +f 1621/88/1233 1617/87/1233 1623/96/1233 +f 1622/97/1234 1628/89/1234 1624/90/1234 +f 158/63/14 153/80/14 150/46/14 +f 155/55/15 175/79/15 173/64/15 +f 154/10/16 162/65/16 172/8/16 +f 162/65/16 164/26/16 173/6/16 +f 164/26/16 165/27/16 173/6/16 +f 161/66/17 164/98/17 162/67/17 +f 152/20/16 154/65/16 157/7/16 +f 154/65/16 172/25/16 157/7/16 +f 173/100/16 165/26/16 159/28/16 +f 165/26/16 158/19/16 159/28/16 +f 152/20/16 157/7/16 158/19/16 +f 154/69/15 152/98/15 150/66/15 +f 153/15/18 158/5/18 165/71/18 +f 171/8/19 175/6/19 160/65/19 +f 175/6/19 163/27/19 161/26/19 +f 161/26/19 160/65/19 175/6/19 +f 156/53/18 157/48/18 172/73/18 +f 171/58/20 172/94/20 154/75/20 +f 163/76/20 165/99/20 173/77/20 +f 156/7/19 171/25/19 151/65/19 +f 153/19/19 163/26/19 155/28/19 +f 163/26/19 175/100/19 155/28/19 +f 156/7/19 151/65/19 150/20/19 +f 153/19/19 155/28/19 156/7/19 +f 159/74/20 157/64/20 156/79/20 +f 162/80/21 154/69/21 151/70/21 +f 163/72/22 165/71/22 164/67/22 +f 168/81/14 174/36/14 169/11/14 +f 190/30/23 183/47/23 175/83/23 +f 170/10/24 178/65/24 192/8/24 +f 178/65/24 181/26/24 192/8/24 +f 192/8/24 181/26/24 183/6/24 +f 181/85/25 178/97/25 176/86/25 +f 168/20/1239 170/65/1239 173/7/1239 +f 170/65/1240 192/25/1240 173/7/1240 +f 183/100/1241 182/26/1241 175/28/1241 +f 182/26/1242 174/19/1242 175/28/1242 +f 168/20/18 173/7/18 174/19/18 +f 170/82/26 168/96/26 166/88/26 +f 169/37/27 174/4/27 182/89/27 +f 190/6/28 179/27/28 177/26/28 +f 177/26/28 176/65/28 180/8/28 +f 176/65/28 167/10/28 180/8/28 +f 173/41/29 192/95/29 180/91/29 +f 180/77/30 192/99/30 170/92/30 +f 190/78/30 179/75/30 182/94/30 +f 180/91/31 192/84/31 183/83/31 +f 172/7/1243 180/25/1243 167/65/1243 +f 169/19/1244 179/26/1244 171/28/1244 +f 179/26/1243 190/100/1243 171/28/1243 +f 172/7/1245 167/65/1245 166/20/1245 +f 169/19/15 171/28/15 172/7/15 +f 175/33/20 173/58/20 172/59/20 +f 170/87/32 167/85/32 176/88/32 +f 182/89/33 181/86/33 177/97/33 +f 191/63/1246 188/80/1246 184/46/1246 +f 183/55/1247 186/79/1247 206/64/1247 +f 189/10/36 195/65/36 205/8/36 +f 195/65/1248 197/26/1248 205/8/1248 +f 197/26/36 198/27/36 206/6/36 +f 197/98/37 195/67/37 193/68/37 +f 187/20/1249 189/65/1249 180/7/1249 +f 189/65/1250 205/25/1250 180/7/1250 +f 206/100/1251 198/26/1251 192/28/1251 +f 198/26/1252 191/19/1252 192/28/1252 +f 187/20/38 180/7/38 192/28/38 +f 189/69/1253 187/98/1253 184/66/1253 +f 188/15/1254 191/5/1254 198/71/1254 +f 186/6/41 196/27/41 194/26/41 +f 194/26/1255 193/65/1255 204/8/1255 +f 193/65/41 185/10/41 204/8/41 +f 190/53/42 180/48/42 205/73/42 +f 185/59/43 204/58/43 205/94/43 +f 186/78/43 196/76/43 198/99/43 +f 206/27/43 205/52/43 204/51/43 +f 190/7/1256 204/25/1256 185/65/1256 +f 188/19/1257 196/26/1257 183/28/1257 +f 196/26/1258 186/100/1258 183/28/1258 +f 190/7/1259 185/65/1259 184/20/1259 +f 188/19/44 183/28/44 184/20/44 +f 189/69/45 185/70/45 193/63/45 +f 198/71/46 197/67/46 194/68/46 +f 207/36/47 202/11/47 199/82/47 +f 204/84/1260 222/30/1260 215/47/1260 +f 203/10/1261 210/65/1261 224/8/1261 +f 210/65/1262 213/26/1262 215/6/1262 +f 224/8/1263 210/65/1263 215/6/1263 +f 213/85/1264 210/97/1264 208/86/1264 +f 201/20/1265 203/65/1265 206/7/1265 +f 203/65/1266 224/25/1266 206/7/1266 +f 215/100/1267 214/26/1267 186/28/1267 +f 214/26/1268 207/19/1268 186/28/1268 +f 201/20/51 206/7/51 207/19/51 +f 203/82/1269 201/96/1269 199/88/1269 +f 202/37/1270 207/4/1270 214/89/1270 +f 222/6/1271 211/27/1271 209/26/1271 +f 209/26/1272 208/65/1272 222/6/1272 +f 208/65/54 200/10/54 212/8/54 +f 205/27/1273 206/41/1273 224/95/1273 +f 212/77/56 224/99/56 203/92/56 +f 222/78/56 211/75/56 214/94/56 +f 222/95/57 212/91/57 224/84/57 +f 205/7/1274 212/25/1274 200/65/1274 +f 202/19/1275 211/26/1275 204/28/1275 +f 211/26/1276 222/100/1276 204/28/1276 +f 205/7/1277 200/65/1277 199/20/1277 +f 202/19/1278 204/28/1278 205/7/1278 +f 203/87/1279 200/85/1279 208/88/1279 +f 214/89/1280 213/86/1280 209/97/1280 +f 219/35/61 223/63/61 220/80/61 +f 215/55/1281 218/79/1281 233/64/1281 +f 221/10/1282 227/65/1282 230/8/1282 +f 227/65/1283 231/26/1283 230/8/1283 +f 230/8/63 231/26/63 233/6/63 +f 231/98/64 227/67/64 225/68/64 +f 219/20/1284 221/65/1284 212/7/1284 +f 221/65/1285 230/25/1285 212/7/1285 +f 233/100/1286 232/26/1286 224/28/1286 +f 232/26/1287 223/19/1287 224/28/1287 +f 219/20/1288 212/7/1288 224/28/1288 +f 221/69/1289 219/98/1289 216/66/1289 +f 220/15/1290 223/5/1290 232/71/1290 +f 218/6/68 228/27/68 226/26/68 +f 226/26/1291 225/65/1291 229/8/1291 +f 225/65/1292 217/10/1292 229/8/1292 +f 222/53/1293 212/48/1293 230/73/1293 +f 229/58/70 230/94/70 221/75/70 +f 228/76/70 232/99/70 233/77/70 +f 218/41/70 233/27/70 230/52/70 +f 222/7/1294 229/25/1294 217/65/1294 +f 220/19/1295 228/26/1295 215/28/1295 +f 228/26/1296 218/100/1296 215/28/1296 +f 222/7/1297 217/65/1297 216/20/1297 +f 220/19/1298 215/28/1298 216/20/1298 +f 227/80/1299 221/69/1299 217/70/1299 +f 228/72/1300 232/71/1300 231/67/1300 +f 240/36/74 238/11/74 234/82/74 +f 236/30/1301 254/47/1301 218/83/1301 +f 239/10/1302 243/65/1302 245/8/1302 +f 243/65/1303 246/26/1303 245/8/1303 +f 245/8/76 246/26/76 254/6/76 +f 242/87/77 246/85/77 243/97/77 +f 237/20/1304 239/65/1304 233/7/1304 +f 239/65/1305 245/25/1305 233/7/1305 +f 254/100/1306 247/26/1306 218/28/1306 +f 247/26/1307 240/19/1307 218/28/1307 +f 237/20/1308 233/7/1308 240/19/1308 +f 237/96/1309 234/88/1309 235/81/1309 +f 240/4/1310 247/89/1310 244/90/1310 +f 236/6/81 244/27/81 242/26/81 +f 242/26/1311 241/65/1311 255/8/1311 +f 241/65/1312 235/10/1312 255/8/1312 +f 233/41/1313 245/95/1313 255/91/1313 +f 235/93/83 255/77/83 245/99/83 +f 244/75/83 247/94/83 254/76/83 +f 255/91/84 245/84/84 254/83/84 +f 230/7/1314 255/25/1314 235/65/1314 +f 238/19/1315 244/26/1315 229/28/1315 +f 244/26/1316 236/100/1316 229/28/1316 +f 230/7/1317 235/65/1317 234/20/1317 +f 238/19/1318 229/28/1318 230/7/1318 +f 243/96/1319 239/87/1319 235/85/1319 +f 244/90/1320 247/89/1320 246/86/1320 +f 256/63/1321 252/80/1321 248/46/1321 +f 250/79/1322 271/64/1322 245/29/1322 +f 253/10/1323 259/65/1323 262/8/1323 +f 259/65/1324 263/26/1324 262/8/1324 +f 263/26/90 264/27/90 271/6/90 +f 258/66/91 263/98/91 259/67/91 +f 251/20/1325 253/65/1325 255/7/1325 +f 253/65/1326 262/25/1326 255/7/1326 +f 271/100/1327 264/26/1327 245/28/1327 +f 264/26/1328 256/19/1328 245/28/1328 +f 251/20/1329 255/7/1329 256/19/1329 +f 253/69/1330 251/98/1330 248/66/1330 +f 256/5/1331 264/71/1331 260/72/1331 +f 261/8/1332 250/6/1332 258/26/1332 +f 250/6/1332 260/27/1332 258/26/1332 +f 258/26/1333 257/65/1333 261/8/1333 +f 236/53/1334 255/48/1334 262/73/1334 +f 261/58/97 262/94/97 253/75/97 +f 260/76/97 264/99/97 271/77/97 +f 271/27/97 262/52/97 261/51/97 +f 236/7/1335 261/25/1335 249/65/1335 +f 252/19/1336 260/26/1336 254/28/1336 +f 260/26/1337 250/100/1337 254/28/1337 +f 236/7/1338 249/65/1338 248/20/1338 +f 252/19/1339 254/28/1339 236/7/1339 +f 253/69/1340 249/70/1340 257/63/1340 +f 264/71/1341 263/67/1341 258/68/1341 +f 272/36/101 269/11/101 265/82/101 +f 261/84/1342 267/30/1342 280/47/1342 +f 270/10/103 275/65/103 287/8/103 +f 275/65/103 278/26/103 287/8/103 +f 278/26/103 279/27/103 280/6/103 +f 278/85/104 275/97/104 273/86/104 +f 268/20/1343 270/65/1343 271/7/1343 +f 270/65/1344 287/25/1344 271/7/1344 +f 280/100/1345 279/26/1345 250/28/1345 +f 279/26/1346 272/19/1346 250/28/1346 +f 268/20/1347 271/7/1347 272/19/1347 +f 270/82/1348 268/96/1348 265/88/1348 +f 269/37/1349 272/4/1349 279/89/1349 +f 267/6/108 276/27/108 274/26/108 +f 274/26/108 273/65/108 277/8/108 +f 273/65/1350 266/10/1350 277/8/1350 +f 262/27/1351 271/41/1351 287/95/1351 +f 277/77/110 287/99/110 270/92/110 +f 276/75/110 279/94/110 280/76/110 +f 277/91/111 287/84/111 280/83/111 +f 262/7/1352 277/25/1352 266/65/1352 +f 269/19/1353 276/26/1353 261/28/1353 +f 276/26/1354 267/100/1354 261/28/1354 +f 262/7/1355 266/65/1355 265/20/1355 +f 269/19/1356 261/28/1356 262/7/1356 +f 275/96/113 270/87/113 266/85/113 +f 276/90/114 279/89/114 278/86/114 +f 286/63/115 284/80/115 281/46/115 +f 304/79/1357 296/64/1357 287/29/1357 +f 285/10/117 290/65/117 293/8/117 +f 290/65/1358 294/26/1358 296/6/1358 +f 294/26/1359 295/27/1359 296/6/1359 +f 294/98/118 290/67/118 288/68/118 +f 283/20/1360 285/65/1360 277/7/1360 +f 285/65/1361 293/25/1361 277/7/1361 +f 296/100/1362 295/26/1362 287/28/1362 +f 295/26/1363 286/19/1363 287/28/1363 +f 283/20/1364 277/7/1364 286/19/1364 +f 283/98/1365 281/66/1365 282/70/1365 +f 286/5/1366 295/71/1366 291/72/1366 +f 292/8/122 304/6/122 288/65/122 +f 304/6/1367 291/27/1367 289/26/1367 +f 289/26/1368 288/65/1368 304/6/1368 +f 277/48/1369 293/73/1369 292/74/1369 +f 282/59/124 292/58/124 293/94/124 +f 304/78/124 291/76/124 295/99/124 +f 296/27/124 293/52/124 292/51/124 +f 267/7/1370 292/25/1370 282/65/1370 +f 284/19/1371 291/26/1371 280/28/1371 +f 291/26/1372 304/100/1372 280/28/1372 +f 267/7/1373 282/65/1373 281/20/1373 +f 284/19/1374 280/28/1374 267/7/1374 +f 290/80/1375 285/69/1375 282/70/1375 +f 291/72/1376 295/71/1376 294/67/1376 +f 303/36/128 301/11/128 297/82/128 +f 299/30/1377 316/47/1377 304/83/1377 +f 302/10/130 307/65/130 319/8/130 +f 307/65/130 309/26/130 319/8/130 +f 319/8/130 309/26/130 316/6/130 +f 306/87/131 309/85/131 307/97/131 +f 300/20/1378 302/65/1378 296/7/1378 +f 302/65/1379 319/25/1379 296/7/1379 +f 316/100/1380 310/26/1380 304/28/1380 +f 310/26/1381 303/19/1381 304/28/1381 +f 300/20/132 296/7/132 304/28/132 +f 300/96/1382 297/88/1382 298/81/1382 +f 303/4/1383 310/89/1383 308/90/1383 +f 299/6/135 308/27/135 306/26/135 +f 306/26/135 305/65/135 317/8/135 +f 305/65/135 298/10/135 317/8/135 +f 296/41/1384 319/95/1384 317/91/1384 +f 317/77/137 319/99/137 302/92/137 +f 308/75/137 310/94/137 316/76/137 +f 317/91/138 319/84/138 316/83/138 +f 293/7/1385 317/25/1385 298/65/1385 +f 301/19/1386 308/26/1386 292/28/1386 +f 308/26/1387 299/100/1387 292/28/1387 +f 293/7/1388 298/65/1388 297/20/1388 +f 301/19/139 292/28/139 297/20/139 +f 307/96/140 302/87/140 298/85/140 +f 308/90/141 310/89/141 309/86/141 +f 313/35/142 318/63/142 314/80/142 +f 335/79/1389 333/64/1389 319/29/1389 +f 315/10/140 322/65/140 332/8/140 +f 322/65/140 325/26/140 333/6/140 +f 325/26/140 326/27/140 333/6/140 +f 325/98/144 322/67/144 320/68/144 +f 313/20/1390 315/65/1390 317/7/1390 +f 315/65/167 332/25/167 317/7/167 +f 333/100/167 326/26/167 319/28/167 +f 326/26/1391 318/19/1391 319/28/1391 +f 313/20/145 317/7/145 318/19/145 +f 313/98/146 311/66/146 312/70/146 +f 318/5/147 326/71/147 323/72/147 +f 324/8/141 335/6/141 320/65/141 +f 335/6/141 323/27/141 321/26/141 +f 321/26/141 320/65/141 335/6/141 +f 317/48/148 332/73/148 324/74/148 +f 312/59/149 324/58/149 332/94/149 +f 335/78/149 323/76/149 326/99/149 +f 333/27/149 332/52/149 324/51/149 +f 299/7/173 324/25/173 312/65/173 +f 314/19/1392 323/26/1392 316/28/1392 +f 323/26/173 335/100/173 316/28/173 +f 299/7/1393 312/65/1393 311/20/1393 +f 314/19/150 316/28/150 299/7/150 +f 315/69/151 312/70/151 320/63/151 +f 326/71/152 325/67/152 321/68/152 +f 334/36/153 330/11/153 327/82/153 +f 350/30/140 349/47/140 335/83/140 +f 331/10/154 338/65/154 341/8/154 +f 338/65/154 342/26/154 341/8/154 +f 341/8/154 342/26/154 349/6/154 +f 337/87/155 342/85/155 338/97/155 +f 329/20/1394 331/65/1394 333/7/1394 +f 331/65/1395 341/25/1395 333/7/1395 +f 349/100/1395 343/26/1395 335/28/1395 +f 343/26/1396 334/19/1396 335/28/1396 +f 329/20/156 333/7/156 335/28/156 +f 331/82/140 329/96/140 327/88/140 +f 330/37/141 334/4/141 343/89/141 +f 350/6/157 339/27/157 337/26/157 +f 337/26/157 336/65/157 340/8/157 +f 336/65/157 328/10/157 340/8/157 +f 333/41/141 341/95/141 340/91/141 +f 340/77/158 341/99/158 331/92/158 +f 339/75/158 343/94/158 349/76/158 +f 340/91/159 341/84/159 349/83/159 +f 332/7/1397 340/25/1397 328/65/1397 +f 330/19/1398 339/26/1398 324/28/1398 +f 339/26/1397 350/100/1397 324/28/1397 +f 332/7/1399 328/65/1399 327/20/1399 +f 330/19/160 324/28/160 327/20/160 +f 331/87/161 328/85/161 336/88/161 +f 343/89/162 342/86/162 337/97/162 +f 351/63/163 347/80/163 344/46/163 +f 368/79/1400 358/64/1400 341/29/1400 +f 348/10/165 354/65/165 366/8/165 +f 354/65/165 356/26/165 358/6/165 +f 356/26/165 357/27/165 358/6/165 +f 356/98/166 354/67/166 352/68/166 +f 346/20/1401 348/65/1401 340/7/1401 +f 348/65/1402 366/25/1402 340/7/1402 +f 358/100/1402 357/26/1402 341/28/1402 +f 357/26/1403 351/19/1403 341/28/1403 +f 346/20/167 340/7/167 341/28/167 +f 346/98/168 344/66/168 345/70/168 +f 351/5/169 357/71/169 355/72/169 +f 365/8/170 368/6/170 352/65/170 +f 368/6/1404 355/27/1404 353/26/1404 +f 353/26/170 352/65/170 368/6/170 +f 340/48/1405 366/73/1405 365/74/1405 +f 345/59/172 365/58/172 366/94/172 +f 368/78/172 355/76/172 357/99/172 +f 358/27/172 366/52/172 365/51/172 +f 350/7/1406 365/25/1406 345/65/1406 +f 347/19/1407 355/26/1407 349/28/1407 +f 355/26/1406 368/100/1406 349/28/1406 +f 350/7/1408 345/65/1408 344/20/1408 +f 347/19/173 349/28/173 344/20/173 +f 348/69/174 345/70/174 352/63/174 +f 357/71/175 356/67/175 353/68/175 +f 367/36/176 363/11/176 359/82/176 +f 365/84/1409 361/30/1409 381/47/1409 +f 364/10/1410 371/65/1410 384/8/1410 +f 371/65/1411 373/26/1411 381/6/1411 +f 384/8/1412 371/65/1412 381/6/1412 +f 373/85/179 371/97/179 369/86/179 +f 362/20/1413 364/65/1413 358/7/1413 +f 364/65/1414 384/25/1414 358/7/1414 +f 381/100/1415 374/26/1415 368/28/1415 +f 374/26/1416 367/19/1416 368/28/1416 +f 362/20/180 358/7/180 368/28/180 +f 364/82/1417 362/96/1417 359/88/1417 +f 363/37/1418 367/4/1418 374/89/1418 +f 361/6/1419 372/27/1419 370/26/1419 +f 370/26/1420 369/65/1420 361/6/1420 +f 369/65/183 360/10/183 382/8/183 +f 366/27/1421 358/41/1421 384/95/1421 +f 382/77/185 384/99/185 364/92/185 +f 372/75/185 374/94/185 381/76/185 +f 382/91/186 384/84/186 381/83/186 +f 366/7/1422 382/25/1422 360/65/1422 +f 363/19/1423 372/26/1423 365/28/1423 +f 372/26/1424 361/100/1424 365/28/1424 +f 366/7/1425 360/65/1425 359/20/1425 +f 363/19/1426 365/28/1426 359/20/1426 +f 371/96/1427 364/87/1427 360/85/1427 +f 372/90/1428 374/89/1428 373/86/1428 +f 383/63/190 379/80/190 375/46/190 +f 377/79/1429 398/64/1429 384/29/1429 +f 380/10/192 387/65/192 389/8/192 +f 387/65/1430 390/26/1430 398/6/1430 +f 390/26/1431 391/27/1431 398/6/1431 +f 386/66/193 390/98/193 387/67/193 +f 378/20/1432 380/65/1432 382/7/1432 +f 380/65/1433 389/25/1433 382/7/1433 +f 398/100/1434 391/26/1434 384/28/1434 +f 391/26/1435 383/19/1435 384/28/1435 +f 378/20/194 382/7/194 384/28/194 +f 378/98/1436 375/66/1436 376/70/1436 +f 383/5/1437 391/71/1437 388/72/1437 +f 377/6/1438 388/27/1438 386/26/1438 +f 386/26/1439 385/65/1439 377/6/1439 +f 385/65/197 376/10/197 397/8/197 +f 382/48/1440 389/73/1440 397/74/1440 +f 397/58/199 389/94/199 380/75/199 +f 388/76/199 391/99/199 398/77/199 +f 377/41/199 398/27/199 389/52/199 +f 361/7/1441 397/25/1441 376/65/1441 +f 379/19/1442 388/26/1442 381/28/1442 +f 388/26/1443 377/100/1443 381/28/1443 +f 361/7/1444 376/65/1444 375/20/1444 +f 379/19/1445 381/28/1445 375/20/1445 +f 387/80/1446 380/69/1446 376/70/1446 +f 388/72/1447 391/71/1447 390/67/1447 +f 399/36/203 395/11/203 392/82/203 +f 414/30/1448 413/47/1448 377/83/1448 +f 396/10/1449 402/65/1449 404/8/1449 +f 402/65/1450 405/26/1450 404/8/1450 +f 404/8/205 405/26/205 413/6/205 +f 401/87/206 405/85/206 402/97/206 +f 394/20/1451 396/65/1451 398/7/1451 +f 396/65/1452 404/25/1452 398/7/1452 +f 413/100/1453 406/26/1453 377/28/1453 +f 406/26/1454 399/19/1454 377/28/1454 +f 394/20/1455 398/7/1455 377/28/1455 +f 394/96/1456 392/88/1456 393/81/1456 +f 399/4/1457 406/89/1457 403/90/1457 +f 414/6/210 403/27/210 401/26/210 +f 401/26/1458 400/65/1458 415/8/1458 +f 400/65/1459 393/10/1459 415/8/1459 +f 398/41/1460 404/95/1460 415/91/1460 +f 393/93/212 415/77/212 404/99/212 +f 403/75/212 406/94/212 413/76/212 +f 415/91/213 404/84/213 413/83/213 +f 389/7/1461 415/25/1461 393/65/1461 +f 395/19/1462 403/26/1462 397/28/1462 +f 403/26/1463 414/100/1463 397/28/1463 +f 389/7/1464 393/65/1464 392/20/1464 +f 395/19/1465 397/28/1465 392/20/1465 +f 396/87/1466 393/85/1466 400/88/1466 +f 406/89/1467 405/86/1467 401/97/1467 +f 416/63/217 411/80/217 407/46/217 +f 413/55/1468 409/79/1468 423/64/1468 +f 412/10/1469 419/65/1469 430/8/1469 +f 419/65/1470 421/26/1470 430/8/1470 +f 430/8/219 421/26/219 423/6/219 +f 418/66/220 421/98/220 419/67/220 +f 410/20/1471 412/65/1471 415/7/1471 +f 412/65/1472 430/25/1472 415/7/1472 +f 423/100/1473 422/26/1473 404/28/1473 +f 422/26/1474 416/19/1474 404/28/1474 +f 410/20/1475 415/7/1475 416/19/1475 +f 412/69/1476 410/98/1476 407/66/1476 +f 411/15/1477 416/5/1477 422/71/1477 +f 409/6/224 420/27/224 418/26/224 +f 418/26/1478 417/65/1478 429/8/1478 +f 417/65/1479 408/10/1479 429/8/1479 +f 414/53/1480 415/48/1480 430/73/1480 +f 408/59/226 429/58/226 430/94/226 +f 409/78/226 420/76/226 422/99/226 +f 409/41/226 423/27/226 430/52/226 +f 414/7/1481 429/25/1481 408/65/1481 +f 411/19/1482 420/26/1482 413/28/1482 +f 420/26/1483 409/100/1483 413/28/1483 +f 414/7/1484 408/65/1484 407/20/1484 +f 411/19/1485 413/28/1485 414/7/1485 +f 412/69/1486 408/70/1486 417/63/1486 +f 422/71/1487 421/67/1487 418/68/1487 +f 431/36/230 427/11/230 424/82/230 +f 444/30/1488 443/47/1488 409/83/1488 +f 428/10/1489 434/65/1489 447/8/1489 +f 434/65/1490 436/26/1490 447/8/1490 +f 436/26/232 437/27/232 443/6/232 +f 433/87/233 436/85/233 434/97/233 +f 426/20/1491 428/65/1491 423/7/1491 +f 428/65/1492 447/25/1492 423/7/1492 +f 443/100/1493 437/26/1493 409/28/1493 +f 437/26/1494 431/19/1494 409/28/1494 +f 426/20/1495 423/7/1495 431/19/1495 +f 426/96/235 424/88/235 425/81/235 +f 431/4/1496 437/89/1496 435/90/1496 +f 444/6/237 435/27/237 433/26/237 +f 433/26/1497 432/65/1497 445/8/1497 +f 432/65/1498 425/10/1498 445/8/1498 +f 423/41/1499 447/95/1499 445/91/1499 +f 425/93/239 445/77/239 447/99/239 +f 444/78/239 435/75/239 437/94/239 +f 430/7/1500 445/25/1500 425/65/1500 +f 427/19/1501 435/26/1501 429/28/1501 +f 435/26/1502 444/100/1502 429/28/1502 +f 430/7/1503 425/65/1503 424/20/1503 +f 427/19/1504 429/28/1504 430/7/1504 +f 428/87/1505 425/85/1505 432/88/1505 +f 437/89/1506 436/86/1506 433/97/1506 +f 446/63/243 441/80/243 438/46/243 +f 443/55/1507 464/79/1507 455/64/1507 +f 442/10/1508 450/65/1508 462/8/1508 +f 450/65/1509 453/26/1509 462/8/1509 +f 453/26/245 454/27/245 455/6/245 +f 449/66/246 453/98/246 450/67/246 +f 440/20/1510 442/65/1510 445/7/1510 +f 442/65/1511 462/25/1511 445/7/1511 +f 455/100/1512 454/26/1512 447/28/1512 +f 454/26/1513 446/19/1513 447/28/1513 +f 440/20/1514 445/7/1514 446/19/1514 +f 442/69/1515 440/98/1515 438/66/1515 +f 441/15/1516 446/5/1516 454/71/1516 +f 464/6/250 451/27/250 449/26/250 +f 449/26/1517 448/65/1517 452/8/1517 +f 448/65/1518 439/10/1518 452/8/1518 +f 444/53/1519 445/48/1519 462/73/1519 +f 439/59/252 452/58/252 462/94/252 +f 451/76/252 454/99/252 455/77/252 +f 464/41/252 455/27/252 462/52/252 +f 444/7/1520 452/25/1520 439/65/1520 +f 441/19/1521 451/26/1521 443/28/1521 +f 451/26/1522 464/100/1522 443/28/1522 +f 444/7/1523 439/65/1523 438/20/1523 +f 441/19/1524 443/28/1524 444/7/1524 +f 443/73/239 447/74/239 445/64/239 +f 442/69/254 439/70/254 448/63/254 +f 454/71/255 453/67/255 449/68/255 +f 463/36/256 460/11/256 456/82/256 +f 458/30/1525 471/47/1525 464/83/1525 +f 461/10/1526 467/65/1526 479/8/1526 +f 467/65/1527 469/26/1527 479/8/1527 +f 469/26/258 470/27/258 471/6/258 +f 469/85/259 467/97/259 465/86/259 +f 459/20/1528 461/65/1528 455/7/1528 +f 461/65/1529 479/25/1529 455/7/1529 +f 471/100/1530 470/26/1530 464/28/1530 +f 470/26/1531 463/19/1531 464/28/1531 +f 459/20/1532 455/7/1532 463/19/1532 +f 461/82/1533 459/96/1533 456/88/1533 +f 460/37/1534 463/4/1534 470/89/1534 +f 458/6/263 468/27/263 466/26/263 +f 466/26/1535 465/65/1535 477/8/1535 +f 465/65/1536 457/10/1536 477/8/1536 +f 455/41/1537 479/95/1537 477/91/1537 +f 477/77/265 479/99/265 461/92/265 +f 468/75/265 470/94/265 471/76/265 +f 458/95/266 477/91/266 479/84/266 +f 462/7/1538 477/25/1538 457/65/1538 +f 460/19/1539 468/26/1539 452/28/1539 +f 468/26/1540 458/100/1540 452/28/1540 +f 462/7/1541 457/65/1541 456/20/1541 +f 460/19/1542 452/28/1542 462/7/1542 +f 467/96/1543 461/87/1543 457/85/1543 +f 468/90/1544 470/89/1544 469/86/1544 +f 478/63/270 475/80/270 472/46/270 +f 496/79/1545 487/64/1545 479/29/1545 +f 476/10/1546 482/65/1546 484/8/1546 +f 482/65/1547 485/26/1547 484/8/1547 +f 484/8/272 485/26/272 487/6/272 +f 485/98/273 482/67/273 480/68/273 +f 474/20/1548 476/65/1548 477/7/1548 +f 476/65/1549 484/25/1549 477/7/1549 +f 487/100/1550 486/26/1550 479/28/1550 +f 486/26/1551 478/19/1551 479/28/1551 +f 474/20/1552 477/7/1552 478/19/1552 +f 474/98/1553 472/66/1553 473/70/1553 +f 478/5/1554 486/71/1554 483/72/1554 +f 494/8/1555 496/6/1555 481/26/1555 +f 496/6/1555 483/27/1555 481/26/1555 +f 481/26/1556 480/65/1556 494/8/1556 +f 477/48/1557 484/73/1557 494/74/1557 +f 494/58/279 484/94/279 476/75/279 +f 483/76/279 486/99/279 487/77/279 +f 487/27/279 484/52/279 494/51/279 +f 458/7/1558 494/25/1558 473/65/1558 +f 475/19/1559 483/26/1559 471/28/1559 +f 483/26/1560 496/100/1560 471/28/1560 +f 458/7/1561 473/65/1561 472/20/1561 +f 475/19/1562 471/28/1562 458/7/1562 +f 476/69/1563 473/70/1563 480/63/1563 +f 486/71/1564 485/67/1564 481/68/1564 +f 495/36/283 492/11/283 488/82/283 +f 494/84/1565 490/30/1565 510/47/1565 +f 493/10/1566 499/65/1566 512/8/1566 +f 499/65/1567 502/26/1567 510/6/1567 +f 512/8/1566 499/65/1566 510/6/1566 +f 502/85/286 499/97/286 497/86/286 +f 491/20/1568 493/65/1568 487/7/1568 +f 493/65/1569 512/25/1569 487/7/1569 +f 510/100/1570 503/26/1570 496/28/1570 +f 503/26/1571 495/19/1571 496/28/1571 +f 491/20/1572 487/7/1572 495/19/1572 +f 493/82/1573 491/96/1573 488/88/1573 +f 492/37/1574 495/4/1574 503/89/1574 +f 490/6/1575 500/27/1575 498/26/1575 +f 498/26/1576 497/65/1576 490/6/1576 +f 497/65/290 489/10/290 501/8/290 +f 484/27/1577 487/41/1577 512/95/1577 +f 489/93/1578 501/77/1578 512/99/1578 +f 500/75/292 503/94/292 510/76/292 +f 490/95/293 501/91/293 512/84/293 +f 484/7/1579 501/25/1579 489/65/1579 +f 492/19/1580 500/26/1580 494/28/1580 +f 500/26/1581 490/100/1581 494/28/1581 +f 484/7/1582 489/65/1582 488/20/1582 +f 492/19/1583 494/28/1583 484/7/1583 +f 499/96/1584 493/87/1584 489/85/1584 +f 500/90/1585 503/89/1585 502/86/1585 +f 507/35/297 511/63/297 508/80/297 +f 506/79/1586 519/64/1586 512/29/1586 +f 509/10/299 515/65/299 526/8/299 +f 515/65/1587 517/26/1587 519/6/1587 +f 517/26/1588 518/27/1588 519/6/1588 +f 517/98/300 515/67/300 513/68/300 +f 507/20/1589 509/65/1589 501/7/1589 +f 509/65/1590 526/25/1590 501/7/1590 +f 519/100/1591 518/26/1591 512/28/1591 +f 518/26/1592 511/19/1592 512/28/1592 +f 507/20/1593 501/7/1593 512/28/1593 +f 507/98/1594 504/66/1594 505/70/1594 +f 511/5/1595 518/71/1595 516/72/1595 +f 506/6/1596 516/27/1596 514/26/1596 +f 514/26/1597 513/65/1597 506/6/1597 +f 513/65/304 505/10/304 525/8/304 +f 501/48/1598 526/73/1598 525/74/1598 +f 525/58/306 526/94/306 509/75/306 +f 516/76/306 518/99/306 519/77/306 +f 506/41/307 519/27/307 526/52/307 +f 490/7/1599 525/25/1599 505/65/1599 +f 508/19/1600 516/26/1600 510/28/1600 +f 516/26/1601 506/100/1601 510/28/1601 +f 490/7/1602 505/65/1602 504/20/1602 +f 508/19/1603 510/28/1603 504/20/1603 +f 509/69/1604 505/70/1604 513/63/1604 +f 518/71/1605 517/67/1605 514/68/1605 +f 522/81/311 527/36/311 523/11/311 +f 525/84/1606 542/30/1606 541/47/1606 +f 524/10/313 530/65/313 532/8/313 +f 530/65/1607 533/26/1607 541/6/1607 +f 533/26/1608 534/27/1608 541/6/1608 +f 529/87/314 533/85/314 530/97/314 +f 522/20/1609 524/65/1609 519/7/1609 +f 524/65/1610 532/25/1610 519/7/1610 +f 541/100/1610 534/26/1610 506/28/1610 +f 534/26/1611 527/19/1611 506/28/1611 +f 522/20/1612 519/7/1612 506/28/1612 +f 524/82/1613 522/96/1613 520/88/1613 +f 523/37/1614 527/4/1614 534/89/1614 +f 543/8/318 542/6/318 528/65/318 +f 542/6/1615 531/27/1615 529/26/1615 +f 529/26/1616 528/65/1616 542/6/1616 +f 526/27/1617 519/41/1617 532/95/1617 +f 543/77/320 532/99/320 524/92/320 +f 531/75/320 534/94/320 541/76/320 +f 543/91/321 532/84/321 541/83/321 +f 526/7/1618 543/25/1618 521/65/1618 +f 523/19/1619 531/26/1619 525/28/1619 +f 531/26/1618 542/100/1618 525/28/1618 +f 526/7/1620 521/65/1620 520/20/1620 +f 523/19/1621 525/28/1621 520/20/1621 +f 524/87/1622 521/85/1622 528/88/1622 +f 534/89/1623 533/86/1623 529/97/1623 +f 544/63/325 539/80/325 535/46/325 +f 541/55/1624 537/79/1624 559/64/1624 +f 540/10/1625 547/65/1625 558/8/1625 +f 547/65/1626 550/26/1626 559/6/1626 +f 550/26/1627 551/27/1627 559/6/1627 +f 550/98/328 547/67/328 545/68/328 +f 538/20/1628 540/65/1628 543/7/1628 +f 540/65/1629 558/25/1629 543/7/1629 +f 559/100/1630 551/26/1630 532/28/1630 +f 551/26/1631 544/19/1631 532/28/1631 +f 538/20/1632 543/7/1632 532/28/1632 +f 540/69/1633 538/98/1633 535/66/1633 +f 539/15/1634 544/5/1634 551/71/1634 +f 537/6/1635 548/27/1635 546/26/1635 +f 546/26/1636 545/65/1636 537/6/1636 +f 545/65/332 536/10/332 549/8/332 +f 542/53/1637 543/48/1637 558/73/1637 +f 549/58/334 558/94/334 540/75/334 +f 537/78/334 548/76/334 551/99/334 +f 559/27/334 558/52/334 549/51/334 +f 542/7/1638 549/25/1638 536/65/1638 +f 539/19/1639 548/26/1639 541/28/1639 +f 548/26/1640 537/100/1640 541/28/1640 +f 542/7/1641 536/65/1641 535/20/1641 +f 539/19/1642 541/28/1642 535/20/1642 +f 547/80/1643 540/69/1643 536/70/1643 +f 548/72/1644 551/71/1644 550/67/1644 +f 555/81/339 560/36/339 556/11/339 +f 554/30/1645 568/47/1645 537/83/1645 +f 557/10/1646 563/65/1646 576/8/1646 +f 563/65/1647 566/26/1647 576/8/1647 +f 576/8/1648 566/26/1648 568/6/1648 +f 562/87/342 566/85/342 563/97/342 +f 555/20/1649 557/65/1649 559/7/1649 +f 557/65/1650 576/25/1650 559/7/1650 +f 568/100/1651 567/26/1651 537/28/1651 +f 567/26/1652 560/19/1652 537/28/1652 +f 555/20/1653 559/7/1653 537/28/1653 +f 555/96/1654 552/88/1654 553/81/1654 +f 560/4/1655 567/89/1655 564/90/1655 +f 554/6/346 564/27/346 562/26/346 +f 562/26/1656 561/65/1656 565/8/1656 +f 561/65/1657 553/10/1657 565/8/1657 +f 559/41/1658 576/95/1658 565/91/1658 +f 553/93/348 565/77/348 576/99/348 +f 564/75/348 567/94/348 568/76/348 +f 554/95/349 565/91/349 576/84/349 +f 558/7/1659 565/25/1659 553/65/1659 +f 556/19/1660 564/26/1660 549/28/1660 +f 564/26/1661 554/100/1661 549/28/1661 +f 558/7/1662 553/65/1662 552/20/1662 +f 556/19/1663 549/28/1663 552/20/1663 +f 557/87/1664 553/85/1664 561/88/1664 +f 567/89/1665 566/86/1665 562/97/1665 +f 575/63/353 573/80/353 569/46/353 +f 568/55/1666 571/79/1666 584/64/1666 +f 574/10/1667 579/65/1667 590/8/1667 +f 579/65/1668 582/26/1668 590/8/1668 +f 590/8/355 582/26/355 584/6/355 +f 578/66/356 582/98/356 579/67/356 +f 572/20/1669 574/65/1669 565/7/1669 +f 574/65/1670 590/25/1670 565/7/1670 +f 584/100/1671 583/26/1671 576/28/1671 +f 583/26/1672 575/19/1672 576/28/1672 +f 572/20/1673 565/7/1673 575/19/1673 +f 574/69/1674 572/98/1674 569/66/1674 +f 573/15/1675 575/5/1675 583/71/1675 +f 571/6/360 580/27/360 578/26/360 +f 578/26/1676 577/65/1676 581/8/1676 +f 577/65/1677 570/10/1677 581/8/1677 +f 554/53/1678 565/48/1678 590/73/1678 +f 570/59/362 581/58/362 590/94/362 +f 571/78/362 580/76/362 583/99/362 +f 584/27/362 590/52/362 581/51/362 +f 554/7/1679 581/25/1679 570/65/1679 +f 573/19/1680 580/26/1680 568/28/1680 +f 580/26/1681 571/100/1681 568/28/1681 +f 554/7/1682 570/65/1682 569/20/1682 +f 573/19/1683 568/28/1683 554/7/1683 +f 579/80/1684 574/69/1684 570/70/1684 +f 580/72/366 583/71/366 582/67/366 +f 591/36/367 588/11/367 585/82/367 +f 581/84/1685 606/30/1685 599/47/1685 +f 589/10/1686 594/65/1686 596/8/1686 +f 594/65/1687 597/26/1687 596/8/1687 +f 597/26/369 598/27/369 599/6/369 +f 597/85/370 594/97/370 592/86/370 +f 587/20/1688 589/65/1688 584/7/1688 +f 589/65/1689 596/25/1689 584/7/1689 +f 599/100/1690 598/26/1690 571/28/1690 +f 598/26/1691 591/19/1691 571/28/1691 +f 587/20/1692 584/7/1692 591/19/1692 +f 589/82/1693 587/96/1693 585/88/1693 +f 588/37/1694 591/4/1694 598/89/1694 +f 606/6/1695 595/27/1695 593/26/1695 +f 593/26/1696 592/65/1696 607/8/1696 +f 592/65/1697 586/10/1697 607/8/1697 +f 590/27/1698 584/41/1698 596/95/1698 +f 586/93/376 607/77/376 596/99/376 +f 595/75/376 598/94/376 599/76/376 +f 607/91/377 596/84/377 599/83/377 +f 590/7/1699 607/25/1699 586/65/1699 +f 588/19/1700 595/26/1700 581/28/1700 +f 595/26/1701 606/100/1701 581/28/1701 +f 590/7/1702 586/65/1702 585/20/1702 +f 588/19/1703 581/28/1703 590/7/1703 +f 589/87/1704 586/85/1704 592/88/1704 +f 598/89/1705 597/86/1705 593/97/1705 +f 608/63/381 604/80/381 600/46/381 +f 599/55/1706 602/79/1706 622/64/1706 +f 605/10/1707 611/65/1707 621/8/1707 +f 611/65/1708 613/26/1708 621/8/1708 +f 621/8/383 613/26/383 622/6/383 +f 613/98/384 611/67/384 609/68/384 +f 603/20/1709 605/65/1709 607/7/1709 +f 605/65/1710 621/25/1710 607/7/1710 +f 622/100/1711 614/26/1711 596/28/1711 +f 614/26/1712 608/19/1712 596/28/1712 +f 603/20/1713 607/7/1713 608/19/1713 +f 605/69/1714 603/98/1714 600/66/1714 +f 604/15/1715 608/5/1715 614/71/1715 +f 602/6/388 612/27/388 610/26/388 +f 610/26/1716 609/65/1716 620/8/1716 +f 609/65/1717 601/10/1717 620/8/1717 +f 606/53/1718 607/48/1718 621/73/1718 +f 601/59/390 620/58/390 621/94/390 +f 602/78/390 612/76/390 614/99/390 +f 602/41/391 622/27/391 621/52/391 +f 606/7/1719 620/25/1719 601/65/1719 +f 604/19/1720 612/26/1720 599/28/1720 +f 612/26/1721 602/100/1721 599/28/1721 +f 606/7/1722 601/65/1722 600/20/1722 +f 604/19/1723 599/28/1723 606/7/1723 +f 605/69/1724 601/70/1724 609/63/1724 +f 614/71/1725 613/67/1725 610/68/1725 +f 623/36/395 618/11/395 615/82/395 +f 637/30/1726 631/47/1726 602/83/1726 +f 619/10/1727 626/65/1727 628/8/1727 +f 626/65/1728 629/26/1728 628/8/1728 +f 628/8/397 629/26/397 631/6/397 +f 629/85/398 626/97/398 624/86/398 +f 617/20/1729 619/65/1729 622/7/1729 +f 619/65/1730 628/25/1730 622/7/1730 +f 631/100/1731 630/26/1731 602/28/1731 +f 630/26/1732 623/19/1732 602/28/1732 +f 617/20/399 622/7/399 623/19/399 +f 617/96/1733 615/88/1733 616/81/1733 +f 623/4/1734 630/89/1734 627/90/1734 +f 637/6/402 627/27/402 625/26/402 +f 625/26/1735 624/65/1735 638/8/1735 +f 624/65/1736 616/10/1736 638/8/1736 +f 622/41/1737 628/95/1737 638/91/1737 +f 638/77/404 628/99/404 619/92/404 +f 627/75/404 630/94/404 631/76/404 +f 638/91/405 628/84/405 631/83/405 +f 621/7/1738 638/25/1738 616/65/1738 +f 618/19/1739 627/26/1739 620/28/1739 +f 627/26/1740 637/100/1740 620/28/1740 +f 621/7/1741 616/65/1741 615/20/1741 +f 618/19/406 620/28/406 621/7/406 +f 626/96/1742 619/87/1742 616/85/1742 +f 627/90/1743 630/89/1743 629/86/1743 +f 639/63/409 635/80/409 632/46/409 +f 655/79/1744 647/64/1744 628/29/1744 +f 636/10/411 642/65/411 644/8/411 +f 642/65/1745 645/26/1745 647/6/1745 +f 645/26/1746 646/27/1746 647/6/1746 +f 645/98/412 642/67/412 640/68/412 +f 634/20/1747 636/65/1747 638/7/1747 +f 636/65/1748 644/25/1748 638/7/1748 +f 647/100/1749 646/26/1749 628/28/1749 +f 646/26/1750 639/19/1750 628/28/1750 +f 634/20/1751 638/7/1751 639/19/1751 +f 634/98/1752 632/66/1752 633/70/1752 +f 639/5/1753 646/71/1753 643/72/1753 +f 653/8/416 655/6/416 640/65/416 +f 655/6/1754 643/27/1754 641/26/1754 +f 641/26/1755 640/65/1755 655/6/1755 +f 638/48/1756 644/73/1756 653/74/1756 +f 633/59/418 653/58/418 644/94/418 +f 643/76/418 646/99/418 647/77/418 +f 655/41/418 647/27/418 644/52/418 +f 637/7/1757 653/25/1757 633/65/1757 +f 635/19/1758 643/26/1758 631/28/1758 +f 643/26/1759 655/100/1759 631/28/1759 +f 637/7/1760 633/65/1760 632/20/1760 +f 635/19/1761 631/28/1761 637/7/1761 +f 636/69/1762 633/70/1762 640/63/1762 +f 646/71/1763 645/67/1763 641/68/1763 +f 650/81/422 654/36/422 651/11/422 +f 669/30/1764 668/47/1764 655/83/1764 +f 652/10/424 658/65/424 671/8/424 +f 658/65/424 661/26/424 671/8/424 +f 671/8/424 661/26/424 668/6/424 +f 657/87/425 661/85/425 658/97/425 +f 650/20/1765 652/65/1765 647/7/1765 +f 652/65/1766 671/25/1766 647/7/1766 +f 668/100/1767 662/26/1767 655/28/1767 +f 662/26/1768 654/19/1768 655/28/1768 +f 650/20/1769 647/7/1769 654/19/1769 +f 652/82/1770 650/96/1770 648/88/1770 +f 651/37/1771 654/4/1771 662/89/1771 +f 660/8/429 669/6/429 657/26/429 +f 669/6/429 659/27/429 657/26/429 +f 657/26/429 656/65/429 660/8/429 +f 647/41/1772 671/95/1772 660/91/1772 +f 649/93/431 660/77/431 671/99/431 +f 659/75/431 662/94/431 668/76/431 +f 669/95/432 660/91/432 671/84/432 +f 644/7/1773 660/25/1773 649/65/1773 +f 651/19/1774 659/26/1774 653/28/1774 +f 659/26/1775 669/100/1775 653/28/1775 +f 644/7/1776 649/65/1776 648/20/1776 +f 651/19/1777 653/28/1777 644/7/1777 +f 658/96/434 652/87/434 649/85/434 +f 659/90/435 662/89/435 661/86/435 +f 670/63/436 666/80/436 663/46/436 +f 687/79/1778 685/64/1778 671/29/1778 +f 667/10/438 674/65/438 677/8/438 +f 674/65/438 678/26/438 685/6/438 +f 678/26/438 679/27/438 685/6/438 +f 678/98/439 674/67/439 672/68/439 +f 665/20/1779 667/65/1779 660/7/1779 +f 667/65/1780 677/25/1780 660/7/1780 +f 685/100/1781 679/26/1781 671/28/1781 +f 679/26/1782 670/19/1782 671/28/1782 +f 665/20/1783 660/7/1783 670/19/1783 +f 667/69/1784 665/98/1784 663/66/1784 +f 666/15/1785 670/5/1785 679/71/1785 +f 687/6/443 675/27/443 673/26/443 +f 673/26/443 672/65/443 687/6/443 +f 672/65/443 664/10/443 676/8/443 +f 660/48/1786 677/73/1786 676/74/1786 +f 664/59/445 676/58/445 677/94/445 +f 687/78/445 675/76/445 679/99/445 +f 687/41/445 685/27/445 677/52/445 +f 669/7/1787 676/25/1787 664/65/1787 +f 666/19/1788 675/26/1788 668/28/1788 +f 675/26/1787 687/100/1787 668/28/1787 +f 669/7/1789 664/65/1789 663/20/1789 +f 666/19/446 668/28/446 669/7/446 +f 667/69/447 664/70/447 672/63/447 +f 679/71/1790 678/67/1790 673/68/1790 +f 686/36/449 683/11/449 680/82/449 +f 676/84/1791 700/30/1791 699/47/1791 +f 684/10/451 690/65/451 703/8/451 +f 690/65/451 692/26/451 699/6/451 +f 692/26/451 693/27/451 699/6/451 +f 692/85/452 690/97/452 688/86/452 +f 682/20/1792 684/65/1792 685/7/1792 +f 684/65/1793 703/25/1793 685/7/1793 +f 699/100/1794 693/26/1794 687/28/1794 +f 693/26/1795 686/19/1795 687/28/1795 +f 682/20/453 685/7/453 686/19/453 +f 684/82/1796 682/96/1796 680/88/1796 +f 683/37/1797 686/4/1797 693/89/1797 +f 701/8/456 700/6/456 688/65/456 +f 700/6/456 691/27/456 689/26/456 +f 689/26/456 688/65/456 700/6/456 +f 677/27/1798 685/41/1798 703/95/1798 +f 681/93/458 701/77/458 703/99/458 +f 700/78/458 691/75/458 693/94/458 +f 677/7/1799 701/25/1799 681/65/1799 +f 683/19/1800 691/26/1800 676/28/1800 +f 691/26/1801 700/100/1801 676/28/1801 +f 677/7/1802 681/65/1802 680/20/1802 +f 683/19/459 676/28/459 677/7/459 +f 684/87/460 681/85/460 688/88/460 +f 693/89/461 692/86/461 689/97/461 +f 696/35/462 702/63/462 697/80/462 +f 719/79/1803 717/64/1803 703/29/1803 +f 698/10/464 706/65/464 709/8/464 +f 706/65/464 710/26/464 717/6/464 +f 710/26/1804 711/27/1804 717/6/1804 +f 705/66/465 710/98/465 706/67/465 +f 696/20/1805 698/65/1805 701/7/1805 +f 698/65/1806 709/25/1806 701/7/1806 +f 717/100/1807 711/26/1807 703/28/1807 +f 711/26/1808 702/19/1808 703/28/1808 +f 696/20/1809 701/7/1809 703/28/1809 +f 696/98/1810 694/66/1810 695/70/1810 +f 702/5/1811 711/71/1811 707/72/1811 +f 719/6/1812 707/27/1812 705/26/1812 +f 705/26/1813 704/65/1813 719/6/1813 +f 704/65/469 695/10/469 708/8/469 +f 701/48/1814 709/73/1814 708/74/1814 +f 708/58/472 709/94/472 698/75/472 +f 707/76/472 711/99/472 717/77/472 +f 719/41/472 717/27/472 709/52/472 +f 700/7/1815 708/25/1815 695/65/1815 +f 697/19/1816 707/26/1816 699/28/1816 +f 707/26/1817 719/100/1817 699/28/1817 +f 700/7/1818 695/65/1818 694/20/1818 +f 697/19/1819 699/28/1819 694/20/1819 +f 699/73/458 703/74/458 701/64/458 +f 698/69/474 695/70/474 704/63/474 +f 711/71/475 710/67/475 705/68/475 +f 714/81/476 718/36/476 715/11/476 +f 733/30/1820 726/47/1820 719/83/1820 +f 716/10/1821 722/65/1821 736/8/1821 +f 722/65/1821 724/26/1821 726/6/1821 +f 736/8/1821 722/65/1821 726/6/1821 +f 721/87/479 724/85/479 722/97/479 +f 714/20/1822 716/65/1822 717/7/1822 +f 716/65/1823 736/25/1823 717/7/1823 +f 726/100/1824 725/26/1824 719/28/1824 +f 725/26/1825 718/19/1825 719/28/1825 +f 714/20/1826 717/7/1826 719/28/1826 +f 714/96/1827 712/88/1827 713/81/1827 +f 718/4/1828 725/89/1828 723/90/1828 +f 733/6/483 723/27/483 721/26/483 +f 721/26/1829 720/65/1829 733/6/1829 +f 720/65/483 713/10/483 734/8/483 +f 717/41/1830 736/95/1830 734/91/1830 +f 734/77/485 736/99/485 716/92/485 +f 733/78/485 723/75/485 725/94/485 +f 733/95/486 734/91/486 736/84/486 +f 709/7/1831 734/25/1831 713/65/1831 +f 715/19/1832 723/26/1832 708/28/1832 +f 723/26/1833 733/100/1833 708/28/1833 +f 709/7/1834 713/65/1834 712/20/1834 +f 715/19/1835 708/28/1835 712/20/1835 +f 716/87/488 713/85/488 720/88/488 +f 725/89/489 724/86/489 721/97/489 +f 730/35/490 735/63/490 731/80/490 +f 726/55/1836 729/79/1836 750/64/1836 +f 732/10/1837 739/65/1837 742/8/1837 +f 739/65/1838 743/26/1838 742/8/1838 +f 742/8/492 743/26/492 750/6/492 +f 743/98/493 739/67/493 737/68/493 +f 730/20/1839 732/65/1839 734/7/1839 +f 732/65/1840 742/25/1840 734/7/1840 +f 750/100/1841 744/26/1841 736/28/1841 +f 744/26/1842 735/19/1842 736/28/1842 +f 730/20/1843 734/7/1843 736/28/1843 +f 732/69/1844 730/98/1844 727/66/1844 +f 731/15/1845 735/5/1845 744/71/1845 +f 729/6/497 740/27/497 738/26/497 +f 738/26/1846 737/65/1846 741/8/1846 +f 737/65/1847 728/10/1847 741/8/1847 +f 733/53/1848 734/48/1848 742/73/1848 +f 741/58/499 742/94/499 732/75/499 +f 740/76/499 744/99/499 750/77/499 +f 729/41/499 750/27/499 742/52/499 +f 733/7/1849 741/25/1849 728/65/1849 +f 731/19/1850 740/26/1850 726/28/1850 +f 740/26/1851 729/100/1851 726/28/1851 +f 733/7/1852 728/65/1852 727/20/1852 +f 731/19/1853 726/28/1853 727/20/1853 +f 739/80/1854 732/69/1854 728/70/1854 +f 740/72/1855 744/71/1855 743/67/1855 +f 747/81/505 751/36/505 748/11/505 +f 741/84/1856 765/30/1856 764/47/1856 +f 749/10/1857 754/65/1857 768/8/1857 +f 754/65/1858 756/26/1858 768/8/1858 +f 768/8/507 756/26/507 764/6/507 +f 753/87/508 756/85/508 754/97/508 +f 747/20/1859 749/65/1859 750/7/1859 +f 749/65/1860 768/25/1860 750/7/1860 +f 764/100/1861 757/26/1861 729/28/1861 +f 757/26/1862 751/19/1862 729/28/1862 +f 747/20/1863 750/7/1863 751/19/1863 +f 749/82/1864 747/96/1864 745/88/1864 +f 748/37/1865 751/4/1865 757/89/1865 +f 765/6/512 755/27/512 753/26/512 +f 753/26/1866 752/65/1866 766/8/1866 +f 752/65/1866 746/10/1866 766/8/1866 +f 742/27/1867 750/41/1867 768/95/1867 +f 746/93/514 766/77/514 768/99/514 +f 765/78/514 755/75/514 757/94/514 +f 742/7/1868 766/25/1868 746/65/1868 +f 748/19/1869 755/26/1869 741/28/1869 +f 755/26/1870 765/100/1870 741/28/1870 +f 742/7/1871 746/65/1871 745/20/1871 +f 748/19/1872 741/28/1872 742/7/1872 +f 754/96/1873 749/87/1873 746/85/1873 +f 755/90/1874 757/89/1874 756/86/1874 +f 767/63/518 762/80/518 758/46/518 +f 760/79/1875 783/64/1875 768/29/1875 +f 763/10/1876 771/65/1876 782/8/1876 +f 771/65/1877 774/26/1877 782/8/1877 +f 782/8/520 774/26/520 783/6/520 +f 770/66/521 774/98/521 771/67/521 +f 761/20/1878 763/65/1878 766/7/1878 +f 763/65/1879 782/25/1879 766/7/1879 +f 783/100/1880 775/26/1880 768/28/1880 +f 775/26/1881 767/19/1881 768/28/1881 +f 761/20/1882 766/7/1882 767/19/1882 +f 761/98/1883 758/66/1883 759/70/1883 +f 767/5/1884 775/71/1884 772/72/1884 +f 760/6/525 772/27/525 770/26/525 +f 770/26/1885 769/65/1885 773/8/1885 +f 769/65/1886 759/10/1886 773/8/1886 +f 766/48/1887 782/73/1887 773/74/1887 +f 759/59/527 773/58/527 782/94/527 +f 772/76/527 775/99/527 783/77/527 +f 760/41/528 783/27/528 782/52/528 +f 765/7/1888 773/25/1888 759/65/1888 +f 762/19/1889 772/26/1889 764/28/1889 +f 772/26/1890 760/100/1890 764/28/1890 +f 765/7/1891 759/65/1891 758/20/1891 +f 762/19/1892 764/28/1892 758/20/1892 +f 768/74/514 766/64/514 765/79/514 +f 771/80/1893 763/69/1893 759/70/1893 +f 772/72/1894 775/71/1894 774/67/1894 +f 784/36/532 780/11/532 776/82/532 +f 778/30/1895 796/47/1895 760/83/1895 +f 781/10/1896 787/65/1896 799/8/1896 +f 787/65/1897 789/26/1897 799/8/1897 +f 789/26/1898 790/27/1898 796/6/1898 +f 789/85/535 787/97/535 785/86/535 +f 779/20/1899 781/65/1899 783/7/1899 +f 781/65/1900 799/25/1900 783/7/1900 +f 796/100/1901 790/26/1901 760/28/1901 +f 790/26/1902 784/19/1902 760/28/1902 +f 779/20/1903 783/7/1903 784/19/1903 +f 779/96/1904 776/88/1904 777/81/1904 +f 784/4/1905 790/89/1905 788/90/1905 +f 797/8/1906 778/6/1906 786/26/1906 +f 778/6/1906 788/27/1906 786/26/1906 +f 786/26/1907 785/65/1907 797/8/1907 +f 783/41/1908 799/95/1908 797/91/1908 +f 777/93/541 797/77/541 799/99/541 +f 778/78/541 788/75/541 790/94/541 +f 797/91/542 799/84/542 796/83/542 +f 782/7/1909 797/25/1909 777/65/1909 +f 780/19/1910 788/26/1910 773/28/1910 +f 788/26/1911 778/100/1911 773/28/1911 +f 782/7/1912 777/65/1912 776/20/1912 +f 780/19/1913 773/28/1913 782/7/1913 +f 781/87/1914 777/85/1914 785/88/1914 +f 790/89/1915 789/86/1915 786/97/1915 +f 798/63/546 794/80/546 791/46/546 +f 815/79/1916 813/64/1916 799/29/1916 +f 795/10/1917 802/65/1917 812/8/1917 +f 802/65/1918 804/26/1918 812/8/1918 +f 804/26/548 805/27/548 813/6/548 +f 801/66/549 804/98/549 802/67/549 +f 793/20/1919 795/65/1919 797/7/1919 +f 795/65/1920 812/25/1920 797/7/1920 +f 813/100/1921 805/26/1921 799/28/1921 +f 805/26/1922 798/19/1922 799/28/1922 +f 793/20/1923 797/7/1923 798/19/1923 +f 795/69/1924 793/98/1924 791/66/1924 +f 794/15/1925 798/5/1925 805/71/1925 +f 815/6/553 803/27/553 801/26/553 +f 801/26/1926 800/65/1926 811/8/1926 +f 800/65/1927 792/10/1927 811/8/1927 +f 797/48/554 812/73/554 811/74/554 +f 792/59/555 811/58/555 812/94/555 +f 815/78/555 803/76/555 805/99/555 +f 778/7/1928 811/25/1928 792/65/1928 +f 794/19/1929 803/26/1929 796/28/1929 +f 803/26/1930 815/100/1930 796/28/1930 +f 778/7/1931 792/65/1931 791/20/1931 +f 794/19/1932 796/28/1932 778/7/1932 +f 795/69/1933 792/70/1933 800/63/1933 +f 805/71/1934 804/67/1934 801/68/1934 +f 808/81/559 814/36/559 809/11/559 +f 811/84/1935 830/30/1935 823/47/1935 +f 810/10/561 818/65/561 832/8/561 +f 818/65/1936 821/26/1936 823/6/1936 +f 821/26/1937 822/27/1937 823/6/1937 +f 821/85/562 818/97/562 816/86/562 +f 808/20/1938 810/65/1938 813/7/1938 +f 810/65/1939 832/25/1939 813/7/1939 +f 823/100/1940 822/26/1940 815/28/1940 +f 822/26/1941 814/19/1941 815/28/1941 +f 808/20/1942 813/7/1942 814/19/1942 +f 810/82/1943 808/96/1943 806/88/1943 +f 809/37/1944 814/4/1944 822/89/1944 +f 830/6/1945 819/27/1945 817/26/1945 +f 817/26/1946 816/65/1946 830/6/1946 +f 816/65/566 807/10/566 820/8/566 +f 812/27/1947 813/41/1947 832/95/1947 +f 820/77/568 832/99/568 810/92/568 +f 830/78/568 819/75/568 822/94/568 +f 830/95/569 820/91/569 832/84/569 +f 812/7/1948 820/25/1948 807/65/1948 +f 809/19/1949 819/26/1949 811/28/1949 +f 819/26/1950 830/100/1950 811/28/1950 +f 812/7/1951 807/65/1951 806/20/1951 +f 809/19/1952 811/28/1952 812/7/1952 +f 815/33/555 813/58/555 812/59/555 +f 810/87/1953 807/85/1953 816/88/1953 +f 822/89/1954 821/86/1954 817/97/1954 +f 831/63/1955 828/80/1955 824/46/1955 +f 823/55/1956 826/79/1956 839/64/1956 +f 829/10/1957 835/65/1957 847/8/1957 +f 835/65/1958 837/26/1958 847/8/1958 +f 847/8/575 837/26/575 839/6/575 +f 837/98/1959 835/67/1959 833/68/1959 +f 827/20/1960 829/65/1960 820/7/1960 +f 829/65/1961 847/25/1961 820/7/1961 +f 839/100/1962 838/26/1962 832/28/1962 +f 838/26/1963 831/19/1963 832/28/1963 +f 827/20/577 820/7/577 831/19/577 +f 829/69/1964 827/98/1964 824/66/1964 +f 828/15/1965 831/5/1965 838/71/1965 +f 826/6/580 836/27/580 834/26/580 +f 834/26/1966 833/65/1966 846/8/1966 +f 833/65/1967 825/10/1967 846/8/1967 +f 830/53/1968 820/48/1968 847/73/1968 +f 846/58/582 847/94/582 829/75/582 +f 826/78/582 836/76/582 838/99/582 +f 839/27/582 847/52/582 846/51/582 +f 830/7/1969 846/25/1969 825/65/1969 +f 828/19/1970 836/26/1970 823/28/1970 +f 836/26/1971 826/100/1971 823/28/1971 +f 830/7/1972 825/65/1972 824/20/1972 +f 828/19/583 823/28/583 830/7/583 +f 835/80/1973 829/69/1973 825/70/1973 +f 836/72/1974 838/71/1974 837/67/1974 +f 848/36/586 844/11/586 840/82/586 +f 846/84/1975 842/30/1975 860/47/1975 +f 845/10/1976 851/65/1976 863/8/1976 +f 851/65/1977 853/26/1977 863/8/1977 +f 863/8/588 853/26/588 860/6/588 +f 850/87/589 853/85/589 851/97/589 +f 843/20/1978 845/65/1978 839/7/1978 +f 845/65/1979 863/25/1979 839/7/1979 +f 860/100/1980 854/26/1980 826/28/1980 +f 854/26/1981 848/19/1981 826/28/1981 +f 843/20/1982 839/7/1982 848/19/1982 +f 843/96/1983 840/88/1983 841/81/1983 +f 844/37/1984 848/4/1984 854/89/1984 +f 842/6/593 852/27/593 850/26/593 +f 850/26/1985 849/65/1985 861/8/1985 +f 849/65/1986 841/10/1986 861/8/1986 +f 847/27/1987 839/41/1987 863/95/1987 +f 861/77/595 863/99/595 845/92/595 +f 852/75/595 854/94/595 860/76/595 +f 861/91/596 863/84/596 860/83/596 +f 847/7/1988 861/25/1988 841/65/1988 +f 844/19/1989 852/26/1989 846/28/1989 +f 852/26/1990 842/100/1990 846/28/1990 +f 847/7/1991 841/65/1991 840/20/1991 +f 844/19/1992 846/28/1992 847/7/1992 +f 851/96/1993 845/87/1993 841/85/1993 +f 852/90/1994 854/89/1994 853/86/1994 +f 857/35/600 862/63/600 858/80/600 +f 880/79/1995 878/64/1995 863/29/1995 +f 859/10/1996 866/65/1996 877/8/1996 +f 866/65/1997 869/26/1997 878/6/1997 +f 877/8/1996 866/65/1996 878/6/1996 +f 865/66/603 869/98/603 866/67/603 +f 857/20/1998 859/65/1998 861/7/1998 +f 859/65/1999 877/25/1999 861/7/1999 +f 878/100/2000 870/26/2000 863/28/2000 +f 870/26/2001 862/19/2001 863/28/2001 +f 857/20/2002 861/7/2002 862/19/2002 +f 857/98/2003 855/66/2003 856/70/2003 +f 862/5/2004 870/71/2004 867/72/2004 +f 880/6/2005 867/27/2005 865/26/2005 +f 865/26/2006 864/65/2006 880/6/2006 +f 864/65/607 856/10/607 868/8/607 +f 861/48/2007 877/73/2007 868/74/2007 +f 868/58/609 877/94/609 859/75/609 +f 880/78/609 867/76/609 870/99/609 +f 880/41/609 878/27/609 877/52/609 +f 842/7/2008 868/25/2008 856/65/2008 +f 858/19/2009 867/26/2009 860/28/2009 +f 867/26/2010 880/100/2010 860/28/2010 +f 842/7/2011 856/65/2011 855/20/2011 +f 858/19/2012 860/28/2012 842/7/2012 +f 866/80/2013 859/69/2013 856/70/2013 +f 867/72/2014 870/71/2014 869/67/2014 +f 874/81/613 879/36/613 875/11/613 +f 873/30/1997 889/47/1997 880/83/1997 +f 876/10/615 883/65/615 886/8/615 +f 883/65/615 887/26/615 889/6/615 +f 887/26/615 888/27/615 889/6/615 +f 882/87/603 887/85/603 883/97/603 +f 874/20/2015 876/65/2015 878/7/2015 +f 876/65/2016 886/25/2016 878/7/2016 +f 889/100/2017 888/26/2017 880/28/2017 +f 888/26/2018 879/19/2018 880/28/2018 +f 874/20/2019 878/7/2019 879/19/2019 +f 874/96/2020 871/88/2020 872/81/2020 +f 879/4/2021 888/89/2021 884/90/2021 +f 873/6/619 884/27/619 882/26/619 +f 882/26/619 881/65/619 873/6/619 +f 881/65/619 872/10/619 885/8/619 +f 878/41/623 886/95/623 885/91/623 +f 872/93/603 885/77/603 886/99/603 +f 884/75/603 888/94/603 889/76/603 +f 885/91/621 886/84/621 889/83/621 +f 877/7/2022 885/25/2022 872/65/2022 +f 875/19/2023 884/26/2023 868/28/2023 +f 884/26/2024 873/100/2024 868/28/2024 +f 877/7/2025 872/65/2025 871/20/2025 +f 875/19/2026 868/28/2026 877/7/2026 +f 876/87/617 872/85/617 881/88/617 +f 888/89/623 887/86/623 882/97/623 +f 890/46/624 893/80/624 898/63/624 +f 895/55/625 899/29/625 914/64/625 +f 905/26/626 902/65/626 914/6/626 +f 902/65/626 894/10/626 904/8/626 +f 914/6/626 902/65/626 904/8/626 +f 900/68/627 902/67/627 905/98/627 +f 898/19/626 906/26/626 899/28/626 +f 906/26/626 914/100/626 899/28/626 +f 904/25/626 894/65/626 897/7/626 +f 894/65/626 892/20/626 897/7/626 +f 898/19/626 899/28/626 897/7/626 +f 894/69/625 891/70/625 890/66/625 +f 893/15/628 903/72/628 906/71/628 +f 916/6/629 913/8/629 900/65/629 +f 913/8/629 891/10/629 900/65/629 +f 900/65/629 901/26/629 916/6/629 +f 896/53/628 913/74/628 904/73/628 +f 891/59/630 894/75/630 904/94/630 +f 914/77/630 906/99/630 903/76/630 +f 913/51/630 904/52/630 914/27/630 +f 891/65/629 913/25/629 896/7/629 +f 895/28/629 916/100/629 903/26/629 +f 890/20/629 891/65/629 896/7/629 +f 895/28/629 903/26/629 893/19/629 +f 890/20/629 896/7/629 893/19/629 +f 896/79/630 897/64/630 899/74/630 +f 902/80/631 900/63/631 891/70/631 +f 903/72/2027 901/68/2027 905/67/2027 +f 910/81/624 907/82/624 911/11/624 +f 916/83/2028 928/47/2028 909/30/2028 +f 921/26/634 919/65/634 931/8/634 +f 919/65/634 912/10/634 931/8/634 +f 921/26/634 931/8/634 928/6/634 +f 918/87/635 917/86/635 919/97/635 +f 915/19/2029 922/26/2029 916/28/2029 +f 922/26/2030 928/100/2030 916/28/2030 +f 931/25/2030 912/65/2030 914/7/2030 +f 912/65/2031 910/20/2031 914/7/2031 +f 915/19/628 916/28/628 914/7/628 +f 912/82/636 908/81/636 907/88/636 +f 911/37/637 920/90/637 922/89/637 +f 909/6/638 929/8/638 918/26/638 +f 929/8/638 908/10/638 917/65/638 +f 917/65/638 918/26/638 929/8/638 +f 929/91/2032 931/95/2032 914/41/2032 +f 908/93/640 912/92/640 931/99/640 +f 909/78/640 928/76/640 922/94/640 +f 909/95/641 928/83/641 931/84/641 +f 908/65/2033 929/25/2033 904/7/2033 +f 913/28/2034 909/100/2034 920/26/2034 +f 907/20/2035 908/65/2035 904/7/2035 +f 913/28/2036 920/26/2036 911/19/2036 +f 907/20/625 904/7/625 911/19/625 +f 917/88/642 908/85/642 912/87/642 +f 918/97/643 921/86/643 922/89/643 +f 925/35/644 923/46/644 926/80/644 +f 928/55/2037 931/29/2037 938/64/2037 +f 936/26/646 934/65/646 945/8/646 +f 934/65/646 927/10/646 945/8/646 +f 936/26/646 945/8/646 938/6/646 +f 932/68/647 934/67/647 936/98/647 +f 930/19/2038 937/26/2038 931/28/2038 +f 937/26/2039 938/100/2039 931/28/2039 +f 945/25/2039 927/65/2039 929/7/2039 +f 927/65/2040 925/20/2040 929/7/2040 +f 930/19/648 931/28/648 925/20/648 +f 927/69/2041 924/70/2041 923/66/2041 +f 926/15/2042 935/72/2042 937/71/2042 +f 947/6/651 944/8/651 933/26/651 +f 944/8/651 924/10/651 932/65/651 +f 932/65/651 933/26/651 944/8/651 +f 909/53/2043 944/74/2043 945/73/2043 +f 924/59/653 927/75/653 945/94/653 +f 947/78/653 938/77/653 937/99/653 +f 947/41/653 944/51/653 945/52/653 +f 924/65/2044 944/25/2044 909/7/2044 +f 928/28/2044 947/100/2044 935/26/2044 +f 923/20/2045 924/65/2045 909/7/2045 +f 928/28/2046 935/26/2046 926/19/2046 +f 923/20/654 909/7/654 928/28/654 +f 932/63/655 924/70/655 927/69/655 +f 933/68/656 936/67/656 937/71/656 +f 939/82/657 942/11/657 946/36/657 +f 944/84/2047 947/83/2047 956/47/2047 +f 954/26/2048 950/65/2048 956/6/2048 +f 950/65/2049 943/10/2049 953/8/2049 +f 956/6/2050 950/65/2050 953/8/2050 +f 949/87/660 948/86/660 950/97/660 +f 946/19/2051 955/26/2051 947/28/2051 +f 955/26/2052 956/100/2052 947/28/2052 +f 953/25/2053 943/65/2053 938/7/2053 +f 943/65/2054 941/20/2054 938/7/2054 +f 946/19/2055 947/28/2055 938/7/2055 +f 943/82/2056 940/81/2056 939/88/2056 +f 942/37/2057 951/90/2057 955/89/2057 +f 963/6/2058 952/8/2058 948/65/2058 +f 952/8/2058 940/10/2058 948/65/2058 +f 948/65/2059 949/26/2059 963/6/2059 +f 945/27/2060 952/91/2060 953/95/2060 +f 943/92/666 953/99/666 952/77/666 +f 963/78/666 956/76/666 955/94/666 +f 956/83/667 953/84/667 952/91/667 +f 940/65/2061 952/25/2061 945/7/2061 +f 944/28/2062 963/100/2062 951/26/2062 +f 939/20/2063 940/65/2063 945/7/2063 +f 944/28/2064 951/26/2064 942/19/2064 +f 939/20/668 945/7/668 942/19/668 +f 948/88/2065 940/85/2065 943/87/2065 +f 949/97/2066 954/86/2066 955/89/2066 +f 957/46/671 961/80/671 964/63/671 +f 956/55/2067 953/29/2067 971/64/2067 +f 969/26/2068 967/65/2068 979/8/2068 +f 967/65/2069 962/10/2069 979/8/2069 +f 969/26/673 979/8/673 971/6/673 +f 965/68/674 967/67/674 969/98/674 +f 964/19/2070 970/26/2070 953/28/2070 +f 970/26/2071 971/100/2071 953/28/2071 +f 979/25/2072 962/65/2072 952/7/2072 +f 962/65/2073 960/20/2073 952/7/2073 +f 964/19/2074 953/28/2074 960/20/2074 +f 962/69/2075 958/70/2075 957/66/2075 +f 961/15/2076 968/72/2076 970/71/2076 +f 959/6/678 978/8/678 966/26/678 +f 978/8/2077 958/10/2077 965/65/2077 +f 965/65/2078 966/26/2078 978/8/2078 +f 963/53/2079 978/74/2079 979/73/2079 +f 962/75/680 979/94/680 978/58/680 +f 971/77/680 970/99/680 968/76/680 +f 978/51/680 979/52/680 971/27/680 +f 958/65/2080 978/25/2080 963/7/2080 +f 956/28/2081 959/100/2081 968/26/2081 +f 957/20/2082 958/65/2082 963/7/2082 +f 956/28/2083 968/26/2083 961/19/2083 +f 957/20/2084 963/7/2084 956/28/2084 +f 967/80/2085 965/63/2085 958/70/2085 +f 968/72/2086 966/68/2086 969/67/2086 +f 975/81/684 972/82/684 976/11/684 +f 959/83/2087 989/47/2087 974/30/2087 +f 987/26/2088 983/65/2088 986/8/2088 +f 983/65/2089 977/10/2089 986/8/2089 +f 987/26/686 986/8/686 989/6/686 +f 982/87/687 981/86/687 983/97/687 +f 980/19/2090 988/26/2090 959/28/2090 +f 988/26/2091 989/100/2091 959/28/2091 +f 986/25/2092 977/65/2092 971/7/2092 +f 977/65/2093 975/20/2093 971/7/2093 +f 980/19/2094 959/28/2094 971/7/2094 +f 973/81/2095 972/88/2095 975/96/2095 +f 984/90/2096 988/89/2096 980/4/2096 +f 974/6/691 985/8/691 982/26/691 +f 985/8/2097 973/10/2097 981/65/2097 +f 981/65/2098 982/26/2098 985/8/2098 +f 985/91/2099 986/95/2099 971/41/2099 +f 973/93/693 977/92/693 986/99/693 +f 974/78/693 989/76/693 988/94/693 +f 974/95/694 989/83/694 986/84/694 +f 973/65/2100 985/25/2100 979/7/2100 +f 978/28/2101 974/100/2101 984/26/2101 +f 972/20/2102 973/65/2102 979/7/2102 +f 978/28/2103 984/26/2103 976/19/2103 +f 972/20/2104 979/7/2104 976/19/2104 +f 983/96/2105 981/88/2105 973/85/2105 +f 984/90/2106 982/97/2106 987/86/2106 +f 990/46/698 993/80/698 995/63/698 +f 986/29/699 1003/64/699 1011/79/699 +f 1001/26/2107 998/65/2107 1000/8/2107 +f 998/65/2108 994/10/2108 1000/8/2108 +f 1000/8/700 1003/6/700 1001/26/700 +f 996/68/701 998/67/701 1001/98/701 +f 995/19/2109 1002/26/2109 986/28/2109 +f 1002/26/2110 1003/100/2110 986/28/2110 +f 1000/25/2111 994/65/2111 985/7/2111 +f 994/65/2112 992/20/2112 985/7/2112 +f 995/19/2113 986/28/2113 985/7/2113 +f 994/69/2114 991/70/2114 990/66/2114 +f 999/72/2115 1002/71/2115 995/5/2115 +f 999/27/2116 1011/6/2116 997/26/2116 +f 1011/6/2116 1009/8/2116 997/26/2116 +f 1009/8/2117 991/10/2117 996/65/2117 +f 974/53/2118 1009/74/2118 1000/73/2118 +f 994/75/707 1000/94/707 1009/58/707 +f 1003/77/707 1002/99/707 999/76/707 +f 1011/41/707 1009/51/707 1000/52/707 +f 991/65/2119 1009/25/2119 974/7/2119 +f 989/28/2120 1011/100/2120 999/26/2120 +f 990/20/2121 991/65/2121 974/7/2121 +f 989/28/2122 999/26/2122 993/19/2122 +f 990/20/2123 974/7/2123 993/19/2123 +f 996/63/2124 991/70/2124 994/69/2124 +f 997/68/2125 1001/67/2125 1002/71/2125 +f 1004/82/711 1007/11/711 1010/36/711 +f 1009/84/2126 1011/83/2126 1018/47/2126 +f 1016/26/2127 1014/65/2127 1028/8/2127 +f 1014/65/2127 1008/10/2127 1028/8/2127 +f 1028/8/713 1018/6/713 1016/26/713 +f 1012/86/714 1014/97/714 1016/85/714 +f 1010/19/2128 1017/26/2128 1011/28/2128 +f 1017/26/2129 1018/100/2129 1011/28/2129 +f 1028/25/2130 1008/65/2130 1003/7/2130 +f 1008/65/2131 1006/20/2131 1003/7/2131 +f 1010/19/2132 1011/28/2132 1003/7/2132 +f 1008/82/2133 1005/81/2133 1004/88/2133 +f 1007/37/2134 1015/90/2134 1017/89/2134 +f 1026/8/718 1005/10/718 1012/65/718 +f 1012/65/718 1013/26/718 1026/8/718 +f 1013/26/718 1015/27/718 1025/6/718 +f 1000/27/2135 1026/91/2135 1028/95/2135 +f 1005/93/720 1008/92/720 1028/99/720 +f 1025/78/2136 1018/76/2136 1017/94/2136 +f 1025/95/721 1018/83/721 1028/84/721 +f 1005/65/2137 1026/25/2137 1000/7/2137 +f 1009/28/2138 1025/100/2138 1015/26/2138 +f 1004/20/2139 1005/65/2139 1000/7/2139 +f 1009/28/2140 1015/26/2140 1007/19/2140 +f 1004/20/2141 1000/7/2141 1007/19/2141 +f 1014/96/723 1012/88/723 1005/85/723 +f 1015/90/724 1013/97/724 1016/86/724 +f 1022/35/725 1019/46/725 1023/80/725 +f 1028/29/2142 1042/64/2142 1021/79/2142 +f 1035/26/2143 1031/65/2143 1042/6/2143 +f 1031/65/2144 1024/10/2144 1034/8/2144 +f 1034/8/2144 1042/6/2144 1031/65/2144 +f 1029/68/728 1031/67/728 1035/98/728 +f 1027/19/2145 1036/26/2145 1028/28/2145 +f 1036/26/2146 1042/100/2146 1028/28/2146 +f 1034/25/2147 1024/65/2147 1026/7/2147 +f 1024/65/2148 1022/20/2148 1026/7/2148 +f 1027/19/2149 1028/28/2149 1026/7/2149 +f 1020/70/2150 1019/66/2150 1022/98/2150 +f 1032/72/2151 1036/71/2151 1027/5/2151 +f 1021/6/2152 1033/8/2152 1029/65/2152 +f 1033/8/2152 1020/10/2152 1029/65/2152 +f 1029/65/2153 1030/26/2153 1021/6/2153 +f 1033/74/2154 1034/73/2154 1026/48/2154 +f 1024/75/734 1034/94/734 1033/58/734 +f 1042/77/734 1036/99/734 1032/76/734 +f 1021/41/734 1033/51/734 1034/52/734 +f 1020/65/2155 1033/25/2155 1025/7/2155 +f 1018/28/2156 1021/100/2156 1032/26/2156 +f 1019/20/2157 1020/65/2157 1025/7/2157 +f 1018/28/2158 1032/26/2158 1023/19/2158 +f 1019/20/2159 1025/7/2159 1023/19/2159 +f 1031/80/2160 1029/63/2160 1020/70/2160 +f 1032/72/2161 1030/68/2161 1035/67/2161 +f 1039/81/738 1037/82/738 1040/11/738 +f 1021/83/2162 1056/47/2162 1057/30/2162 +f 1048/26/740 1046/65/740 1060/8/740 +f 1046/65/740 1041/10/740 1060/8/740 +f 1056/6/740 1049/27/740 1048/26/740 +f 1045/87/741 1044/86/741 1046/97/741 +f 1043/19/2163 1049/26/2163 1021/28/2163 +f 1049/26/2164 1056/100/2164 1021/28/2164 +f 1060/25/2165 1041/65/2165 1042/7/2165 +f 1041/65/2166 1039/20/2166 1042/7/2166 +f 1043/19/742 1021/28/742 1039/20/742 +f 1038/81/2167 1037/88/2167 1039/96/2167 +f 1047/90/2168 1049/89/2168 1043/4/2168 +f 1057/6/745 1058/8/745 1045/26/745 +f 1058/8/745 1038/10/745 1044/65/745 +f 1044/65/745 1045/26/745 1058/8/745 +f 1058/91/2169 1060/95/2169 1042/41/2169 +f 1038/93/747 1041/92/747 1060/99/747 +f 1056/76/747 1049/94/747 1047/75/747 +f 1038/65/2170 1058/25/2170 1034/7/2170 +f 1033/28/2171 1057/100/2171 1047/26/2171 +f 1037/20/2172 1038/65/2172 1034/7/2172 +f 1033/28/2173 1047/26/2173 1040/19/2173 +f 1037/20/748 1034/7/748 1033/28/748 +f 1046/96/749 1044/88/749 1038/85/749 +f 1047/90/750 1045/97/750 1048/86/750 +f 1050/46/751 1054/80/751 1059/63/751 +f 1060/29/752 1069/64/752 1052/79/752 +f 1067/26/753 1063/65/753 1069/6/753 +f 1063/65/753 1055/10/753 1066/8/753 +f 1069/6/753 1063/65/753 1066/8/753 +f 1061/68/754 1063/67/754 1067/98/754 +f 1059/19/2174 1068/26/2174 1060/28/2174 +f 1068/26/2175 1069/100/2175 1060/28/2175 +f 1066/25/2175 1055/65/2175 1058/7/2175 +f 1055/65/2176 1053/20/2176 1058/7/2176 +f 1059/19/755 1060/28/755 1058/7/755 +f 1051/70/756 1050/66/756 1053/98/756 +f 1064/72/757 1068/71/757 1059/5/757 +f 1052/6/758 1065/8/758 1061/65/758 +f 1065/8/758 1051/10/758 1061/65/758 +f 1061/65/758 1062/26/758 1052/6/758 +f 1065/74/759 1066/73/759 1058/48/759 +f 1051/59/760 1055/75/760 1066/94/760 +f 1069/77/760 1068/99/760 1064/76/760 +f 1052/41/760 1065/51/760 1066/52/760 +f 1051/65/2177 1065/25/2177 1057/7/2177 +f 1056/28/2177 1052/100/2177 1064/26/2177 +f 1050/20/2178 1051/65/2178 1057/7/2178 +f 1056/28/2179 1064/26/2179 1054/19/2179 +f 1050/20/761 1057/7/761 1054/19/761 +f 1057/79/747 1058/64/747 1060/74/747 +f 1061/63/762 1051/70/762 1055/69/762 +f 1062/68/763 1067/67/763 1068/71/763 +f 1070/82/764 1074/11/764 1076/36/764 +f 1052/83/765 1085/47/765 1072/30/765 +f 1083/26/766 1079/65/766 1082/8/766 +f 1079/65/766 1075/10/766 1082/8/766 +f 1083/26/766 1082/8/766 1085/6/766 +f 1077/86/767 1079/97/767 1083/85/767 +f 1076/19/2180 1084/26/2180 1052/28/2180 +f 1084/26/2181 1085/100/2181 1052/28/2181 +f 1082/25/2181 1075/65/2181 1069/7/2181 +f 1075/65/2182 1073/20/2182 1069/7/2182 +f 1076/19/768 1052/28/768 1073/20/768 +f 1075/82/753 1071/81/753 1070/88/753 +f 1074/37/758 1080/90/758 1084/89/758 +f 1072/6/769 1081/8/769 1078/26/769 +f 1081/8/769 1071/10/769 1077/65/769 +f 1077/65/769 1078/26/769 1081/8/769 +f 1081/91/770 1082/95/770 1069/41/770 +f 1071/93/771 1075/92/771 1082/99/771 +f 1072/78/771 1085/76/771 1084/94/771 +f 1072/95/772 1085/83/772 1082/84/772 +f 1071/65/2183 1081/25/2183 1066/7/2183 +f 1065/28/2183 1072/100/2183 1080/26/2183 +f 1070/20/2184 1071/65/2184 1066/7/2184 +f 1065/28/2185 1080/26/2185 1074/19/2185 +f 1070/20/773 1066/7/773 1065/28/773 +f 1077/88/774 1071/85/774 1075/87/774 +f 1078/97/775 1083/86/775 1084/89/775 +f 1089/35/776 1086/46/776 1090/80/776 +f 1082/29/2186 1107/64/2186 1088/79/2186 +f 1098/26/778 1095/65/778 1107/6/778 +f 1095/65/778 1091/10/778 1106/8/778 +f 1106/8/778 1107/6/778 1095/65/778 +f 1093/68/779 1095/67/779 1098/98/779 +f 1092/19/2187 1099/26/2187 1082/28/2187 +f 1099/26/2188 1107/100/2188 1082/28/2188 +f 1106/25/2188 1091/65/2188 1081/7/2188 +f 1091/65/2189 1089/20/2189 1081/7/2189 +f 1092/19/753 1082/28/753 1089/20/753 +f 1087/70/780 1086/66/780 1089/98/780 +f 1096/72/2190 1099/71/2190 1092/5/2190 +f 1088/6/2191 1097/8/2191 1093/65/2191 +f 1097/8/2191 1087/10/2191 1093/65/2191 +f 1093/65/2191 1094/26/2191 1088/6/2191 +f 1097/74/2192 1106/73/2192 1081/48/2192 +f 1091/75/784 1106/94/784 1097/58/784 +f 1107/77/784 1099/99/784 1096/76/784 +f 1088/41/784 1097/51/784 1106/52/784 +f 1087/65/2193 1097/25/2193 1072/7/2193 +f 1085/28/2194 1088/100/2194 1096/26/2194 +f 1086/20/2195 1087/65/2195 1072/7/2195 +f 1085/28/2196 1096/26/2196 1090/19/2196 +f 1086/20/758 1072/7/758 1085/28/758 +f 1093/63/2197 1087/70/2197 1091/69/2197 +f 1094/68/2198 1098/67/2198 1099/71/2198 +f 1103/81/787 1100/82/787 1104/11/787 +f 1097/84/2199 1088/83/2199 1116/47/2199 +f 1114/26/789 1111/65/789 1116/6/789 +f 1111/65/2200 1105/10/2200 1113/8/2200 +f 1116/6/2200 1111/65/2200 1113/8/2200 +f 1109/86/790 1111/97/790 1114/85/790 +f 1108/19/2201 1115/26/2201 1088/28/2201 +f 1115/26/2202 1116/100/2202 1088/28/2202 +f 1113/25/2203 1105/65/2203 1107/7/2203 +f 1105/65/2204 1103/20/2204 1107/7/2204 +f 1108/19/2205 1088/28/2205 1103/20/2205 +f 1105/82/2206 1101/81/2206 1100/88/2206 +f 1104/37/2207 1112/90/2207 1115/89/2207 +f 1102/6/2208 1123/8/2208 1109/65/2208 +f 1123/8/2208 1101/10/2208 1109/65/2208 +f 1109/65/794 1110/26/794 1102/6/794 +f 1106/27/2209 1123/91/2209 1113/95/2209 +f 1105/92/796 1113/99/796 1123/77/796 +f 1102/78/796 1116/76/796 1115/94/796 +f 1102/95/797 1116/83/797 1113/84/797 +f 1101/65/2210 1123/25/2210 1106/7/2210 +f 1097/28/2211 1102/100/2211 1112/26/2211 +f 1100/20/2212 1101/65/2212 1106/7/2212 +f 1097/28/2213 1112/26/2213 1104/19/2213 +f 1100/20/798 1106/7/798 1097/28/798 +f 1111/96/2214 1109/88/2214 1101/85/2214 +f 1112/90/2215 1110/97/2215 1114/86/2215 +f 1120/35/801 1117/46/801 1121/80/801 +f 1113/29/2216 1133/64/2216 1119/79/2216 +f 1131/26/2217 1127/65/2217 1133/6/2217 +f 1127/65/2218 1122/10/2218 1130/8/2218 +f 1133/6/2218 1127/65/2218 1130/8/2218 +f 1125/68/804 1127/67/804 1131/98/804 +f 1124/19/2219 1132/26/2219 1113/28/2219 +f 1132/26/2220 1133/100/2220 1113/28/2220 +f 1130/25/2221 1122/65/2221 1123/7/2221 +f 1122/65/2222 1120/20/2222 1123/7/2222 +f 1124/19/2223 1113/28/2223 1120/20/2223 +f 1118/70/2224 1117/66/2224 1120/98/2224 +f 1128/72/2225 1132/71/2225 1124/5/2225 +f 1128/27/2226 1119/6/2226 1126/26/2226 +f 1119/6/808 1129/8/808 1125/65/808 +f 1126/26/2227 1119/6/2227 1125/65/2227 +f 1129/74/2228 1130/73/2228 1123/48/2228 +f 1122/75/810 1130/94/810 1129/58/810 +f 1133/77/810 1132/99/810 1128/76/810 +f 1119/41/810 1129/51/810 1130/52/810 +f 1118/65/2229 1129/25/2229 1102/7/2229 +f 1116/28/2230 1119/100/2230 1128/26/2230 +f 1117/20/2231 1118/65/2231 1102/7/2231 +f 1116/28/2232 1128/26/2232 1121/19/2232 +f 1117/20/2233 1102/7/2233 1116/28/2233 +f 1127/80/2234 1125/63/2234 1118/70/2234 +f 1128/72/2235 1126/68/2235 1131/67/2235 +f 1137/81/814 1134/82/814 1138/11/814 +f 1119/83/2236 1149/47/2236 1136/30/2236 +f 1147/26/2237 1143/65/2237 1146/8/2237 +f 1143/65/2238 1139/10/2238 1146/8/2238 +f 1147/26/816 1146/8/816 1149/6/816 +f 1142/87/817 1141/86/817 1143/97/817 +f 1140/19/2239 1148/26/2239 1119/28/2239 +f 1148/26/2240 1149/100/2240 1119/28/2240 +f 1146/25/2241 1139/65/2241 1133/7/2241 +f 1139/65/2242 1137/20/2242 1133/7/2242 +f 1140/19/2243 1119/28/2243 1137/20/2243 +f 1135/81/2244 1134/88/2244 1137/96/2244 +f 1144/90/2245 1148/89/2245 1140/4/2245 +f 1136/6/2246 1145/8/2246 1142/26/2246 +f 1145/8/2247 1135/10/2247 1141/65/2247 +f 1141/65/2248 1142/26/2248 1145/8/2248 +f 1145/91/2249 1146/95/2249 1133/41/2249 +f 1139/92/823 1146/99/823 1145/77/823 +f 1149/76/823 1148/94/823 1144/75/823 +f 1149/83/2250 1146/84/2250 1145/91/2250 +f 1135/65/2251 1145/25/2251 1130/7/2251 +f 1129/28/2252 1136/100/2252 1144/26/2252 +f 1134/20/2253 1135/65/2253 1130/7/2253 +f 1129/28/2254 1144/26/2254 1138/19/2254 +f 1134/20/2255 1130/7/2255 1129/28/2255 +f 1141/88/2256 1135/85/2256 1139/87/2256 +f 1142/97/2257 1147/86/2257 1148/89/2257 +f 1150/46/828 1154/80/828 1156/63/828 +f 1149/55/2258 1146/29/2258 1171/64/2258 +f 1162/26/2259 1159/65/2259 1170/8/2259 +f 1159/65/2260 1155/10/2260 1170/8/2260 +f 1162/26/830 1170/8/830 1171/6/830 +f 1158/66/831 1157/68/831 1159/67/831 +f 1156/19/2261 1163/26/2261 1146/28/2261 +f 1163/26/2262 1171/100/2262 1146/28/2262 +f 1170/25/2263 1155/65/2263 1145/7/2263 +f 1155/65/2264 1153/20/2264 1145/7/2264 +f 1156/19/2265 1146/28/2265 1145/7/2265 +f 1155/69/2266 1151/70/2266 1150/66/2266 +f 1154/15/2267 1160/72/2267 1163/71/2267 +f 1152/6/835 1161/8/835 1158/26/835 +f 1161/8/2268 1151/10/2268 1157/65/2268 +f 1157/65/2269 1158/26/2269 1161/8/2269 +f 1136/53/2270 1161/74/2270 1170/73/2270 +f 1155/75/837 1170/94/837 1161/58/837 +f 1171/77/837 1163/99/837 1160/76/837 +f 1152/41/837 1161/51/837 1170/52/837 +f 1151/65/2271 1161/25/2271 1136/7/2271 +f 1149/28/2272 1152/100/2272 1160/26/2272 +f 1150/20/2273 1151/65/2273 1136/7/2273 +f 1149/28/2274 1160/26/2274 1154/19/2274 +f 1150/20/2275 1136/7/2275 1154/19/2275 +f 1157/63/2276 1151/70/2276 1155/69/2276 +f 1158/68/2277 1162/67/2277 1163/71/2277 +f 1164/82/841 1168/11/841 1172/36/841 +f 1152/83/2278 1184/47/2278 1166/30/2278 +f 1177/26/2279 1175/65/2279 1187/8/2279 +f 1175/65/2280 1169/10/2280 1187/8/2280 +f 1184/6/843 1178/27/843 1177/26/843 +f 1173/86/844 1175/97/844 1177/85/844 +f 1172/19/2281 1178/26/2281 1152/28/2281 +f 1178/26/2282 1184/100/2282 1152/28/2282 +f 1187/25/2283 1169/65/2283 1171/7/2283 +f 1169/65/2284 1167/20/2284 1171/7/2284 +f 1172/19/2285 1152/28/2285 1171/7/2285 +f 1169/82/2286 1165/81/2286 1164/88/2286 +f 1168/37/2287 1176/90/2287 1178/89/2287 +f 1176/27/2288 1166/6/2288 1174/26/2288 +f 1166/6/2288 1185/8/2288 1174/26/2288 +f 1185/8/2289 1165/10/2289 1173/65/2289 +f 1185/91/2290 1187/95/2290 1171/41/2290 +f 1165/93/850 1169/92/850 1187/99/850 +f 1166/78/850 1184/76/850 1178/94/850 +f 1184/83/851 1187/84/851 1185/91/851 +f 1165/65/2291 1185/25/2291 1170/7/2291 +f 1161/28/2292 1166/100/2292 1176/26/2292 +f 1164/20/2293 1165/65/2293 1170/7/2293 +f 1161/28/2294 1176/26/2294 1168/19/2294 +f 1164/20/2295 1170/7/2295 1168/19/2295 +f 1173/88/2296 1165/85/2296 1169/87/2296 +f 1174/97/2297 1177/86/2297 1178/89/2297 +f 1181/35/855 1179/46/855 1182/80/855 +f 1184/55/2298 1187/29/2298 1196/64/2298 +f 1194/26/2299 1190/65/2299 1193/8/2299 +f 1190/65/2300 1183/10/2300 1193/8/2300 +f 1194/26/857 1193/8/857 1196/6/857 +f 1188/68/858 1190/67/858 1194/98/858 +f 1186/19/2301 1195/26/2301 1187/28/2301 +f 1195/26/2302 1196/100/2302 1187/28/2302 +f 1193/25/2303 1183/65/2303 1185/7/2303 +f 1183/65/2304 1181/20/2304 1185/7/2304 +f 1186/19/2305 1187/28/2305 1185/7/2305 +f 1183/69/2306 1180/70/2306 1179/66/2306 +f 1182/15/2307 1191/72/2307 1195/71/2307 +f 1204/6/862 1192/8/862 1189/26/862 +f 1192/8/2308 1180/10/2308 1188/65/2308 +f 1188/65/2309 1189/26/2309 1192/8/2309 +f 1166/53/2310 1192/74/2310 1193/73/2310 +f 1180/59/864 1183/75/864 1193/94/864 +f 1204/78/864 1196/77/864 1195/99/864 +f 1204/41/864 1192/51/864 1193/52/864 +f 1180/65/2311 1192/25/2311 1166/7/2311 +f 1184/28/2312 1204/100/2312 1191/26/2312 +f 1179/20/2313 1180/65/2313 1166/7/2313 +f 1184/28/2314 1191/26/2314 1182/19/2314 +f 1179/20/2315 1166/7/2315 1182/19/2315 +f 1188/63/2316 1180/70/2316 1183/69/2316 +f 1189/68/2317 1194/67/2317 1195/71/2317 +f 1197/82/868 1201/11/868 1203/36/868 +f 1204/83/869 1219/47/869 1199/30/869 +f 1211/26/2318 1207/65/2318 1210/8/2318 +f 1207/65/2319 1202/10/2319 1210/8/2319 +f 1211/26/2320 1210/8/2320 1219/6/2320 +f 1205/86/871 1207/97/871 1211/85/871 +f 1203/19/2321 1212/26/2321 1204/28/2321 +f 1212/26/2322 1219/100/2322 1204/28/2322 +f 1210/25/2323 1202/65/2323 1196/7/2323 +f 1202/65/2324 1200/20/2324 1196/7/2324 +f 1203/19/2325 1204/28/2325 1196/7/2325 +f 1202/82/2326 1198/81/2326 1197/88/2326 +f 1201/37/2327 1208/90/2327 1212/89/2327 +f 1199/6/875 1209/8/875 1206/26/875 +f 1209/8/2328 1198/10/2328 1205/65/2328 +f 1205/65/2329 1206/26/2329 1209/8/2329 +f 1209/91/876 1210/95/876 1196/41/876 +f 1198/93/877 1202/92/877 1210/99/877 +f 1199/78/877 1219/76/877 1212/94/877 +f 1219/83/878 1210/84/878 1209/91/878 +f 1198/65/2330 1209/25/2330 1193/7/2330 +f 1192/28/2331 1199/100/2331 1208/26/2331 +f 1197/20/2332 1198/65/2332 1193/7/2332 +f 1192/28/2333 1208/26/2333 1201/19/2333 +f 1197/20/2334 1193/7/2334 1201/19/2334 +f 1207/96/2335 1205/88/2335 1198/85/2335 +f 1208/90/2336 1206/97/2336 1211/86/2336 +f 1216/35/882 1213/46/882 1217/80/882 +f 1210/29/2337 1228/64/2337 1215/79/2337 +f 1226/26/2338 1223/65/2338 1225/8/2338 +f 1223/65/2339 1218/10/2339 1225/8/2339 +f 1226/26/884 1225/8/884 1228/6/884 +f 1221/68/885 1223/67/885 1226/98/885 +f 1220/19/2340 1227/26/2340 1210/28/2340 +f 1227/26/2341 1228/100/2341 1210/28/2341 +f 1225/25/2342 1218/65/2342 1209/7/2342 +f 1218/65/2343 1216/20/2343 1209/7/2343 +f 1220/19/2344 1210/28/2344 1209/7/2344 +f 1214/70/2345 1213/66/2345 1216/98/2345 +f 1224/72/2346 1227/71/2346 1220/5/2346 +f 1215/6/889 1235/8/889 1222/26/889 +f 1235/8/2347 1214/10/2347 1221/65/2347 +f 1221/65/2348 1222/26/2348 1235/8/2348 +f 1235/74/2349 1225/73/2349 1209/48/2349 +f 1218/75/891 1225/94/891 1235/58/891 +f 1228/77/891 1227/99/891 1224/76/891 +f 1235/51/891 1225/52/891 1228/27/891 +f 1214/65/2350 1235/25/2350 1199/7/2350 +f 1219/28/2351 1215/100/2351 1224/26/2351 +f 1213/20/2352 1214/65/2352 1199/7/2352 +f 1219/28/2353 1224/26/2353 1217/19/2353 +f 1213/20/2354 1199/7/2354 1217/19/2354 +f 1221/63/2355 1214/70/2355 1218/69/2355 +f 1222/68/2356 1226/67/2356 1227/71/2356 +f 1232/81/895 1229/82/895 1233/11/895 +f 1235/84/2357 1215/83/2357 1244/47/2357 +f 1242/26/2358 1239/65/2358 1244/6/2358 +f 1239/65/2359 1234/10/2359 1252/8/2359 +f 1252/8/2360 1244/6/2360 1239/65/2360 +f 1237/86/898 1239/97/898 1242/85/898 +f 1236/19/2361 1243/26/2361 1215/28/2361 +f 1243/26/2362 1244/100/2362 1215/28/2362 +f 1252/25/2363 1234/65/2363 1228/7/2363 +f 1234/65/2364 1232/20/2364 1228/7/2364 +f 1236/19/2365 1215/28/2365 1228/7/2365 +f 1234/82/2366 1230/81/2366 1229/88/2366 +f 1233/37/2367 1240/90/2367 1243/89/2367 +f 1231/6/2368 1241/8/2368 1237/65/2368 +f 1241/8/2368 1230/10/2368 1237/65/2368 +f 1237/65/2369 1238/26/2369 1231/6/2369 +f 1225/27/2370 1241/91/2370 1252/95/2370 +f 1230/93/904 1234/92/904 1252/99/904 +f 1231/78/904 1244/76/904 1243/94/904 +f 1231/95/905 1244/83/905 1252/84/905 +f 1230/65/2371 1241/25/2371 1225/7/2371 +f 1235/28/2372 1231/100/2372 1240/26/2372 +f 1229/20/2373 1230/65/2373 1225/7/2373 +f 1235/28/2374 1240/26/2374 1233/19/2374 +f 1229/20/2375 1225/7/2375 1233/19/2375 +f 1239/96/2376 1237/88/2376 1230/85/2376 +f 1240/90/2377 1238/97/2377 1242/86/2377 +f 1245/46/909 1249/80/909 1251/63/909 +f 1252/29/2378 1259/64/2378 1247/79/2378 +f 1257/26/2379 1255/65/2379 1259/6/2379 +f 1255/65/2380 1250/10/2380 1267/8/2380 +f 1259/6/2380 1255/65/2380 1267/8/2380 +f 1253/68/912 1255/67/912 1257/98/912 +f 1251/19/2381 1258/26/2381 1252/28/2381 +f 1258/26/2382 1259/100/2382 1252/28/2382 +f 1267/25/2383 1250/65/2383 1241/7/2383 +f 1250/65/2384 1248/20/2384 1241/7/2384 +f 1251/19/2385 1252/28/2385 1248/20/2385 +f 1246/70/2386 1245/66/2386 1248/98/2386 +f 1256/72/2387 1258/71/2387 1251/5/2387 +f 1247/6/2388 1266/8/2388 1253/65/2388 +f 1266/8/2388 1246/10/2388 1253/65/2388 +f 1253/65/2389 1254/26/2389 1247/6/2389 +f 1266/74/2390 1267/73/2390 1241/48/2390 +f 1250/75/918 1267/94/918 1266/58/918 +f 1247/78/918 1259/77/918 1258/99/918 +f 1247/41/918 1266/51/918 1267/52/918 +f 1246/65/2391 1266/25/2391 1231/7/2391 +f 1244/28/2392 1247/100/2392 1256/26/2392 +f 1245/20/2393 1246/65/2393 1231/7/2393 +f 1244/28/2394 1256/26/2394 1249/19/2394 +f 1245/20/2395 1231/7/2395 1244/28/2395 +f 1253/63/2396 1246/70/2396 1250/69/2396 +f 1254/68/2397 1257/67/2397 1258/71/2397 +f 1260/82/922 1264/11/922 1268/36/922 +f 1247/83/2398 1281/47/2398 1262/30/2398 +f 1273/26/2399 1271/65/2399 1281/6/2399 +f 1271/65/2400 1265/10/2400 1284/8/2400 +f 1284/8/2401 1281/6/2401 1271/65/2401 +f 1269/86/925 1271/97/925 1273/85/925 +f 1268/19/2402 1274/26/2402 1247/28/2402 +f 1274/26/2403 1281/100/2403 1247/28/2403 +f 1284/25/2404 1265/65/2404 1259/7/2404 +f 1265/65/2405 1263/20/2405 1259/7/2405 +f 1268/19/2406 1247/28/2406 1263/20/2406 +f 1265/82/2407 1261/81/2407 1260/88/2407 +f 1264/37/2408 1272/90/2408 1274/89/2408 +f 1272/27/2409 1262/6/2409 1270/26/2409 +f 1262/6/929 1282/8/929 1269/65/929 +f 1270/26/2410 1262/6/2410 1269/65/2410 +f 1282/91/2411 1284/95/2411 1259/41/2411 +f 1261/93/931 1265/92/931 1284/99/931 +f 1281/76/931 1274/94/931 1272/75/931 +f 1281/83/932 1284/84/932 1282/91/932 +f 1261/65/2412 1282/25/2412 1267/7/2412 +f 1266/28/2413 1262/100/2413 1272/26/2413 +f 1260/20/2414 1261/65/2414 1267/7/2414 +f 1266/28/2415 1272/26/2415 1264/19/2415 +f 1260/20/2416 1267/7/2416 1266/28/2416 +f 1269/88/2417 1261/85/2417 1265/87/2417 +f 1270/97/2418 1273/86/2418 1274/89/2418 +f 1278/35/936 1275/46/936 1279/80/936 +f 1281/55/2419 1284/29/2419 1299/64/2419 +f 1290/26/2420 1287/65/2420 1299/6/2420 +f 1287/65/2421 1280/10/2421 1298/8/2421 +f 1299/6/2421 1287/65/2421 1298/8/2421 +f 1286/66/939 1285/68/939 1287/67/939 +f 1283/19/2422 1291/26/2422 1284/28/2422 +f 1291/26/2423 1299/100/2423 1284/28/2423 +f 1298/25/2424 1280/65/2424 1282/7/2424 +f 1280/65/2425 1278/20/2425 1282/7/2425 +f 1283/19/2426 1284/28/2426 1278/20/2426 +f 1280/69/2427 1276/70/2427 1275/66/2427 +f 1279/15/2428 1288/72/2428 1291/71/2428 +f 1277/6/2429 1289/8/2429 1285/65/2429 +f 1289/8/2429 1276/10/2429 1285/65/2429 +f 1285/65/2430 1286/26/2430 1277/6/2430 +f 1262/53/2431 1289/74/2431 1298/73/2431 +f 1280/75/945 1298/94/945 1289/58/945 +f 1299/77/945 1291/99/945 1288/76/945 +f 1289/51/945 1298/52/945 1299/27/945 +f 1276/65/2432 1289/25/2432 1262/7/2432 +f 1281/28/2433 1277/100/2433 1288/26/2433 +f 1275/20/2434 1276/65/2434 1262/7/2434 +f 1281/28/2435 1288/26/2435 1279/19/2435 +f 1275/20/2436 1262/7/2436 1281/28/2436 +f 1287/80/2437 1285/63/2437 1276/70/2437 +f 1288/72/2438 1286/68/2438 1290/67/2438 +f 1292/82/949 1296/11/949 1300/36/949 +f 1277/83/2439 1314/47/2439 1294/30/2439 +f 1306/26/2440 1303/65/2440 1316/8/2440 +f 1303/65/2441 1297/10/2441 1316/8/2441 +f 1316/8/951 1314/6/951 1306/26/951 +f 1301/86/952 1303/97/952 1306/85/952 +f 1300/19/2442 1307/26/2442 1277/28/2442 +f 1307/26/2443 1314/100/2443 1277/28/2443 +f 1316/25/2444 1297/65/2444 1299/7/2444 +f 1297/65/2445 1295/20/2445 1299/7/2445 +f 1300/19/2446 1277/28/2446 1295/20/2446 +f 1293/81/2447 1292/88/2447 1295/96/2447 +f 1304/90/2448 1307/89/2448 1300/4/2448 +f 1294/6/956 1305/8/956 1302/26/956 +f 1305/8/2449 1293/10/2449 1301/65/2449 +f 1301/65/2450 1302/26/2450 1305/8/2450 +f 1305/91/2451 1316/95/2451 1299/41/2451 +f 1293/93/958 1297/92/958 1316/99/958 +f 1314/76/958 1307/94/958 1304/75/958 +f 1294/95/959 1314/83/959 1316/84/959 +f 1293/65/2452 1305/25/2452 1298/7/2452 +f 1289/28/2453 1294/100/2453 1304/26/2453 +f 1292/20/2454 1293/65/2454 1298/7/2454 +f 1289/28/2455 1304/26/2455 1296/19/2455 +f 1292/20/2456 1298/7/2456 1289/28/2456 +f 1301/88/2457 1293/85/2457 1297/87/2457 +f 1302/97/2458 1306/86/2458 1307/89/2458 +f 1311/35/963 1308/46/963 1312/80/963 +f 1314/55/2459 1316/29/2459 1330/64/2459 +f 1323/26/2460 1319/65/2460 1322/8/2460 +f 1319/65/2461 1313/10/2461 1322/8/2461 +f 1323/26/965 1322/8/965 1330/6/965 +f 1317/68/966 1319/67/966 1323/98/966 +f 1315/19/2462 1324/26/2462 1316/28/2462 +f 1324/26/2463 1330/100/2463 1316/28/2463 +f 1322/25/2464 1313/65/2464 1305/7/2464 +f 1313/65/2465 1311/20/2465 1305/7/2465 +f 1315/19/2466 1316/28/2466 1311/20/2466 +f 1313/69/2467 1309/70/2467 1308/66/2467 +f 1312/15/2468 1320/72/2468 1324/71/2468 +f 1310/6/970 1321/8/970 1318/26/970 +f 1321/8/2469 1309/10/2469 1317/65/2469 +f 1317/65/2470 1318/26/2470 1321/8/2470 +f 1294/53/2471 1321/74/2471 1322/73/2471 +f 1313/75/972 1322/94/972 1321/58/972 +f 1330/77/972 1324/99/972 1320/76/972 +f 1321/51/972 1322/52/972 1330/27/972 +f 1309/65/2472 1321/25/2472 1294/7/2472 +f 1314/28/2473 1310/100/2473 1320/26/2473 +f 1308/20/2474 1309/65/2474 1294/7/2474 +f 1314/28/2475 1320/26/2475 1312/19/2475 +f 1308/20/2476 1294/7/2476 1314/28/2476 +f 1319/80/2477 1317/63/2477 1309/70/2477 +f 1320/72/2478 1318/68/2478 1323/67/2478 +f 1327/81/976 1325/82/976 1328/11/976 +f 1321/84/2479 1310/83/2479 1345/47/2479 +f 1337/26/2480 1334/65/2480 1336/8/2480 +f 1334/65/2481 1329/10/2481 1336/8/2481 +f 1345/6/978 1338/27/978 1337/26/978 +f 1333/87/979 1332/86/979 1334/97/979 +f 1331/19/2482 1338/26/2482 1310/28/2482 +f 1338/26/2483 1345/100/2483 1310/28/2483 +f 1336/25/2484 1329/65/2484 1330/7/2484 +f 1329/65/2485 1327/20/2485 1330/7/2485 +f 1331/19/2486 1310/28/2486 1330/7/2486 +f 1326/81/2487 1325/88/2487 1327/96/2487 +f 1335/90/2488 1338/89/2488 1331/4/2488 +f 1335/27/2489 1346/6/2489 1333/26/2489 +f 1346/6/2489 1347/8/2489 1333/26/2489 +f 1347/8/2490 1326/10/2490 1332/65/2490 +f 1322/27/2491 1347/91/2491 1336/95/2491 +f 1326/93/985 1329/92/985 1336/99/985 +f 1346/78/985 1345/76/985 1338/94/985 +f 1345/83/986 1336/84/986 1347/91/986 +f 1326/65/2492 1347/25/2492 1322/7/2492 +f 1321/28/2493 1346/100/2493 1335/26/2493 +f 1325/20/2494 1326/65/2494 1322/7/2494 +f 1321/28/2495 1335/26/2495 1328/19/2495 +f 1325/20/2496 1322/7/2496 1328/19/2496 +f 1334/96/2497 1332/88/2497 1326/85/2497 +f 1335/90/2498 1333/97/2498 1337/86/2498 +f 1339/46/990 1343/80/990 1348/63/990 +f 1345/55/2499 1336/29/2499 1362/64/2499 +f 1353/26/2500 1351/65/2500 1361/8/2500 +f 1351/65/2501 1344/10/2501 1361/8/2501 +f 1353/26/992 1361/8/992 1362/6/992 +f 1349/68/993 1351/67/993 1353/98/993 +f 1348/19/2502 1354/26/2502 1336/28/2502 +f 1354/26/2503 1362/100/2503 1336/28/2503 +f 1361/25/2504 1344/65/2504 1347/7/2504 +f 1344/65/2505 1342/20/2505 1347/7/2505 +f 1348/19/2506 1336/28/2506 1347/7/2506 +f 1344/69/2507 1340/70/2507 1339/66/2507 +f 1343/15/2508 1352/72/2508 1354/71/2508 +f 1341/6/997 1360/8/997 1350/26/997 +f 1360/8/2509 1340/10/2509 1349/65/2509 +f 1349/65/2510 1350/26/2510 1360/8/2510 +f 1346/53/2511 1360/74/2511 1361/73/2511 +f 1340/59/999 1344/75/999 1361/94/999 +f 1362/77/999 1354/99/999 1352/76/999 +f 1341/41/999 1360/51/999 1361/52/999 +f 1340/65/2512 1360/25/2512 1346/7/2512 +f 1345/28/2513 1341/100/2513 1352/26/2513 +f 1339/20/2514 1340/65/2514 1346/7/2514 +f 1345/28/2515 1352/26/2515 1343/19/2515 +f 1339/20/2516 1346/7/2516 1343/19/2516 +f 1351/80/2517 1349/63/2517 1340/70/2517 +f 1352/72/2518 1350/68/2518 1353/67/2518 +f 1357/81/1003 1355/82/1003 1358/11/1003 +f 1360/84/2519 1341/83/2519 1376/47/2519 +f 1369/26/2520 1366/65/2520 1368/8/2520 +f 1366/65/2521 1359/10/2521 1368/8/2521 +f 1368/8/1005 1376/6/1005 1369/26/1005 +f 1364/86/1006 1366/97/1006 1369/85/1006 +f 1363/19/2522 1370/26/2522 1341/28/2522 +f 1370/26/2523 1376/100/2523 1341/28/2523 +f 1368/25/2524 1359/65/2524 1362/7/2524 +f 1359/65/2525 1357/20/2525 1362/7/2525 +f 1363/19/2526 1341/28/2526 1362/7/2526 +f 1356/81/2527 1355/88/2527 1357/96/2527 +f 1367/90/2528 1370/89/2528 1363/4/2528 +f 1367/27/2529 1377/6/2529 1365/26/2529 +f 1377/6/2529 1378/8/2529 1365/26/2529 +f 1378/8/2530 1356/10/2530 1364/65/2530 +f 1361/27/2531 1378/91/2531 1368/95/2531 +f 1356/93/1012 1359/92/1012 1368/99/1012 +f 1377/78/1012 1376/76/1012 1370/94/1012 +f 1377/95/1013 1376/83/1013 1368/84/1013 +f 1356/65/2532 1378/25/2532 1361/7/2532 +f 1360/28/2533 1377/100/2533 1367/26/2533 +f 1355/20/2534 1356/65/2534 1361/7/2534 +f 1360/28/2535 1367/26/2535 1358/19/2535 +f 1355/20/2536 1361/7/2536 1358/19/2536 +f 1364/88/2537 1356/85/2537 1359/87/2537 +f 1365/97/2538 1369/86/2538 1370/89/2538 +f 1371/46/1017 1374/80/1017 1379/63/1017 +f 1368/29/2539 1393/64/2539 1395/79/2539 +f 1385/26/2540 1382/65/2540 1392/8/2540 +f 1382/65/2541 1375/10/2541 1392/8/2541 +f 1385/26/1019 1392/8/1019 1393/6/1019 +f 1381/66/1020 1380/68/1020 1382/67/1020 +f 1379/19/2542 1386/26/2542 1368/28/2542 +f 1386/26/2543 1393/100/2543 1368/28/2543 +f 1392/25/2544 1375/65/2544 1378/7/2544 +f 1375/65/2545 1373/20/2545 1378/7/2545 +f 1379/19/2546 1368/28/2546 1378/7/2546 +f 1372/70/2547 1371/66/2547 1373/98/2547 +f 1383/72/2548 1386/71/2548 1379/5/2548 +f 1383/27/2549 1395/6/2549 1381/26/2549 +f 1395/6/2549 1384/8/2549 1381/26/2549 +f 1384/8/2550 1372/10/2550 1380/65/2550 +f 1384/74/2551 1392/73/2551 1378/48/2551 +f 1375/75/1026 1392/94/1026 1384/58/1026 +f 1393/77/1026 1386/99/1026 1383/76/1026 +f 1395/41/1026 1384/51/1026 1392/52/1026 +f 1372/65/2552 1384/25/2552 1377/7/2552 +f 1376/28/2553 1395/100/2553 1383/26/2553 +f 1371/20/2554 1372/65/2554 1377/7/2554 +f 1376/28/2555 1383/26/2555 1374/19/2555 +f 1371/20/2556 1377/7/2556 1374/19/2556 +f 1380/63/2557 1372/70/2557 1375/69/2557 +f 1381/68/2558 1385/67/2558 1386/71/2558 +f 1387/82/1030 1390/11/1030 1394/36/1030 +f 1384/84/2559 1395/83/2559 1410/47/2559 +f 1402/26/2560 1398/65/2560 1410/6/2560 +f 1398/65/2561 1391/10/2561 1401/8/2561 +f 1401/8/2561 1410/6/2561 1398/65/2561 +f 1396/86/1033 1398/97/1033 1402/85/1033 +f 1394/19/2562 1403/26/2562 1395/28/2562 +f 1403/26/2563 1410/100/2563 1395/28/2563 +f 1401/25/2564 1391/65/2564 1393/7/2564 +f 1391/65/2565 1389/20/2565 1393/7/2565 +f 1394/19/2566 1395/28/2566 1393/7/2566 +f 1391/82/2567 1388/81/2567 1387/88/2567 +f 1390/37/2568 1399/90/2568 1403/89/2568 +f 1411/6/2569 1400/8/2569 1396/65/2569 +f 1400/8/2569 1388/10/2569 1396/65/2569 +f 1396/65/2570 1397/26/2570 1411/6/2570 +f 1392/27/2571 1400/91/2571 1401/95/2571 +f 1391/92/1039 1401/99/1039 1400/77/1039 +f 1411/78/1039 1410/76/1039 1403/94/1039 +f 1410/83/2572 1401/84/2572 1400/91/2572 +f 1388/65/2573 1400/25/2573 1392/7/2573 +f 1384/28/2574 1411/100/2574 1399/26/2574 +f 1387/20/2575 1388/65/2575 1392/7/2575 +f 1384/28/2576 1399/26/2576 1390/19/2576 +f 1387/20/2577 1392/7/2577 1390/19/2577 +f 1396/88/2578 1388/85/2578 1391/87/2578 +f 1397/97/2579 1402/86/2579 1403/89/2579 +f 1404/46/1045 1408/80/1045 1412/63/1045 +f 1410/55/2580 1401/29/2580 1421/64/2580 +f 1419/26/1047 1415/65/1047 1418/8/1047 +f 1415/65/1047 1409/10/1047 1418/8/1047 +f 1419/26/1047 1418/8/1047 1421/6/1047 +f 1413/68/1048 1415/67/1048 1419/98/1048 +f 1412/19/2581 1420/26/2581 1401/28/2581 +f 1420/26/2582 1421/100/2582 1401/28/2582 +f 1418/25/2582 1409/65/2582 1400/7/2582 +f 1409/65/2583 1407/20/2583 1400/7/2583 +f 1412/19/2584 1401/28/2584 1407/20/2584 +f 1409/69/2585 1405/70/2585 1404/66/2585 +f 1408/15/2586 1416/72/2586 1420/71/2586 +f 1406/6/1052 1417/8/1052 1414/26/1052 +f 1417/8/1052 1405/10/1052 1413/65/1052 +f 1413/65/1052 1414/26/1052 1417/8/1052 +f 1411/53/2587 1417/74/2587 1418/73/2587 +f 1409/75/1054 1418/94/1054 1417/58/1054 +f 1421/77/1054 1420/99/1054 1416/76/1054 +f 1417/51/1054 1418/52/1054 1421/27/1054 +f 1405/65/2588 1417/25/2588 1411/7/2588 +f 1410/28/2588 1406/100/2588 1416/26/2588 +f 1404/20/2589 1405/65/2589 1411/7/2589 +f 1410/28/2590 1416/26/2590 1408/19/2590 +f 1404/20/2591 1411/7/2591 1410/28/2591 +f 1413/63/1056 1405/70/1056 1409/69/1056 +f 1414/68/1057 1419/67/1057 1420/71/1057 +f 1422/82/1058 1426/11/1058 1428/36/1058 +f 1417/84/1059 1406/83/1059 1436/47/1059 +f 1434/26/2592 1431/65/2592 1436/6/2592 +f 1431/65/2592 1427/10/2592 1433/8/2592 +f 1433/8/2592 1436/6/2592 1431/65/2592 +f 1429/86/1061 1431/97/1061 1434/85/1061 +f 1428/19/2593 1435/26/2593 1406/28/2593 +f 1435/26/2594 1436/100/2594 1406/28/2594 +f 1433/25/2594 1427/65/2594 1421/7/2594 +f 1427/65/2595 1425/20/2595 1421/7/2595 +f 1428/19/1062 1406/28/1062 1421/7/1062 +f 1427/82/2596 1423/81/2596 1422/88/2596 +f 1426/37/2597 1432/90/2597 1435/89/2597 +f 1443/8/1065 1423/10/1065 1429/65/1065 +f 1429/65/1065 1430/26/1065 1424/6/1065 +f 1430/26/1065 1432/27/1065 1424/6/1065 +f 1418/27/1066 1443/91/1066 1433/95/1066 +f 1427/92/1067 1433/99/1067 1443/77/1067 +f 1436/76/1067 1435/94/1067 1432/75/1067 +f 1424/95/1068 1436/83/1068 1433/84/1068 +f 1423/65/2598 1443/25/2598 1418/7/2598 +f 1417/28/2598 1424/100/2598 1432/26/2598 +f 1422/20/2599 1423/65/2599 1418/7/2599 +f 1417/28/2600 1432/26/2600 1426/19/2600 +f 1422/20/1069 1418/7/1069 1426/19/1069 +f 1431/96/1070 1429/88/1070 1423/85/1070 +f 1432/90/1071 1430/97/1071 1434/86/1071 +f 1437/46/1072 1441/80/1072 1444/63/1072 +f 1433/29/2601 1452/64/2601 1439/79/2601 +f 1450/26/2602 1447/65/2602 1452/6/2602 +f 1447/65/2602 1442/10/2602 1458/8/2602 +f 1452/6/2602 1447/65/2602 1458/8/2602 +f 1445/68/1075 1447/67/1075 1450/98/1075 +f 1444/19/2603 1451/26/2603 1433/28/2603 +f 1451/26/2604 1452/100/2604 1433/28/2604 +f 1458/25/2604 1442/65/2604 1443/7/2604 +f 1442/65/2605 1440/20/2605 1443/7/2605 +f 1444/19/1076 1433/28/1076 1440/20/1076 +f 1438/70/2606 1437/66/2606 1440/98/2606 +f 1448/72/2607 1451/71/2607 1444/5/2607 +f 1439/6/2608 1449/8/2608 1445/65/2608 +f 1449/8/2608 1438/10/2608 1445/65/2608 +f 1445/65/2608 1446/26/2608 1439/6/2608 +f 1449/74/2609 1458/73/2609 1443/48/2609 +f 1438/59/1081 1442/75/1081 1458/94/1081 +f 1452/77/1081 1451/99/1081 1448/76/1081 +f 1439/41/1081 1449/51/1081 1458/52/1081 +f 1438/65/2610 1449/25/2610 1424/7/2610 +f 1436/28/2610 1439/100/2610 1448/26/2610 +f 1437/20/2611 1438/65/2611 1424/7/2611 +f 1436/28/2612 1448/26/2612 1441/19/2612 +f 1437/20/1082 1424/7/1082 1436/28/1082 +f 1445/63/1083 1438/70/1083 1442/69/1083 +f 1446/68/2613 1450/67/2613 1451/71/2613 +f 1455/81/1085 1453/82/1085 1456/11/1085 +f 1449/84/2614 1439/83/2614 1467/47/2614 +f 1465/26/2615 1462/65/2615 1467/6/2615 +f 1462/65/2616 1457/10/2616 1464/8/2616 +f 1464/8/2617 1467/6/2617 1462/65/2617 +f 1460/86/1088 1462/97/1088 1465/85/1088 +f 1459/19/2618 1466/26/2618 1439/28/2618 +f 1466/26/2619 1467/100/2619 1439/28/2619 +f 1464/25/2620 1457/65/2620 1452/7/2620 +f 1457/65/2621 1455/20/2621 1452/7/2621 +f 1459/19/1089 1439/28/1089 1455/20/1089 +f 1457/82/2622 1454/81/2622 1453/88/2622 +f 1456/37/2623 1463/90/2623 1466/89/2623 +f 1463/27/2624 1474/6/2624 1461/26/2624 +f 1474/6/2625 1475/8/2625 1460/65/2625 +f 1461/26/1092 1474/6/1092 1460/65/1092 +f 1458/27/2626 1475/91/2626 1464/95/2626 +f 1457/92/1094 1464/99/1094 1475/77/1094 +f 1467/76/1094 1466/94/1094 1463/75/1094 +f 1474/95/1095 1467/83/1095 1464/84/1095 +f 1454/65/2627 1475/25/2627 1458/7/2627 +f 1449/28/2628 1474/100/2628 1463/26/2628 +f 1453/20/2629 1454/65/2629 1458/7/2629 +f 1449/28/2630 1463/26/2630 1456/19/2630 +f 1453/20/1096 1458/7/1096 1449/28/1096 +f 1460/88/2631 1454/85/2631 1457/87/2631 +f 1461/97/2632 1465/86/2632 1466/89/2632 +f 1468/46/2633 1472/80/2633 1476/63/2633 +f 1467/55/2634 1464/29/2634 1491/64/2634 +f 1482/26/2635 1479/65/2635 1490/8/2635 +f 1479/65/2636 1473/10/2636 1490/8/2636 +f 1482/26/1101 1490/8/1101 1491/6/1101 +f 1478/66/1102 1477/68/1102 1479/67/1102 +f 1476/19/2637 1483/26/2637 1464/28/2637 +f 1483/26/2638 1491/100/2638 1464/28/2638 +f 1490/25/2639 1473/65/2639 1475/7/2639 +f 1473/65/2640 1471/20/2640 1475/7/2640 +f 1476/19/1103 1464/28/1103 1471/20/1103 +f 1473/69/2641 1469/70/2641 1468/66/2641 +f 1472/15/2642 1480/72/2642 1483/71/2642 +f 1480/27/2632 1470/6/2632 1478/26/2632 +f 1470/6/2632 1481/8/2632 1478/26/2632 +f 1481/8/2643 1469/10/2643 1477/65/2643 +f 1474/53/2644 1481/74/2644 1490/73/2644 +f 1469/59/1108 1473/75/1108 1490/94/1108 +f 1491/77/1108 1483/99/1108 1480/76/1108 +f 1470/41/1108 1481/51/1108 1490/52/1108 +f 1469/65/2645 1481/25/2645 1474/7/2645 +f 1467/28/2646 1470/100/2646 1480/26/2646 +f 1468/20/2647 1469/65/2647 1474/7/2647 +f 1467/28/2648 1480/26/2648 1472/19/2648 +f 1468/20/2649 1474/7/2649 1467/28/2649 +f 1479/80/2650 1477/63/2650 1469/70/2650 +f 1480/72/2651 1478/68/2651 1482/67/2651 +f 1484/82/1112 1488/11/1112 1492/36/1112 +f 1470/83/2652 1499/47/2652 1486/30/2652 +f 1497/26/2653 1495/65/2653 1507/8/2653 +f 1495/65/2654 1489/10/2654 1507/8/2654 +f 1499/6/2655 1498/27/2655 1497/26/2655 +f 1494/87/1115 1493/86/1115 1495/97/1115 +f 1492/19/2656 1498/26/2656 1470/28/2656 +f 1498/26/2657 1499/100/2657 1470/28/2657 +f 1507/25/2658 1489/65/2658 1491/7/2658 +f 1489/65/2659 1487/20/2659 1491/7/2659 +f 1492/19/2660 1470/28/2660 1491/7/2660 +f 1485/81/2661 1484/88/2661 1487/96/2661 +f 1496/90/2662 1498/89/2662 1492/4/2662 +f 1496/27/2663 1486/6/2663 1494/26/2663 +f 1486/6/2664 1505/8/2664 1494/26/2664 +f 1505/8/2665 1485/10/2665 1493/65/2665 +f 1505/91/2666 1507/95/2666 1491/41/2666 +f 1489/92/1121 1507/99/1121 1505/77/1121 +f 1486/78/1121 1499/76/1121 1498/94/1121 +f 1486/95/1122 1499/83/1122 1507/84/1122 +f 1485/65/2667 1505/25/2667 1490/7/2667 +f 1481/28/2668 1486/100/2668 1496/26/2668 +f 1484/20/2669 1485/65/2669 1490/7/2669 +f 1481/28/2670 1496/26/2670 1488/19/2670 +f 1484/20/2671 1490/7/2671 1488/19/2671 +f 1495/96/2672 1493/88/2672 1485/85/2672 +f 1496/90/2673 1494/97/2673 1497/86/2673 +f 1502/35/1126 1500/46/1126 1503/80/1126 +f 1507/29/1127 1522/64/1127 1524/79/1127 +f 1514/26/2674 1510/65/2674 1522/6/2674 +f 1510/65/2674 1504/10/2674 1513/8/2674 +f 1522/6/2674 1510/65/2674 1513/8/2674 +f 1508/68/2675 1510/67/2675 1514/98/2675 +f 1506/19/2676 1515/26/2676 1507/28/2676 +f 1515/26/2677 1522/100/2677 1507/28/2677 +f 1513/25/2678 1504/65/2678 1505/7/2678 +f 1504/65/2679 1502/20/2679 1505/7/2679 +f 1506/19/2680 1507/28/2680 1505/7/2680 +f 1501/70/2681 1500/66/2681 1502/98/2681 +f 1511/72/2682 1515/71/2682 1506/5/2682 +f 1511/27/2683 1524/6/2683 1509/26/2683 +f 1524/6/1133 1512/8/1133 1508/65/1133 +f 1509/26/1133 1524/6/1133 1508/65/1133 +f 1512/74/2684 1513/73/2684 1505/48/2684 +f 1504/75/1136 1513/94/1136 1512/58/1136 +f 1524/78/1136 1522/77/1136 1515/99/1136 +f 1512/51/1135 1513/52/1135 1522/27/1135 +f 1501/65/2685 1512/25/2685 1486/7/2685 +f 1499/28/2686 1524/100/2686 1511/26/2686 +f 1500/20/2687 1501/65/2687 1486/7/2687 +f 1499/28/2688 1511/26/2688 1503/19/2688 +f 1500/20/2689 1486/7/2689 1503/19/2689 +f 1508/63/2690 1501/70/2690 1504/69/2690 +f 1509/68/2691 1514/67/2691 1515/71/2691 +f 1516/82/1140 1520/11/1140 1523/36/1140 +f 1524/83/2692 1538/47/2692 1518/30/2692 +f 1531/26/2693 1527/65/2693 1530/8/2693 +f 1527/65/2694 1521/10/2694 1530/8/2694 +f 1530/8/1142 1538/6/1142 1531/26/1142 +f 1526/87/1143 1525/86/1143 1527/97/1143 +f 1523/19/2695 1532/26/2695 1524/28/2695 +f 1532/26/2696 1538/100/2696 1524/28/2696 +f 1530/25/2696 1521/65/2696 1522/7/2696 +f 1521/65/2697 1519/20/2697 1522/7/2697 +f 1523/19/2698 1524/28/2698 1522/7/2698 +f 1517/81/2699 1516/88/2699 1519/96/2699 +f 1528/90/2700 1532/89/2700 1523/4/2700 +f 1529/8/2701 1517/10/2701 1525/65/2701 +f 1525/65/2702 1526/26/2702 1529/8/2702 +f 1526/26/1147 1528/27/1147 1518/6/1147 +f 1529/91/2703 1530/95/2703 1522/41/2703 +f 1521/92/1149 1530/99/1149 1529/77/1149 +f 1518/78/1149 1538/76/1149 1532/94/1149 +f 1518/95/1150 1538/83/1150 1530/84/1150 +f 1517/65/2704 1529/25/2704 1513/7/2704 +f 1512/28/2705 1518/100/2705 1528/26/2705 +f 1516/20/2706 1517/65/2706 1513/7/2706 +f 1512/28/2707 1528/26/2707 1520/19/2707 +f 1516/20/2708 1513/7/2708 1520/19/2708 +f 1525/88/2709 1517/85/2709 1521/87/2709 +f 1526/97/2710 1531/86/2710 1532/89/2710 +f 1535/35/1154 1533/46/1154 1536/80/1154 +f 1538/55/2711 1530/29/2711 1554/64/2711 +f 1545/26/2712 1542/65/2712 1544/8/2712 +f 1542/65/2713 1537/10/2713 1544/8/2713 +f 1544/8/1156 1554/6/1156 1545/26/1156 +f 1541/66/1157 1540/68/1157 1542/67/1157 +f 1539/19/2714 1546/26/2714 1530/28/2714 +f 1546/26/2715 1554/100/2715 1530/28/2715 +f 1544/25/2716 1537/65/2716 1529/7/2716 +f 1537/65/2717 1535/20/2717 1529/7/2717 +f 1539/19/2718 1530/28/2718 1529/7/2718 +f 1537/69/2719 1534/70/2719 1533/66/2719 +f 1536/15/2720 1543/72/2720 1546/71/2720 +f 1543/27/2721 1556/6/2721 1541/26/2721 +f 1556/6/2721 1553/8/2721 1541/26/2721 +f 1553/8/2722 1534/10/2722 1540/65/2722 +f 1518/53/2723 1553/74/2723 1544/73/2723 +f 1537/75/1163 1544/94/1163 1553/58/1163 +f 1556/78/1164 1554/77/1164 1546/99/1164 +f 1553/51/1164 1544/52/1164 1554/27/1164 +f 1534/65/2724 1553/25/2724 1518/7/2724 +f 1538/28/2725 1556/100/2725 1543/26/2725 +f 1533/20/2726 1534/65/2726 1518/7/2726 +f 1538/28/2727 1543/26/2727 1536/19/2727 +f 1533/20/2728 1518/7/2728 1536/19/2728 +f 1542/80/2729 1540/63/2729 1534/70/2729 +f 1543/72/2730 1541/68/2730 1545/67/2730 +f 1547/82/1168 1551/11/1168 1555/36/1168 +f 1553/84/2731 1556/83/2731 1569/47/2731 +f 1562/26/2732 1559/65/2732 1569/6/2732 +f 1559/65/2733 1552/10/2733 1561/8/2733 +f 1569/6/2733 1559/65/2733 1561/8/2733 +f 1558/87/1171 1557/86/1171 1559/97/1171 +f 1555/19/2734 1563/26/2734 1556/28/2734 +f 1563/26/2735 1569/100/2735 1556/28/2735 +f 1561/25/2736 1552/65/2736 1554/7/2736 +f 1552/65/2737 1550/20/2737 1554/7/2737 +f 1555/19/1172 1556/28/1172 1554/7/1172 +f 1552/82/2738 1548/81/2738 1547/88/2738 +f 1551/37/2739 1560/90/2739 1563/89/2739 +f 1560/27/2740 1549/6/2740 1558/26/2740 +f 1549/6/1175 1570/8/1175 1557/65/1175 +f 1558/26/2741 1549/6/2741 1557/65/2741 +f 1544/27/2742 1570/91/2742 1561/95/2742 +f 1548/93/1177 1552/92/1177 1561/99/1177 +f 1569/76/1177 1563/94/1177 1560/75/1177 +f 1549/95/1178 1569/83/1178 1561/84/1178 +f 1548/65/2743 1570/25/2743 1544/7/2743 +f 1553/28/2744 1549/100/2744 1560/26/2744 +f 1547/20/2745 1548/65/2745 1544/7/2745 +f 1553/28/2746 1560/26/2746 1551/19/2746 +f 1547/20/2747 1544/7/2747 1551/19/2747 +f 1557/88/2748 1548/85/2748 1552/87/2748 +f 1558/97/2749 1562/86/2749 1563/89/2749 +f 1566/35/2750 1564/46/2750 1567/80/2750 +f 1569/55/2751 1561/29/2751 1579/64/2751 +f 1577/26/2752 1574/65/2752 1576/8/2752 +f 1574/65/2753 1568/10/2753 1576/8/2753 +f 1577/26/1184 1576/8/1184 1579/6/1184 +f 1573/66/1185 1572/68/1185 1574/67/1185 +f 1571/19/2754 1578/26/2754 1561/28/2754 +f 1578/26/2755 1579/100/2755 1561/28/2755 +f 1576/25/2755 1568/65/2755 1570/7/2755 +f 1568/65/2756 1566/20/2756 1570/7/2756 +f 1571/19/2757 1561/28/2757 1570/7/2757 +f 1568/69/2758 1565/70/2758 1564/66/2758 +f 1567/15/2759 1575/72/2759 1578/71/2759 +f 1587/6/1189 1585/8/1189 1573/26/1189 +f 1585/8/2760 1565/10/2760 1572/65/2760 +f 1572/65/2761 1573/26/2761 1585/8/2761 +f 1549/53/2762 1585/74/2762 1576/73/2762 +f 1565/59/1191 1568/75/1191 1576/94/1191 +f 1579/77/1191 1578/99/1191 1575/76/1191 +f 1585/51/1191 1576/52/1191 1579/27/1191 +f 1565/65/2763 1585/25/2763 1549/7/2763 +f 1569/28/2763 1587/100/2763 1575/26/2763 +f 1564/20/2764 1565/65/2764 1549/7/2764 +f 1569/28/2765 1575/26/2765 1567/19/2765 +f 1564/20/2766 1549/7/2766 1567/19/2766 +f 1574/80/2767 1572/63/2767 1565/70/2767 +f 1575/72/2768 1573/68/2768 1577/67/2768 +f 1580/82/1195 1583/11/1195 1586/36/1195 +f 1587/83/2769 1601/47/2769 1602/30/2769 +f 1593/26/2770 1590/65/2770 1592/8/2770 +f 1590/65/2771 1584/10/2771 1592/8/2771 +f 1593/26/1197 1592/8/1197 1601/6/1197 +f 1588/86/1198 1590/97/1198 1593/85/1198 +f 1586/19/2772 1594/26/2772 1587/28/2772 +f 1594/26/2773 1601/100/2773 1587/28/2773 +f 1592/25/2774 1584/65/2774 1579/7/2774 +f 1584/65/2775 1582/20/2775 1579/7/2775 +f 1586/19/2776 1587/28/2776 1579/7/2776 +f 1581/81/2777 1580/88/2777 1582/96/2777 +f 1591/90/2778 1594/89/2778 1586/4/2778 +f 1591/27/2779 1602/6/2779 1589/26/2779 +f 1602/6/2779 1603/8/2779 1589/26/2779 +f 1603/8/2780 1581/10/2780 1588/65/2780 +f 1603/91/2781 1592/95/2781 1579/41/2781 +f 1581/93/1204 1584/92/1204 1592/99/1204 +f 1602/78/1204 1601/76/1204 1594/94/1204 +f 1601/83/1205 1592/84/1205 1603/91/1205 +f 1581/65/2782 1603/25/2782 1576/7/2782 +f 1585/28/2783 1602/100/2783 1591/26/2783 +f 1580/20/2784 1581/65/2784 1576/7/2784 +f 1585/28/2785 1591/26/2785 1583/19/2785 +f 1580/20/2786 1576/7/2786 1583/19/2786 +f 1590/96/2787 1588/88/2787 1581/85/2787 +f 1591/90/2788 1589/97/2788 1593/86/2788 +f 1595/46/1209 1599/80/1209 1604/63/1209 +f 1592/29/2789 1611/64/2789 1597/79/2789 +f 1609/26/2790 1607/65/2790 1619/8/2790 +f 1607/65/2791 1600/10/2791 1619/8/2791 +f 1611/6/1211 1610/27/1211 1609/26/1211 +f 1605/68/1212 1607/67/1212 1609/98/1212 +f 1604/19/2792 1610/26/2792 1592/28/2792 +f 1610/26/2793 1611/100/2793 1592/28/2793 +f 1619/25/2794 1600/65/2794 1603/7/2794 +f 1600/65/2795 1598/20/2795 1603/7/2795 +f 1604/19/2796 1592/28/2796 1603/7/2796 +f 1600/69/2797 1596/70/2797 1595/66/2797 +f 1599/15/2798 1608/72/2798 1610/71/2798 +f 1618/8/2799 1596/10/2799 1605/65/2799 +f 1605/65/2800 1606/26/2800 1618/8/2800 +f 1606/26/1216 1608/27/1216 1597/6/1216 +f 1618/74/2801 1619/73/2801 1603/48/2801 +f 1596/59/1218 1600/75/1218 1619/94/1218 +f 1611/77/1218 1610/99/1218 1608/76/1218 +f 1597/41/1218 1618/51/1218 1619/52/1218 +f 1596/65/2802 1618/25/2802 1602/7/2802 +f 1601/28/2803 1597/100/2803 1608/26/2803 +f 1595/20/2804 1596/65/2804 1602/7/2804 +f 1601/28/2805 1608/26/2805 1599/19/2805 +f 1595/20/2806 1602/7/2806 1599/19/2806 +f 1607/80/2807 1605/63/2807 1596/70/2807 +f 1608/72/2808 1606/68/2808 1609/67/2808 +f 1612/82/1222 1616/11/1222 1620/36/1222 +f 1618/84/2809 1597/83/2809 1629/47/2809 +f 1627/26/1224 1623/65/1224 1629/6/1224 +f 1623/65/1224 1617/10/1224 1626/8/1224 +f 1626/8/1224 1629/6/1224 1623/65/1224 +f 1622/87/1225 1621/86/1225 1623/97/1225 +f 1620/19/2810 1628/26/2810 1597/28/2810 +f 1628/26/2811 1629/100/2811 1597/28/2811 +f 1626/25/2812 1617/65/2812 1611/7/2812 +f 1617/65/2813 1615/20/2813 1611/7/2813 +f 1620/19/2814 1597/28/2814 1611/7/2814 +f 1617/82/2815 1613/81/2815 1612/88/2815 +f 1616/37/2816 1624/90/2816 1628/89/2816 +f 1624/27/1229 1614/6/1229 1622/26/1229 +f 1614/6/1229 1625/8/1229 1621/65/1229 +f 1622/26/1229 1614/6/1229 1621/65/1229 +f 1619/27/2817 1625/91/2817 1626/95/2817 +f 1613/93/1225 1617/92/1225 1626/99/1225 +f 1629/76/1225 1628/94/1225 1624/75/1225 +f 1629/83/1231 1626/84/1231 1625/91/1231 +f 1613/65/2818 1625/25/2818 1619/7/2818 +f 1618/28/2819 1614/100/2819 1624/26/2819 +f 1612/20/2820 1613/65/2820 1619/7/2820 +f 1618/28/2821 1624/26/2821 1616/19/2821 +f 1612/20/2822 1619/7/2822 1616/19/2822 +f 1621/88/1233 1613/85/1233 1617/87/1233 +f 1622/97/1234 1627/86/1234 1628/89/1234 diff --git a/mods/everness/models/everness_cursed_hands.obj b/mods/everness/models/everness_cursed_hands.obj new file mode 100644 index 0000000..201bc22 --- /dev/null +++ b/mods/everness/models/everness_cursed_hands.obj @@ -0,0 +1,1085 @@ +mtllib everness_cursed_hands.mtl +o CursedHands +v -0.7239 -0.5769 -0.1229 +v -0.6302 -0.6311 -0.1854 +v -0.3302 -0.1114 -0.1854 +v -0.4239 -0.0573 -0.1229 +v -0.6698 -0.6082 -0.0146 +v -0.5761 -0.6623 -0.0771 +v -0.2761 -0.1427 -0.0771 +v -0.3698 -0.0886 -0.0146 +v -0.5448 0.0124 -0.1145 +v -0.3104 -0.1229 -0.2708 +v -0.2791 -0.0688 -0.2708 +v -0.5135 0.0666 -0.1145 +v -0.4365 -0.0501 0.1020 +v -0.2021 -0.1854 -0.0542 +v -0.1709 -0.1312 -0.0542 +v -0.4052 0.0041 0.1020 +v -0.2833 -0.1385 -0.2166 +v -0.2364 -0.1656 -0.2479 +v -0.1427 -0.0032 -0.2479 +v -0.1896 0.0239 -0.2166 +v -0.2292 -0.1698 -0.1084 +v -0.1823 -0.1968 -0.1396 +v -0.0886 -0.0344 -0.1396 +v -0.1354 -0.0074 -0.1084 +v -0.5676 0.0978 -0.2228 +v -0.5208 0.0708 -0.2540 +v -0.4895 0.1249 -0.2540 +v -0.5364 0.1519 -0.2228 +v -0.5135 0.0666 -0.1145 +v -0.4666 0.0395 -0.1458 +v -0.4354 0.0936 -0.1458 +v -0.4823 0.1207 -0.1145 +v -0.5634 0.1676 -0.2769 +v -0.5166 0.1405 -0.3081 +v -0.4541 0.2488 -0.3081 +v -0.5009 0.2758 -0.2769 +v -0.5093 0.1363 -0.1686 +v -0.4624 0.1093 -0.1999 +v -0.3999 0.2175 -0.1999 +v -0.4468 0.2446 -0.1686 +v -0.5009 0.2758 -0.2769 +v -0.4541 0.2488 -0.3081 +v -0.3916 0.3570 -0.3081 +v -0.4384 0.3841 -0.2769 +v -0.4739 0.2602 -0.2228 +v -0.4270 0.2331 -0.2540 +v -0.3645 0.3414 -0.2540 +v -0.4114 0.3684 -0.2228 +v -0.4739 0.0437 -0.2853 +v -0.4270 0.0166 -0.3165 +v -0.3958 0.0708 -0.3165 +v -0.4426 0.0978 -0.2853 +v -0.4198 0.0124 -0.1770 +v -0.3729 -0.0146 -0.2083 +v -0.3416 0.0395 -0.2083 +v -0.3885 0.0666 -0.1770 +v -0.4697 0.1134 -0.3394 +v -0.4228 0.0864 -0.3706 +v -0.3603 0.1946 -0.3706 +v -0.4072 0.2217 -0.3394 +v -0.4156 0.0822 -0.2311 +v -0.3687 0.0551 -0.2624 +v -0.3062 0.1634 -0.2624 +v -0.3531 0.1904 -0.2311 +v -0.4072 0.2217 -0.3394 +v -0.3603 0.1946 -0.3706 +v -0.2978 0.3029 -0.3706 +v -0.3447 0.3299 -0.3394 +v -0.3801 0.2061 -0.2853 +v -0.3333 0.1790 -0.3165 +v -0.2708 0.2873 -0.3165 +v -0.3176 0.3143 -0.2853 +v -0.3801 -0.0104 -0.3478 +v -0.3333 -0.0375 -0.3790 +v -0.3020 0.0166 -0.3790 +v -0.3489 0.0437 -0.3478 +v -0.3260 -0.0417 -0.2395 +v -0.2791 -0.0688 -0.2708 +v -0.2479 -0.0146 -0.2708 +v -0.2948 0.0124 -0.2395 +v -0.3759 0.0593 -0.4019 +v -0.3291 0.0323 -0.4331 +v -0.2666 0.1405 -0.4331 +v -0.3134 0.1676 -0.4019 +v -0.3218 0.0281 -0.2936 +v -0.2749 0.0010 -0.3249 +v -0.2124 0.1093 -0.3249 +v -0.2593 0.1363 -0.2936 +v -0.3134 0.1676 -0.4019 +v -0.2666 0.1405 -0.4331 +v -0.2041 0.2488 -0.4331 +v -0.2509 0.2758 -0.4019 +v -0.2864 0.1519 -0.3478 +v -0.2395 0.1249 -0.3790 +v -0.1770 0.2331 -0.3790 +v -0.2239 0.2602 -0.3478 +v 0.6302 -0.6311 -0.1854 +v 0.7239 -0.5769 -0.1229 +v 0.4239 -0.0573 -0.1229 +v 0.3302 -0.1114 -0.1854 +v 0.5761 -0.6623 -0.0771 +v 0.6698 -0.6082 -0.0146 +v 0.3698 -0.0886 -0.0146 +v 0.2761 -0.1427 -0.0771 +v 0.3104 -0.1229 -0.2708 +v 0.5448 0.0124 -0.1145 +v 0.5135 0.0666 -0.1145 +v 0.2791 -0.0688 -0.2708 +v 0.2021 -0.1854 -0.0542 +v 0.4365 -0.0501 0.1020 +v 0.4052 0.0041 0.1020 +v 0.1709 -0.1312 -0.0542 +v 0.2364 -0.1656 -0.2479 +v 0.2833 -0.1385 -0.2166 +v 0.1896 0.0239 -0.2166 +v 0.1427 -0.0032 -0.2479 +v 0.1823 -0.1968 -0.1396 +v 0.2292 -0.1698 -0.1084 +v 0.1354 -0.0074 -0.1084 +v 0.0886 -0.0344 -0.1396 +v 0.5208 0.0708 -0.2540 +v 0.5676 0.0978 -0.2228 +v 0.5364 0.1519 -0.2228 +v 0.4895 0.1249 -0.2540 +v 0.4666 0.0395 -0.1458 +v 0.5135 0.0666 -0.1145 +v 0.4823 0.1207 -0.1145 +v 0.4354 0.0936 -0.1458 +v 0.5166 0.1405 -0.3081 +v 0.5634 0.1676 -0.2769 +v 0.5009 0.2758 -0.2769 +v 0.4541 0.2488 -0.3081 +v 0.4624 0.1093 -0.1999 +v 0.5093 0.1363 -0.1686 +v 0.4468 0.2446 -0.1686 +v 0.3999 0.2175 -0.1999 +v 0.4541 0.2488 -0.3081 +v 0.5009 0.2758 -0.2769 +v 0.4384 0.3841 -0.2769 +v 0.3916 0.3570 -0.3081 +v 0.4270 0.2331 -0.2540 +v 0.4739 0.2602 -0.2228 +v 0.4114 0.3684 -0.2228 +v 0.3645 0.3414 -0.2540 +v 0.4270 0.0166 -0.3165 +v 0.4739 0.0437 -0.2853 +v 0.4426 0.0978 -0.2853 +v 0.3958 0.0708 -0.3165 +v 0.3729 -0.0146 -0.2083 +v 0.4198 0.0124 -0.1770 +v 0.3885 0.0666 -0.1770 +v 0.3416 0.0395 -0.2083 +v 0.4228 0.0864 -0.3706 +v 0.4697 0.1134 -0.3394 +v 0.4072 0.2217 -0.3394 +v 0.3603 0.1946 -0.3706 +v 0.3687 0.0551 -0.2624 +v 0.4156 0.0822 -0.2311 +v 0.3531 0.1904 -0.2311 +v 0.3062 0.1634 -0.2624 +v 0.3603 0.1946 -0.3706 +v 0.4072 0.2217 -0.3394 +v 0.3447 0.3299 -0.3394 +v 0.2978 0.3029 -0.3706 +v 0.3333 0.1790 -0.3165 +v 0.3801 0.2061 -0.2853 +v 0.3176 0.3143 -0.2853 +v 0.2708 0.2873 -0.3165 +v 0.3333 -0.0375 -0.3790 +v 0.3801 -0.0104 -0.3478 +v 0.3489 0.0437 -0.3478 +v 0.3020 0.0166 -0.3790 +v 0.2791 -0.0688 -0.2708 +v 0.3260 -0.0417 -0.2395 +v 0.2948 0.0124 -0.2395 +v 0.2479 -0.0146 -0.2708 +v 0.3291 0.0323 -0.4331 +v 0.3759 0.0593 -0.4019 +v 0.3134 0.1676 -0.4019 +v 0.2666 0.1405 -0.4331 +v 0.2749 0.0010 -0.3249 +v 0.3218 0.0281 -0.2936 +v 0.2593 0.1363 -0.2936 +v 0.2124 0.1093 -0.3249 +v 0.2666 0.1405 -0.4331 +v 0.3134 0.1676 -0.4019 +v 0.2509 0.2758 -0.4019 +v 0.2041 0.2488 -0.4331 +v 0.2395 0.1249 -0.3790 +v 0.2864 0.1519 -0.3478 +v 0.2239 0.2602 -0.3478 +v 0.1770 0.2331 -0.3790 +v -0.4500 0.0500 0.0000 +v 0.4500 0.0500 0.0000 +v 0.4500 0.9500 0.0000 +v -0.4500 0.9500 0.0000 +v -0.4500 0.0500 0.0100 +v 0.4500 0.0500 0.0100 +v 0.4500 0.9500 0.0100 +v -0.4500 0.9500 0.0100 +vt 0.0000 0.9219 +vt 0.0156 0.9219 +vt 0.0156 1.0000 +vt 0.0000 1.0000 +vt 0.0234 0.9219 +vt 0.0391 0.9219 +vt 0.0391 1.0000 +vt 0.0234 1.0000 +vt 0.0469 0.9219 +vt 0.0625 0.9219 +vt 0.0625 1.0000 +vt 0.0469 1.0000 +vt 0.0703 0.9219 +vt 0.0859 0.9219 +vt 0.0859 1.0000 +vt 0.0703 1.0000 +vt 0.0938 0.9844 +vt 0.1094 0.9844 +vt 0.1094 1.0000 +vt 0.0938 1.0000 +vt 0.1172 0.9844 +vt 0.1328 0.9844 +vt 0.1328 1.0000 +vt 0.1172 1.0000 +vt 0.1406 0.9922 +vt 0.1797 0.9922 +vt 0.1797 1.0000 +vt 0.1406 1.0000 +vt 0.1875 0.9922 +vt 0.2266 0.9922 +vt 0.2266 1.0000 +vt 0.1875 1.0000 +vt 0.2344 0.9922 +vt 0.2656 0.9922 +vt 0.2656 1.0000 +vt 0.2344 1.0000 +vt 0.2734 0.9922 +vt 0.3047 0.9922 +vt 0.3047 1.0000 +vt 0.2734 1.0000 +vt 0.3125 0.9688 +vt 0.3516 0.9688 +vt 0.3516 1.0000 +vt 0.3125 1.0000 +vt 0.3594 0.9688 +vt 0.3984 0.9688 +vt 0.3984 1.0000 +vt 0.3594 1.0000 +vt 0.4062 0.9766 +vt 0.4141 0.9766 +vt 0.4141 1.0000 +vt 0.4062 1.0000 +vt 0.4219 0.9766 +vt 0.4297 0.9766 +vt 0.4297 1.0000 +vt 0.4219 1.0000 +vt 0.4375 0.9766 +vt 0.4531 0.9766 +vt 0.4531 1.0000 +vt 0.4375 1.0000 +vt 0.4609 0.9766 +vt 0.4766 0.9766 +vt 0.4766 1.0000 +vt 0.4609 1.0000 +vt 0.4844 0.9844 +vt 0.4922 0.9844 +vt 0.4922 1.0000 +vt 0.4844 1.0000 +vt 0.5000 0.9844 +vt 0.5078 0.9844 +vt 0.5078 1.0000 +vt 0.5000 1.0000 +vt 0.5156 0.9922 +vt 0.5234 0.9922 +vt 0.5234 1.0000 +vt 0.5156 1.0000 +vt 0.5312 0.9922 +vt 0.5391 0.9922 +vt 0.5391 1.0000 +vt 0.5312 1.0000 +vt 0.5469 0.9922 +vt 0.5625 0.9922 +vt 0.5625 1.0000 +vt 0.5469 1.0000 +vt 0.5703 0.9922 +vt 0.5859 0.9922 +vt 0.5859 1.0000 +vt 0.5703 1.0000 +vt 0.5938 0.9844 +vt 0.6016 0.9844 +vt 0.6016 1.0000 +vt 0.5938 1.0000 +vt 0.6094 0.9844 +vt 0.6172 0.9844 +vt 0.6172 1.0000 +vt 0.6094 1.0000 +vt 0.6250 0.9844 +vt 0.6328 0.9844 +vt 0.6328 1.0000 +vt 0.6250 1.0000 +vt 0.6406 0.9844 +vt 0.6484 0.9844 +vt 0.6484 1.0000 +vt 0.6406 1.0000 +vt 0.6562 0.9844 +vt 0.6719 0.9844 +vt 0.6719 1.0000 +vt 0.6562 1.0000 +vt 0.6797 0.9844 +vt 0.6953 0.9844 +vt 0.6953 1.0000 +vt 0.6797 1.0000 +vt 0.7031 0.9844 +vt 0.7109 0.9844 +vt 0.7109 1.0000 +vt 0.7031 1.0000 +vt 0.7188 0.9844 +vt 0.7266 0.9844 +vt 0.7266 1.0000 +vt 0.7188 1.0000 +vt 0.7344 0.9844 +vt 0.7422 0.9844 +vt 0.7422 1.0000 +vt 0.7344 1.0000 +vt 0.7500 0.9844 +vt 0.7578 0.9844 +vt 0.7578 1.0000 +vt 0.7500 1.0000 +vt 0.7656 0.9844 +vt 0.7734 0.9844 +vt 0.7734 1.0000 +vt 0.7656 1.0000 +vt 0.7812 0.9844 +vt 0.7891 0.9844 +vt 0.7891 1.0000 +vt 0.7812 1.0000 +vt 0.7969 0.9922 +vt 0.8047 0.9922 +vt 0.8047 1.0000 +vt 0.7969 1.0000 +vt 0.8125 0.9922 +vt 0.8203 0.9922 +vt 0.8203 1.0000 +vt 0.8125 1.0000 +vt 0.8281 0.9922 +vt 0.8359 0.9922 +vt 0.8359 1.0000 +vt 0.8281 1.0000 +vt 0.8438 0.9922 +vt 0.8516 0.9922 +vt 0.8516 1.0000 +vt 0.8438 1.0000 +vt 0.8594 0.9922 +vt 0.8750 0.9922 +vt 0.8750 1.0000 +vt 0.8594 1.0000 +vt 0.8828 0.9922 +vt 0.8984 0.9922 +vt 0.8984 1.0000 +vt 0.8828 1.0000 +vt 0.9062 0.9844 +vt 0.9141 0.9844 +vt 0.9141 1.0000 +vt 0.9062 1.0000 +vt 0.9219 0.9844 +vt 0.9297 0.9844 +vt 0.9297 1.0000 +vt 0.9219 1.0000 +vt 0.9375 0.9844 +vt 0.9453 0.9844 +vt 0.9453 1.0000 +vt 0.9375 1.0000 +vt 0.9531 0.9844 +vt 0.9609 0.9844 +vt 0.9609 1.0000 +vt 0.9531 1.0000 +vt 0.9688 0.9844 +vt 0.9844 0.9844 +vt 0.9844 1.0000 +vt 0.9688 1.0000 +vt 0.0000 0.8984 +vt 0.0156 0.8984 +vt 0.0156 0.9141 +vt 0.0000 0.9141 +vt 0.0234 0.8984 +vt 0.0312 0.8984 +vt 0.0312 0.9141 +vt 0.0234 0.9141 +vt 0.0391 0.8984 +vt 0.0469 0.8984 +vt 0.0469 0.9141 +vt 0.0391 0.9141 +vt 0.0547 0.8984 +vt 0.0625 0.8984 +vt 0.0625 0.9141 +vt 0.0547 0.9141 +vt 0.0703 0.8984 +vt 0.0781 0.8984 +vt 0.0781 0.9141 +vt 0.0703 0.9141 +vt 0.0859 0.8984 +vt 0.0938 0.8984 +vt 0.0938 0.9141 +vt 0.0859 0.9141 +vt 0.1016 0.8984 +vt 0.1094 0.8984 +vt 0.1094 0.9141 +vt 0.1016 0.9141 +vt 0.1172 0.9062 +vt 0.1250 0.9062 +vt 0.1250 0.9141 +vt 0.1172 0.9141 +vt 0.1328 0.9062 +vt 0.1406 0.9062 +vt 0.1406 0.9141 +vt 0.1328 0.9141 +vt 0.1484 0.9062 +vt 0.1562 0.9062 +vt 0.1562 0.9141 +vt 0.1484 0.9141 +vt 0.1641 0.9062 +vt 0.1719 0.9062 +vt 0.1719 0.9141 +vt 0.1641 0.9141 +vt 0.1797 0.9062 +vt 0.1953 0.9062 +vt 0.1953 0.9141 +vt 0.1797 0.9141 +vt 0.2031 0.9062 +vt 0.2188 0.9062 +vt 0.2188 0.9141 +vt 0.2031 0.9141 +vt 0.2266 0.8984 +vt 0.2344 0.8984 +vt 0.2344 0.9141 +vt 0.2266 0.9141 +vt 0.2422 0.8984 +vt 0.2500 0.8984 +vt 0.2500 0.9141 +vt 0.2422 0.9141 +vt 0.2578 0.8984 +vt 0.2656 0.8984 +vt 0.2656 0.9141 +vt 0.2578 0.9141 +vt 0.2734 0.8984 +vt 0.2812 0.8984 +vt 0.2812 0.9141 +vt 0.2734 0.9141 +vt 0.2891 0.8984 +vt 0.3047 0.8984 +vt 0.3047 0.9141 +vt 0.2891 0.9141 +vt 0.3125 0.8984 +vt 0.3281 0.8984 +vt 0.3281 0.9141 +vt 0.3125 0.9141 +vt 0.3359 0.8984 +vt 0.3438 0.8984 +vt 0.3438 0.9141 +vt 0.3359 0.9141 +vt 0.3516 0.8984 +vt 0.3594 0.8984 +vt 0.3594 0.9141 +vt 0.3516 0.9141 +vt 0.3672 0.8984 +vt 0.3750 0.8984 +vt 0.3750 0.9141 +vt 0.3672 0.9141 +vt 0.3828 0.8984 +vt 0.3906 0.8984 +vt 0.3906 0.9141 +vt 0.3828 0.9141 +vt 0.3984 0.8984 +vt 0.4062 0.8984 +vt 0.4062 0.9141 +vt 0.3984 0.9141 +vt 0.4141 0.8984 +vt 0.4219 0.8984 +vt 0.4219 0.9141 +vt 0.4141 0.9141 +vt 0.4297 0.9062 +vt 0.4375 0.9062 +vt 0.4375 0.9141 +vt 0.4297 0.9141 +vt 0.4453 0.9062 +vt 0.4531 0.9062 +vt 0.4531 0.9141 +vt 0.4453 0.9141 +vt 0.4609 0.8359 +vt 0.4766 0.8359 +vt 0.4766 0.9141 +vt 0.4609 0.9141 +vt 0.4844 0.8359 +vt 0.5000 0.8359 +vt 0.5000 0.9141 +vt 0.4844 0.9141 +vt 0.5078 0.8359 +vt 0.5234 0.8359 +vt 0.5234 0.9141 +vt 0.5078 0.9141 +vt 0.5312 0.8359 +vt 0.5469 0.8359 +vt 0.5469 0.9141 +vt 0.5312 0.9141 +vt 0.5547 0.8984 +vt 0.5703 0.8984 +vt 0.5703 0.9141 +vt 0.5547 0.9141 +vt 0.5781 0.8984 +vt 0.5938 0.8984 +vt 0.5938 0.9141 +vt 0.5781 0.9141 +vt 0.6016 0.9062 +vt 0.6406 0.9062 +vt 0.6406 0.9141 +vt 0.6016 0.9141 +vt 0.6484 0.9062 +vt 0.6875 0.9062 +vt 0.6875 0.9141 +vt 0.6484 0.9141 +vt 0.6953 0.9062 +vt 0.7266 0.9062 +vt 0.7266 0.9141 +vt 0.6953 0.9141 +vt 0.7344 0.9062 +vt 0.7656 0.9062 +vt 0.7656 0.9141 +vt 0.7344 0.9141 +vt 0.7734 0.8828 +vt 0.8125 0.8828 +vt 0.8125 0.9141 +vt 0.7734 0.9141 +vt 0.8203 0.8828 +vt 0.8594 0.8828 +vt 0.8594 0.9141 +vt 0.8203 0.9141 +vt 0.8672 0.8906 +vt 0.8750 0.8906 +vt 0.8750 0.9141 +vt 0.8672 0.9141 +vt 0.8828 0.8906 +vt 0.8906 0.8906 +vt 0.8906 0.9141 +vt 0.8828 0.9141 +vt 0.8984 0.8906 +vt 0.9141 0.8906 +vt 0.9141 0.9141 +vt 0.8984 0.9141 +vt 0.9219 0.8906 +vt 0.9375 0.8906 +vt 0.9375 0.9141 +vt 0.9219 0.9141 +vt 0.9453 0.8984 +vt 0.9531 0.8984 +vt 0.9531 0.9141 +vt 0.9453 0.9141 +vt 0.9609 0.8984 +vt 0.9688 0.8984 +vt 0.9688 0.9141 +vt 0.9609 0.9141 +vt 0.9766 0.9062 +vt 0.9844 0.9062 +vt 0.9844 0.9141 +vt 0.9766 0.9141 +vt 0.9922 0.9062 +vt 1.0000 0.9062 +vt 1.0000 0.9141 +vt 0.9922 0.9141 +vt 0.0000 0.8203 +vt 0.0156 0.8203 +vt 0.0156 0.8281 +vt 0.0000 0.8281 +vt 0.0234 0.8203 +vt 0.0391 0.8203 +vt 0.0391 0.8281 +vt 0.0234 0.8281 +vt 0.0469 0.8125 +vt 0.0547 0.8125 +vt 0.0547 0.8281 +vt 0.0469 0.8281 +vt 0.0625 0.8125 +vt 0.0703 0.8125 +vt 0.0703 0.8281 +vt 0.0625 0.8281 +vt 0.0781 0.8125 +vt 0.0859 0.8125 +vt 0.0859 0.8281 +vt 0.0781 0.8281 +vt 0.0938 0.8125 +vt 0.1016 0.8125 +vt 0.1016 0.8281 +vt 0.0938 0.8281 +vt 0.1094 0.8125 +vt 0.1250 0.8125 +vt 0.1250 0.8281 +vt 0.1094 0.8281 +vt 0.1328 0.8125 +vt 0.1484 0.8125 +vt 0.1484 0.8281 +vt 0.1328 0.8281 +vt 0.1562 0.8125 +vt 0.1641 0.8125 +vt 0.1641 0.8281 +vt 0.1562 0.8281 +vt 0.1719 0.8125 +vt 0.1797 0.8125 +vt 0.1797 0.8281 +vt 0.1719 0.8281 +vt 0.1875 0.8125 +vt 0.1953 0.8125 +vt 0.1953 0.8281 +vt 0.1875 0.8281 +vt 0.2031 0.8125 +vt 0.2109 0.8125 +vt 0.2109 0.8281 +vt 0.2031 0.8281 +vt 0.2188 0.8125 +vt 0.2266 0.8125 +vt 0.2266 0.8281 +vt 0.2188 0.8281 +vt 0.2344 0.8125 +vt 0.2422 0.8125 +vt 0.2422 0.8281 +vt 0.2344 0.8281 +vt 0.2500 0.8203 +vt 0.2578 0.8203 +vt 0.2578 0.8281 +vt 0.2500 0.8281 +vt 0.2656 0.8203 +vt 0.2734 0.8203 +vt 0.2734 0.8281 +vt 0.2656 0.8281 +vt 0.2812 0.8203 +vt 0.2891 0.8203 +vt 0.2891 0.8281 +vt 0.2812 0.8281 +vt 0.2969 0.8203 +vt 0.3047 0.8203 +vt 0.3047 0.8281 +vt 0.2969 0.8281 +vt 0.3125 0.8203 +vt 0.3281 0.8203 +vt 0.3281 0.8281 +vt 0.3125 0.8281 +vt 0.3359 0.8203 +vt 0.3516 0.8203 +vt 0.3516 0.8281 +vt 0.3359 0.8281 +vt 0.3594 0.8125 +vt 0.3672 0.8125 +vt 0.3672 0.8281 +vt 0.3594 0.8281 +vt 0.3750 0.8125 +vt 0.3828 0.8125 +vt 0.3828 0.8281 +vt 0.3750 0.8281 +vt 0.3906 0.8125 +vt 0.3984 0.8125 +vt 0.3984 0.8281 +vt 0.3906 0.8281 +vt 0.4062 0.8125 +vt 0.4141 0.8125 +vt 0.4141 0.8281 +vt 0.4062 0.8281 +vt 0.4219 0.8125 +vt 0.4375 0.8125 +vt 0.4375 0.8281 +vt 0.4219 0.8281 +vt 0.4453 0.8125 +vt 0.4609 0.8125 +vt 0.4609 0.8281 +vt 0.4453 0.8281 +vt 0.4688 0.8125 +vt 0.4766 0.8125 +vt 0.4766 0.8281 +vt 0.4688 0.8281 +vt 0.4844 0.8125 +vt 0.4922 0.8125 +vt 0.4922 0.8281 +vt 0.4844 0.8281 +vt 0.5000 0.8125 +vt 0.5078 0.8125 +vt 0.5078 0.8281 +vt 0.5000 0.8281 +vt 0.5156 0.8125 +vt 0.5234 0.8125 +vt 0.5234 0.8281 +vt 0.5156 0.8281 +vt 0.5312 0.8125 +vt 0.5391 0.8125 +vt 0.5391 0.8281 +vt 0.5312 0.8281 +vt 0.5469 0.8125 +vt 0.5547 0.8125 +vt 0.5547 0.8281 +vt 0.5469 0.8281 +vt 0.5625 0.8203 +vt 0.5703 0.8203 +vt 0.5703 0.8281 +vt 0.5625 0.8281 +vt 0.5781 0.8203 +vt 0.5859 0.8203 +vt 0.5859 0.8281 +vt 0.5781 0.8281 +vt 0.5938 0.8203 +vt 0.6016 0.8203 +vt 0.6016 0.8281 +vt 0.5938 0.8281 +vt 0.6094 0.8203 +vt 0.6172 0.8203 +vt 0.6172 0.8281 +vt 0.6094 0.8281 +vt 0.6250 0.8203 +vt 0.6406 0.8203 +vt 0.6406 0.8281 +vt 0.6250 0.8281 +vt 0.6484 0.8203 +vt 0.6641 0.8203 +vt 0.6641 0.8281 +vt 0.6484 0.8281 +vt 0.6719 0.8125 +vt 0.6797 0.8125 +vt 0.6797 0.8281 +vt 0.6719 0.8281 +vt 0.6875 0.8125 +vt 0.6953 0.8125 +vt 0.6953 0.8281 +vt 0.6875 0.8281 +vt 0.7031 0.8125 +vt 0.7109 0.8125 +vt 0.7109 0.8281 +vt 0.7031 0.8281 +vt 0.7188 0.8125 +vt 0.7266 0.8125 +vt 0.7266 0.8281 +vt 0.7188 0.8281 +vt 0.7344 0.8125 +vt 0.7500 0.8125 +vt 0.7500 0.8281 +vt 0.7344 0.8281 +vt 0.7578 0.8125 +vt 0.7734 0.8125 +vt 0.7734 0.8281 +vt 0.7578 0.8281 +vt 0.7812 0.8125 +vt 0.7891 0.8125 +vt 0.7891 0.8281 +vt 0.7812 0.8281 +vt 0.7969 0.8125 +vt 0.8047 0.8125 +vt 0.8047 0.8281 +vt 0.7969 0.8281 +vt 0.8125 0.8125 +vt 0.8203 0.8125 +vt 0.8203 0.8281 +vt 0.8125 0.8281 +vt 0.8281 0.8125 +vt 0.8359 0.8125 +vt 0.8359 0.8281 +vt 0.8281 0.8281 +vt 0.8438 0.8125 +vt 0.8516 0.8125 +vt 0.8516 0.8281 +vt 0.8438 0.8281 +vt 0.8594 0.8125 +vt 0.8672 0.8125 +vt 0.8672 0.8281 +vt 0.8594 0.8281 +vt 0.8750 0.8203 +vt 0.8828 0.8203 +vt 0.8828 0.8281 +vt 0.8750 0.8281 +vt 0.8906 0.8203 +vt 0.8984 0.8203 +vt 0.8984 0.8281 +vt 0.8906 0.8281 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vn -0.4330 0.2500 -0.8660 +vn 0.4330 -0.2500 0.8660 +vn -0.7500 0.4330 0.5000 +vn 0.7500 -0.4330 -0.5000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.4330 0.2500 -0.8660 +vn 0.4330 -0.2500 0.8660 +vn -0.7500 0.4330 0.5000 +vn 0.7500 -0.4330 -0.5000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.4330 0.2500 -0.8660 +vn 0.4330 -0.2500 0.8660 +vn -0.7500 0.4330 0.5000 +vn 0.7500 -0.4330 -0.5000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.4330 0.2500 -0.8660 +vn 0.4330 -0.2500 0.8660 +vn -0.7500 0.4330 0.5000 +vn 0.7500 -0.4330 -0.5000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.4330 0.2500 -0.8660 +vn 0.4330 -0.2500 0.8660 +vn -0.7500 0.4330 0.5000 +vn 0.7500 -0.4330 -0.5000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.4330 0.2500 -0.8660 +vn 0.4330 -0.2500 0.8660 +vn -0.7500 0.4330 0.5000 +vn 0.7500 -0.4330 -0.5000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.4330 0.2500 -0.8660 +vn 0.4330 -0.2500 0.8660 +vn -0.7500 0.4330 0.5000 +vn 0.7500 -0.4330 -0.5000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.4330 0.2500 -0.8660 +vn 0.4330 -0.2500 0.8660 +vn -0.7500 0.4330 0.5000 +vn 0.7500 -0.4330 -0.5000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.4330 0.2500 -0.8660 +vn 0.4330 -0.2500 0.8660 +vn -0.7500 0.4330 0.5000 +vn 0.7500 -0.4330 -0.5000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.4330 0.2500 -0.8660 +vn 0.4330 -0.2500 0.8660 +vn -0.7500 0.4330 0.5000 +vn 0.7500 -0.4330 -0.5000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.4330 0.2500 -0.8660 +vn 0.4330 -0.2500 0.8660 +vn -0.7500 0.4330 0.5000 +vn 0.7500 -0.4330 -0.5000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn -0.4330 0.2500 -0.8660 +vn 0.4330 -0.2500 0.8660 +vn -0.7500 0.4330 0.5000 +vn 0.7500 -0.4330 -0.5000 +vn 0.5000 0.8660 0.0000 +vn -0.5000 -0.8660 0.0000 +vn 0.4330 0.2500 -0.8660 +vn -0.4330 -0.2500 0.8660 +vn -0.7500 -0.4330 -0.5000 +vn 0.7500 0.4330 0.5000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.4330 0.2500 -0.8660 +vn -0.4330 -0.2500 0.8660 +vn -0.7500 -0.4330 -0.5000 +vn 0.7500 0.4330 0.5000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.4330 0.2500 -0.8660 +vn -0.4330 -0.2500 0.8660 +vn -0.7500 -0.4330 -0.5000 +vn 0.7500 0.4330 0.5000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.4330 0.2500 -0.8660 +vn -0.4330 -0.2500 0.8660 +vn -0.7500 -0.4330 -0.5000 +vn 0.7500 0.4330 0.5000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.4330 0.2500 -0.8660 +vn -0.4330 -0.2500 0.8660 +vn -0.7500 -0.4330 -0.5000 +vn 0.7500 0.4330 0.5000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.4330 0.2500 -0.8660 +vn -0.4330 -0.2500 0.8660 +vn -0.7500 -0.4330 -0.5000 +vn 0.7500 0.4330 0.5000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.4330 0.2500 -0.8660 +vn -0.4330 -0.2500 0.8660 +vn -0.7500 -0.4330 -0.5000 +vn 0.7500 0.4330 0.5000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.4330 0.2500 -0.8660 +vn -0.4330 -0.2500 0.8660 +vn -0.7500 -0.4330 -0.5000 +vn 0.7500 0.4330 0.5000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.4330 0.2500 -0.8660 +vn -0.4330 -0.2500 0.8660 +vn -0.7500 -0.4330 -0.5000 +vn 0.7500 0.4330 0.5000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.4330 0.2500 -0.8660 +vn -0.4330 -0.2500 0.8660 +vn -0.7500 -0.4330 -0.5000 +vn 0.7500 0.4330 0.5000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.4330 0.2500 -0.8660 +vn -0.4330 -0.2500 0.8660 +vn -0.7500 -0.4330 -0.5000 +vn 0.7500 0.4330 0.5000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.4330 0.2500 -0.8660 +vn -0.4330 -0.2500 0.8660 +vn -0.7500 -0.4330 -0.5000 +vn 0.7500 0.4330 0.5000 +vn -0.5000 0.8660 0.0000 +vn 0.5000 -0.8660 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +g bone +usemtl bone +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 6/5/2 5/6/2 8/7/2 7/8/2 +f 5/9/3 1/10/3 4/11/3 8/12/3 +f 2/13/4 6/14/4 7/15/4 3/16/4 +f 4/17/5 3/18/5 7/19/5 8/20/5 +f 5/21/6 6/22/6 2/23/6 1/24/6 +f 9/25/7 10/26/7 11/27/7 12/28/7 +f 14/29/8 13/30/8 16/31/8 15/32/8 +f 13/33/9 9/34/9 12/35/9 16/36/9 +f 10/37/10 14/38/10 15/39/10 11/40/10 +f 12/41/11 11/42/11 15/43/11 16/44/11 +f 13/45/12 14/46/12 10/47/12 9/48/12 +f 17/49/13 18/50/13 19/51/13 20/52/13 +f 22/53/14 21/54/14 24/55/14 23/56/14 +f 21/57/15 17/58/15 20/59/15 24/60/15 +f 18/61/16 22/62/16 23/63/16 19/64/16 +f 20/65/17 19/66/17 23/67/17 24/68/17 +f 21/69/18 22/70/18 18/71/18 17/72/18 +f 25/73/19 26/74/19 27/75/19 28/76/19 +f 30/77/20 29/78/20 32/79/20 31/80/20 +f 29/81/21 25/82/21 28/83/21 32/84/21 +f 26/85/22 30/86/22 31/87/22 27/88/22 +f 28/89/23 27/90/23 31/91/23 32/92/23 +f 29/93/24 30/94/24 26/95/24 25/96/24 +f 33/97/25 34/98/25 35/99/25 36/100/25 +f 38/101/26 37/102/26 40/103/26 39/104/26 +f 37/105/27 33/106/27 36/107/27 40/108/27 +f 34/109/28 38/110/28 39/111/28 35/112/28 +f 36/113/29 35/114/29 39/115/29 40/116/29 +f 37/117/30 38/118/30 34/119/30 33/120/30 +f 41/121/31 42/122/31 43/123/31 44/124/31 +f 46/125/32 45/126/32 48/127/32 47/128/32 +f 45/129/33 41/130/33 44/131/33 48/132/33 +f 42/133/34 46/134/34 47/135/34 43/136/34 +f 44/137/35 43/138/35 47/139/35 48/140/35 +f 45/141/36 46/142/36 42/143/36 41/144/36 +f 49/145/37 50/146/37 51/147/37 52/148/37 +f 54/149/38 53/150/38 56/151/38 55/152/38 +f 53/153/39 49/154/39 52/155/39 56/156/39 +f 50/157/40 54/158/40 55/159/40 51/160/40 +f 52/161/41 51/162/41 55/163/41 56/164/41 +f 53/165/42 54/166/42 50/167/42 49/168/42 +f 57/169/43 58/170/43 59/171/43 60/172/43 +f 62/173/44 61/174/44 64/175/44 63/176/44 +f 61/177/45 57/178/45 60/179/45 64/180/45 +f 58/181/46 62/182/46 63/183/46 59/184/46 +f 60/185/47 59/186/47 63/187/47 64/188/47 +f 61/189/48 62/190/48 58/191/48 57/192/48 +f 65/193/49 66/194/49 67/195/49 68/196/49 +f 70/197/50 69/198/50 72/199/50 71/200/50 +f 69/201/51 65/202/51 68/203/51 72/204/51 +f 66/205/52 70/206/52 71/207/52 67/208/52 +f 68/209/53 67/210/53 71/211/53 72/212/53 +f 69/213/54 70/214/54 66/215/54 65/216/54 +f 73/217/55 74/218/55 75/219/55 76/220/55 +f 78/221/56 77/222/56 80/223/56 79/224/56 +f 77/225/57 73/226/57 76/227/57 80/228/57 +f 74/229/58 78/230/58 79/231/58 75/232/58 +f 76/233/59 75/234/59 79/235/59 80/236/59 +f 77/237/60 78/238/60 74/239/60 73/240/60 +f 81/241/61 82/242/61 83/243/61 84/244/61 +f 86/245/62 85/246/62 88/247/62 87/248/62 +f 85/249/63 81/250/63 84/251/63 88/252/63 +f 82/253/64 86/254/64 87/255/64 83/256/64 +f 84/257/65 83/258/65 87/259/65 88/260/65 +f 85/261/66 86/262/66 82/263/66 81/264/66 +f 89/265/67 90/266/67 91/267/67 92/268/67 +f 94/269/68 93/270/68 96/271/68 95/272/68 +f 93/273/69 89/274/69 92/275/69 96/276/69 +f 90/277/70 94/278/70 95/279/70 91/280/70 +f 92/281/71 91/282/71 95/283/71 96/284/71 +f 93/285/72 94/286/72 90/287/72 89/288/72 +f 97/289/73 98/290/73 99/291/73 100/292/73 +f 102/293/74 101/294/74 104/295/74 103/296/74 +f 101/297/75 97/298/75 100/299/75 104/300/75 +f 98/301/76 102/302/76 103/303/76 99/304/76 +f 100/305/77 99/306/77 103/307/77 104/308/77 +f 101/309/78 102/310/78 98/311/78 97/312/78 +f 105/313/79 106/314/79 107/315/79 108/316/79 +f 110/317/80 109/318/80 112/319/80 111/320/80 +f 109/321/81 105/322/81 108/323/81 112/324/81 +f 106/325/82 110/326/82 111/327/82 107/328/82 +f 108/329/83 107/330/83 111/331/83 112/332/83 +f 109/333/84 110/334/84 106/335/84 105/336/84 +f 113/337/85 114/338/85 115/339/85 116/340/85 +f 118/341/86 117/342/86 120/343/86 119/344/86 +f 117/345/87 113/346/87 116/347/87 120/348/87 +f 114/349/88 118/350/88 119/351/88 115/352/88 +f 116/353/89 115/354/89 119/355/89 120/356/89 +f 117/357/90 118/358/90 114/359/90 113/360/90 +f 121/361/91 122/362/91 123/363/91 124/364/91 +f 126/365/92 125/366/92 128/367/92 127/368/92 +f 125/369/93 121/370/93 124/371/93 128/372/93 +f 122/373/94 126/374/94 127/375/94 123/376/94 +f 124/377/95 123/378/95 127/379/95 128/380/95 +f 125/381/96 126/382/96 122/383/96 121/384/96 +f 129/385/97 130/386/97 131/387/97 132/388/97 +f 134/389/98 133/390/98 136/391/98 135/392/98 +f 133/393/99 129/394/99 132/395/99 136/396/99 +f 130/397/100 134/398/100 135/399/100 131/400/100 +f 132/401/101 131/402/101 135/403/101 136/404/101 +f 133/405/102 134/406/102 130/407/102 129/408/102 +f 137/409/103 138/410/103 139/411/103 140/412/103 +f 142/413/104 141/414/104 144/415/104 143/416/104 +f 141/417/105 137/418/105 140/419/105 144/420/105 +f 138/421/106 142/422/106 143/423/106 139/424/106 +f 140/425/107 139/426/107 143/427/107 144/428/107 +f 141/429/108 142/430/108 138/431/108 137/432/108 +f 145/433/109 146/434/109 147/435/109 148/436/109 +f 150/437/110 149/438/110 152/439/110 151/440/110 +f 149/441/111 145/442/111 148/443/111 152/444/111 +f 146/445/112 150/446/112 151/447/112 147/448/112 +f 148/449/113 147/450/113 151/451/113 152/452/113 +f 149/453/114 150/454/114 146/455/114 145/456/114 +f 153/457/115 154/458/115 155/459/115 156/460/115 +f 158/461/116 157/462/116 160/463/116 159/464/116 +f 157/465/117 153/466/117 156/467/117 160/468/117 +f 154/469/118 158/470/118 159/471/118 155/472/118 +f 156/473/119 155/474/119 159/475/119 160/476/119 +f 157/477/120 158/478/120 154/479/120 153/480/120 +f 161/481/121 162/482/121 163/483/121 164/484/121 +f 166/485/122 165/486/122 168/487/122 167/488/122 +f 165/489/123 161/490/123 164/491/123 168/492/123 +f 162/493/124 166/494/124 167/495/124 163/496/124 +f 164/497/125 163/498/125 167/499/125 168/500/125 +f 165/501/126 166/502/126 162/503/126 161/504/126 +f 169/505/127 170/506/127 171/507/127 172/508/127 +f 174/509/128 173/510/128 176/511/128 175/512/128 +f 173/513/129 169/514/129 172/515/129 176/516/129 +f 170/517/130 174/518/130 175/519/130 171/520/130 +f 172/521/131 171/522/131 175/523/131 176/524/131 +f 173/525/132 174/526/132 170/527/132 169/528/132 +f 177/529/133 178/530/133 179/531/133 180/532/133 +f 182/533/134 181/534/134 184/535/134 183/536/134 +f 181/537/135 177/538/135 180/539/135 184/540/135 +f 178/541/136 182/542/136 183/543/136 179/544/136 +f 180/545/137 179/546/137 183/547/137 184/548/137 +f 181/549/138 182/550/138 178/551/138 177/552/138 +f 185/553/139 186/554/139 187/555/139 188/556/139 +f 190/557/140 189/558/140 192/559/140 191/560/140 +f 189/561/141 185/562/141 188/563/141 192/564/141 +f 186/565/142 190/566/142 191/567/142 187/568/142 +f 188/569/143 187/570/143 191/571/143 192/572/143 +f 189/573/144 190/574/144 186/575/144 185/576/144 +g energy_core +usemtl energy_core +s off +f 197/577/145 198/578/145 199/579/145 200/580/145 +f 198/578/146 197/577/146 200/580/146 199/579/146 +g energy_glow +usemtl energy_glow +s off +f 193/577/145 194/578/145 195/579/145 196/580/145 +f 194/578/146 193/577/146 196/580/146 195/579/146 diff --git a/mods/everness/models/everness_cursed_ribs.obj b/mods/everness/models/everness_cursed_ribs.obj new file mode 100644 index 0000000..ff5d25e --- /dev/null +++ b/mods/everness/models/everness_cursed_ribs.obj @@ -0,0 +1,1324 @@ +mtllib everness_cursed_ribs.mtl +o CursedRibs +v -0.0625 -0.5 -0.4375 +v 0.0625 -0.5 -0.4375 +v 0.0625 -0.375 -0.4375 +v -0.0625 -0.375 -0.4375 +v -0.0625 -0.5 -0.3125 +v 0.0625 -0.5 -0.3125 +v 0.0625 -0.375 -0.3125 +v -0.0625 -0.375 -0.3125 +v -0.0625 -0.5 -0.2875 +v 0.0625 -0.5 -0.2875 +v 0.0625 -0.375 -0.2875 +v -0.0625 -0.375 -0.2875 +v -0.0625 -0.5 -0.16249999999999998 +v 0.0625 -0.5 -0.16249999999999998 +v 0.0625 -0.375 -0.16249999999999998 +v -0.0625 -0.375 -0.16249999999999998 +v -0.0625 -0.5 -0.1375 +v 0.0625 -0.5 -0.1375 +v 0.0625 -0.375 -0.1375 +v -0.0625 -0.375 -0.1375 +v -0.0625 -0.5 -0.012500000000000011 +v 0.0625 -0.5 -0.012500000000000011 +v 0.0625 -0.375 -0.012500000000000011 +v -0.0625 -0.375 -0.012500000000000011 +v -0.0625 -0.5 0.012499999999999956 +v 0.0625 -0.5 0.012499999999999956 +v 0.0625 -0.375 0.012499999999999956 +v -0.0625 -0.375 0.012499999999999956 +v -0.0625 -0.5 0.13749999999999996 +v 0.0625 -0.5 0.13749999999999996 +v 0.0625 -0.375 0.13749999999999996 +v -0.0625 -0.375 0.13749999999999996 +v -0.0625 -0.5 0.16249999999999998 +v 0.0625 -0.5 0.16249999999999998 +v 0.0625 -0.375 0.16249999999999998 +v -0.0625 -0.375 0.16249999999999998 +v -0.0625 -0.5 0.2875 +v 0.0625 -0.5 0.2875 +v 0.0625 -0.375 0.2875 +v -0.0625 -0.375 0.2875 +v -0.0625 -0.5 0.3125 +v 0.0625 -0.5 0.3125 +v 0.0625 -0.375 0.3125 +v -0.0625 -0.375 0.3125 +v -0.0625 -0.5 0.4375 +v 0.0625 -0.5 0.4375 +v 0.0625 -0.375 0.4375 +v -0.0625 -0.375 0.4375 +v -0.1875 -0.5 -0.25625 +v -0.0625 -0.5 -0.25625 +v -0.0625 -0.375 -0.25625 +v -0.1875 -0.375 -0.25625 +v -0.1875 -0.5 -0.19374999999999998 +v -0.0625 -0.5 -0.19374999999999998 +v -0.0625 -0.375 -0.19374999999999998 +v -0.1875 -0.375 -0.19374999999999998 +v -0.3125 -0.375 -0.25625 +v -0.1875 -0.375 -0.25625 +v -0.1875 -0.125 -0.25625 +v -0.3125 -0.125 -0.25625 +v -0.3125 -0.375 -0.19374999999999998 +v -0.1875 -0.375 -0.19374999999999998 +v -0.1875 -0.125 -0.19374999999999998 +v -0.3125 -0.125 -0.19374999999999998 +v -0.25 -0.125 -0.25625 +v -0.125 -0.125 -0.25625 +v -0.125 0.125 -0.25625 +v -0.25 0.125 -0.25625 +v -0.25 -0.125 -0.19374999999999998 +v -0.125 -0.125 -0.19374999999999998 +v -0.125 0.125 -0.19374999999999998 +v -0.25 0.125 -0.19374999999999998 +v 0.0625 -0.5 -0.25625 +v 0.1875 -0.5 -0.25625 +v 0.1875 -0.375 -0.25625 +v 0.0625 -0.375 -0.25625 +v 0.0625 -0.5 -0.19374999999999998 +v 0.1875 -0.5 -0.19374999999999998 +v 0.1875 -0.375 -0.19374999999999998 +v 0.0625 -0.375 -0.19374999999999998 +v 0.1875 -0.375 -0.25625 +v 0.3125 -0.375 -0.25625 +v 0.3125 -0.125 -0.25625 +v 0.1875 -0.125 -0.25625 +v 0.1875 -0.375 -0.19374999999999998 +v 0.3125 -0.375 -0.19374999999999998 +v 0.3125 -0.125 -0.19374999999999998 +v 0.1875 -0.125 -0.19374999999999998 +v 0.125 -0.125 -0.25625 +v 0.25 -0.125 -0.25625 +v 0.25 0.125 -0.25625 +v 0.125 0.125 -0.25625 +v 0.125 -0.125 -0.19374999999999998 +v 0.25 -0.125 -0.19374999999999998 +v 0.25 0.125 -0.19374999999999998 +v 0.125 0.125 -0.19374999999999998 +v -0.1875 -0.5 -0.10625000000000001 +v -0.0625 -0.5 -0.10625000000000001 +v -0.0625 -0.375 -0.10625000000000001 +v -0.1875 -0.375 -0.10625000000000001 +v -0.1875 -0.5 -0.04375000000000001 +v -0.0625 -0.5 -0.04375000000000001 +v -0.0625 -0.375 -0.04375000000000001 +v -0.1875 -0.375 -0.04375000000000001 +v -0.3125 -0.375 -0.10625000000000001 +v -0.1875 -0.375 -0.10625000000000001 +v -0.1875 -0.125 -0.10625000000000001 +v -0.3125 -0.125 -0.10625000000000001 +v -0.3125 -0.375 -0.04375000000000001 +v -0.1875 -0.375 -0.04375000000000001 +v -0.1875 -0.125 -0.04375000000000001 +v -0.3125 -0.125 -0.04375000000000001 +v -0.25 -0.125 -0.10625000000000001 +v -0.125 -0.125 -0.10625000000000001 +v -0.125 0.125 -0.10625000000000001 +v -0.25 0.125 -0.10625000000000001 +v -0.25 -0.125 -0.04375000000000001 +v -0.125 -0.125 -0.04375000000000001 +v -0.125 0.125 -0.04375000000000001 +v -0.25 0.125 -0.04375000000000001 +v 0.0625 -0.5 -0.10625000000000001 +v 0.1875 -0.5 -0.10625000000000001 +v 0.1875 -0.375 -0.10625000000000001 +v 0.0625 -0.375 -0.10625000000000001 +v 0.0625 -0.5 -0.04375000000000001 +v 0.1875 -0.5 -0.04375000000000001 +v 0.1875 -0.375 -0.04375000000000001 +v 0.0625 -0.375 -0.04375000000000001 +v 0.1875 -0.375 -0.10625000000000001 +v 0.3125 -0.375 -0.10625000000000001 +v 0.3125 -0.125 -0.10625000000000001 +v 0.1875 -0.125 -0.10625000000000001 +v 0.1875 -0.375 -0.04375000000000001 +v 0.3125 -0.375 -0.04375000000000001 +v 0.3125 -0.125 -0.04375000000000001 +v 0.1875 -0.125 -0.04375000000000001 +v 0.125 -0.125 -0.10625000000000001 +v 0.25 -0.125 -0.10625000000000001 +v 0.25 0.125 -0.10625000000000001 +v 0.125 0.125 -0.10625000000000001 +v 0.125 -0.125 -0.04375000000000001 +v 0.25 -0.125 -0.04375000000000001 +v 0.25 0.125 -0.04375000000000001 +v 0.125 0.125 -0.04375000000000001 +v -0.1875 -0.5 0.043749999999999956 +v -0.0625 -0.5 0.043749999999999956 +v -0.0625 -0.375 0.043749999999999956 +v -0.1875 -0.375 0.043749999999999956 +v -0.1875 -0.5 0.10624999999999996 +v -0.0625 -0.5 0.10624999999999996 +v -0.0625 -0.375 0.10624999999999996 +v -0.1875 -0.375 0.10624999999999996 +v -0.3125 -0.375 0.043749999999999956 +v -0.1875 -0.375 0.043749999999999956 +v -0.1875 -0.125 0.043749999999999956 +v -0.3125 -0.125 0.043749999999999956 +v -0.3125 -0.375 0.10624999999999996 +v -0.1875 -0.375 0.10624999999999996 +v -0.1875 -0.125 0.10624999999999996 +v -0.3125 -0.125 0.10624999999999996 +v -0.25 -0.125 0.043749999999999956 +v -0.125 -0.125 0.043749999999999956 +v -0.125 0.125 0.043749999999999956 +v -0.25 0.125 0.043749999999999956 +v -0.25 -0.125 0.10624999999999996 +v -0.125 -0.125 0.10624999999999996 +v -0.125 0.125 0.10624999999999996 +v -0.25 0.125 0.10624999999999996 +v 0.0625 -0.5 0.043749999999999956 +v 0.1875 -0.5 0.043749999999999956 +v 0.1875 -0.375 0.043749999999999956 +v 0.0625 -0.375 0.043749999999999956 +v 0.0625 -0.5 0.10624999999999996 +v 0.1875 -0.5 0.10624999999999996 +v 0.1875 -0.375 0.10624999999999996 +v 0.0625 -0.375 0.10624999999999996 +v 0.1875 -0.375 0.043749999999999956 +v 0.3125 -0.375 0.043749999999999956 +v 0.3125 -0.125 0.043749999999999956 +v 0.1875 -0.125 0.043749999999999956 +v 0.1875 -0.375 0.10624999999999996 +v 0.3125 -0.375 0.10624999999999996 +v 0.3125 -0.125 0.10624999999999996 +v 0.1875 -0.125 0.10624999999999996 +v 0.125 -0.125 0.043749999999999956 +v 0.25 -0.125 0.043749999999999956 +v 0.25 0.125 0.043749999999999956 +v 0.125 0.125 0.043749999999999956 +v 0.125 -0.125 0.10624999999999996 +v 0.25 -0.125 0.10624999999999996 +v 0.25 0.125 0.10624999999999996 +v 0.125 0.125 0.10624999999999996 +v -0.1875 -0.5 0.19374999999999998 +v -0.0625 -0.5 0.19374999999999998 +v -0.0625 -0.375 0.19374999999999998 +v -0.1875 -0.375 0.19374999999999998 +v -0.1875 -0.5 0.25625 +v -0.0625 -0.5 0.25625 +v -0.0625 -0.375 0.25625 +v -0.1875 -0.375 0.25625 +v -0.3125 -0.375 0.19374999999999998 +v -0.1875 -0.375 0.19374999999999998 +v -0.1875 -0.125 0.19374999999999998 +v -0.3125 -0.125 0.19374999999999998 +v -0.3125 -0.375 0.25625 +v -0.1875 -0.375 0.25625 +v -0.1875 -0.125 0.25625 +v -0.3125 -0.125 0.25625 +v -0.25 -0.125 0.19374999999999998 +v -0.125 -0.125 0.19374999999999998 +v -0.125 0.125 0.19374999999999998 +v -0.25 0.125 0.19374999999999998 +v -0.25 -0.125 0.25625 +v -0.125 -0.125 0.25625 +v -0.125 0.125 0.25625 +v -0.25 0.125 0.25625 +v 0.0625 -0.5 0.19374999999999998 +v 0.1875 -0.5 0.19374999999999998 +v 0.1875 -0.375 0.19374999999999998 +v 0.0625 -0.375 0.19374999999999998 +v 0.0625 -0.5 0.25625 +v 0.1875 -0.5 0.25625 +v 0.1875 -0.375 0.25625 +v 0.0625 -0.375 0.25625 +v 0.1875 -0.375 0.19374999999999998 +v 0.3125 -0.375 0.19374999999999998 +v 0.3125 -0.125 0.19374999999999998 +v 0.1875 -0.125 0.19374999999999998 +v 0.1875 -0.375 0.25625 +v 0.3125 -0.375 0.25625 +v 0.3125 -0.125 0.25625 +v 0.1875 -0.125 0.25625 +v 0.125 -0.125 0.19374999999999998 +v 0.25 -0.125 0.19374999999999998 +v 0.25 0.125 0.19374999999999998 +v 0.125 0.125 0.19374999999999998 +v 0.125 -0.125 0.25625 +v 0.25 -0.125 0.25625 +v 0.25 0.125 0.25625 +v 0.125 0.125 0.25625 +vt 0.0 0.984375 +vt 0.015625 0.984375 +vt 0.015625 1.0 +vt 0.0 1.0 +vt 0.0234375 0.984375 +vt 0.0390625 0.984375 +vt 0.0390625 1.0 +vt 0.0234375 1.0 +vt 0.046875 0.984375 +vt 0.0625 0.984375 +vt 0.0625 1.0 +vt 0.046875 1.0 +vt 0.0703125 0.984375 +vt 0.0859375 0.984375 +vt 0.0859375 1.0 +vt 0.0703125 1.0 +vt 0.09375 0.984375 +vt 0.109375 0.984375 +vt 0.109375 1.0 +vt 0.09375 1.0 +vt 0.1171875 0.984375 +vt 0.1328125 0.984375 +vt 0.1328125 1.0 +vt 0.1171875 1.0 +vt 0.140625 0.984375 +vt 0.15625 0.984375 +vt 0.15625 1.0 +vt 0.140625 1.0 +vt 0.1640625 0.984375 +vt 0.1796875 0.984375 +vt 0.1796875 1.0 +vt 0.1640625 1.0 +vt 0.1875 0.984375 +vt 0.203125 0.984375 +vt 0.203125 1.0 +vt 0.1875 1.0 +vt 0.2109375 0.984375 +vt 0.2265625 0.984375 +vt 0.2265625 1.0 +vt 0.2109375 1.0 +vt 0.234375 0.984375 +vt 0.25 0.984375 +vt 0.25 1.0 +vt 0.234375 1.0 +vt 0.2578125 0.984375 +vt 0.2734375 0.984375 +vt 0.2734375 1.0 +vt 0.2578125 1.0 +vt 0.28125 0.984375 +vt 0.296875 0.984375 +vt 0.296875 1.0 +vt 0.28125 1.0 +vt 0.3046875 0.984375 +vt 0.3203125 0.984375 +vt 0.3203125 1.0 +vt 0.3046875 1.0 +vt 0.328125 0.984375 +vt 0.34375 0.984375 +vt 0.34375 1.0 +vt 0.328125 1.0 +vt 0.3515625 0.984375 +vt 0.3671875 0.984375 +vt 0.3671875 1.0 +vt 0.3515625 1.0 +vt 0.375 0.984375 +vt 0.390625 0.984375 +vt 0.390625 1.0 +vt 0.375 1.0 +vt 0.3984375 0.984375 +vt 0.4140625 0.984375 +vt 0.4140625 1.0 +vt 0.3984375 1.0 +vt 0.421875 0.984375 +vt 0.4375 0.984375 +vt 0.4375 1.0 +vt 0.421875 1.0 +vt 0.4453125 0.984375 +vt 0.4609375 0.984375 +vt 0.4609375 1.0 +vt 0.4453125 1.0 +vt 0.46875 0.984375 +vt 0.484375 0.984375 +vt 0.484375 1.0 +vt 0.46875 1.0 +vt 0.4921875 0.984375 +vt 0.5078125 0.984375 +vt 0.5078125 1.0 +vt 0.4921875 1.0 +vt 0.515625 0.984375 +vt 0.53125 0.984375 +vt 0.53125 1.0 +vt 0.515625 1.0 +vt 0.5390625 0.984375 +vt 0.5546875 0.984375 +vt 0.5546875 1.0 +vt 0.5390625 1.0 +vt 0.5625 0.984375 +vt 0.578125 0.984375 +vt 0.578125 1.0 +vt 0.5625 1.0 +vt 0.5859375 0.984375 +vt 0.6015625 0.984375 +vt 0.6015625 1.0 +vt 0.5859375 1.0 +vt 0.609375 0.984375 +vt 0.625 0.984375 +vt 0.625 1.0 +vt 0.609375 1.0 +vt 0.6328125 0.984375 +vt 0.6484375 0.984375 +vt 0.6484375 1.0 +vt 0.6328125 1.0 +vt 0.65625 0.984375 +vt 0.671875 0.984375 +vt 0.671875 1.0 +vt 0.65625 1.0 +vt 0.6796875 0.984375 +vt 0.6953125 0.984375 +vt 0.6953125 1.0 +vt 0.6796875 1.0 +vt 0.703125 0.984375 +vt 0.71875 0.984375 +vt 0.71875 1.0 +vt 0.703125 1.0 +vt 0.7265625 0.984375 +vt 0.7421875 0.984375 +vt 0.7421875 1.0 +vt 0.7265625 1.0 +vt 0.75 0.984375 +vt 0.765625 0.984375 +vt 0.765625 1.0 +vt 0.75 1.0 +vt 0.7734375 0.984375 +vt 0.7890625 0.984375 +vt 0.7890625 1.0 +vt 0.7734375 1.0 +vt 0.796875 0.984375 +vt 0.8125 0.984375 +vt 0.8125 1.0 +vt 0.796875 1.0 +vt 0.8203125 0.984375 +vt 0.8359375 0.984375 +vt 0.8359375 1.0 +vt 0.8203125 1.0 +vt 0.84375 0.984375 +vt 0.859375 0.984375 +vt 0.859375 1.0 +vt 0.84375 1.0 +vt 0.8671875 0.984375 +vt 0.8828125 0.984375 +vt 0.8828125 1.0 +vt 0.8671875 1.0 +vt 0.890625 0.984375 +vt 0.8984375 0.984375 +vt 0.8984375 1.0 +vt 0.890625 1.0 +vt 0.90625 0.984375 +vt 0.9140625 0.984375 +vt 0.9140625 1.0 +vt 0.90625 1.0 +vt 0.921875 0.9921875 +vt 0.9375 0.9921875 +vt 0.9375 1.0 +vt 0.921875 1.0 +vt 0.9453125 0.9921875 +vt 0.9609375 0.9921875 +vt 0.9609375 1.0 +vt 0.9453125 1.0 +vt 0.96875 0.96875 +vt 0.984375 0.96875 +vt 0.984375 1.0 +vt 0.96875 1.0 +vt 0.0 0.9296875 +vt 0.015625 0.9296875 +vt 0.015625 0.9609375 +vt 0.0 0.9609375 +vt 0.0234375 0.9296875 +vt 0.03125 0.9296875 +vt 0.03125 0.9609375 +vt 0.0234375 0.9609375 +vt 0.0390625 0.9296875 +vt 0.046875 0.9296875 +vt 0.046875 0.9609375 +vt 0.0390625 0.9609375 +vt 0.0546875 0.953125 +vt 0.0703125 0.953125 +vt 0.0703125 0.9609375 +vt 0.0546875 0.9609375 +vt 0.078125 0.953125 +vt 0.09375 0.953125 +vt 0.09375 0.9609375 +vt 0.078125 0.9609375 +vt 0.1015625 0.9296875 +vt 0.1171875 0.9296875 +vt 0.1171875 0.9609375 +vt 0.1015625 0.9609375 +vt 0.125 0.9296875 +vt 0.140625 0.9296875 +vt 0.140625 0.9609375 +vt 0.125 0.9609375 +vt 0.1484375 0.9296875 +vt 0.15625 0.9296875 +vt 0.15625 0.9609375 +vt 0.1484375 0.9609375 +vt 0.1640625 0.9296875 +vt 0.171875 0.9296875 +vt 0.171875 0.9609375 +vt 0.1640625 0.9609375 +vt 0.1796875 0.953125 +vt 0.1953125 0.953125 +vt 0.1953125 0.9609375 +vt 0.1796875 0.9609375 +vt 0.203125 0.953125 +vt 0.21875 0.953125 +vt 0.21875 0.9609375 +vt 0.203125 0.9609375 +vt 0.2265625 0.9453125 +vt 0.2421875 0.9453125 +vt 0.2421875 0.9609375 +vt 0.2265625 0.9609375 +vt 0.25 0.9453125 +vt 0.265625 0.9453125 +vt 0.265625 0.9609375 +vt 0.25 0.9609375 +vt 0.2734375 0.9453125 +vt 0.28125 0.9453125 +vt 0.28125 0.9609375 +vt 0.2734375 0.9609375 +vt 0.2890625 0.9453125 +vt 0.296875 0.9453125 +vt 0.296875 0.9609375 +vt 0.2890625 0.9609375 +vt 0.3046875 0.953125 +vt 0.3203125 0.953125 +vt 0.3203125 0.9609375 +vt 0.3046875 0.9609375 +vt 0.328125 0.953125 +vt 0.34375 0.953125 +vt 0.34375 0.9609375 +vt 0.328125 0.9609375 +vt 0.3515625 0.9296875 +vt 0.3671875 0.9296875 +vt 0.3671875 0.9609375 +vt 0.3515625 0.9609375 +vt 0.375 0.9296875 +vt 0.390625 0.9296875 +vt 0.390625 0.9609375 +vt 0.375 0.9609375 +vt 0.3984375 0.9296875 +vt 0.40625 0.9296875 +vt 0.40625 0.9609375 +vt 0.3984375 0.9609375 +vt 0.4140625 0.9296875 +vt 0.421875 0.9296875 +vt 0.421875 0.9609375 +vt 0.4140625 0.9609375 +vt 0.4296875 0.953125 +vt 0.4453125 0.953125 +vt 0.4453125 0.9609375 +vt 0.4296875 0.9609375 +vt 0.453125 0.953125 +vt 0.46875 0.953125 +vt 0.46875 0.9609375 +vt 0.453125 0.9609375 +vt 0.4765625 0.9296875 +vt 0.4921875 0.9296875 +vt 0.4921875 0.9609375 +vt 0.4765625 0.9609375 +vt 0.5 0.9296875 +vt 0.515625 0.9296875 +vt 0.515625 0.9609375 +vt 0.5 0.9609375 +vt 0.5234375 0.9296875 +vt 0.53125 0.9296875 +vt 0.53125 0.9609375 +vt 0.5234375 0.9609375 +vt 0.5390625 0.9296875 +vt 0.546875 0.9296875 +vt 0.546875 0.9609375 +vt 0.5390625 0.9609375 +vt 0.5546875 0.953125 +vt 0.5703125 0.953125 +vt 0.5703125 0.9609375 +vt 0.5546875 0.9609375 +vt 0.578125 0.953125 +vt 0.59375 0.953125 +vt 0.59375 0.9609375 +vt 0.578125 0.9609375 +vt 0.6015625 0.9453125 +vt 0.6171875 0.9453125 +vt 0.6171875 0.9609375 +vt 0.6015625 0.9609375 +vt 0.625 0.9453125 +vt 0.640625 0.9453125 +vt 0.640625 0.9609375 +vt 0.625 0.9609375 +vt 0.6484375 0.9453125 +vt 0.65625 0.9453125 +vt 0.65625 0.9609375 +vt 0.6484375 0.9609375 +vt 0.6640625 0.9453125 +vt 0.671875 0.9453125 +vt 0.671875 0.9609375 +vt 0.6640625 0.9609375 +vt 0.6796875 0.953125 +vt 0.6953125 0.953125 +vt 0.6953125 0.9609375 +vt 0.6796875 0.9609375 +vt 0.703125 0.953125 +vt 0.71875 0.953125 +vt 0.71875 0.9609375 +vt 0.703125 0.9609375 +vt 0.7265625 0.9296875 +vt 0.7421875 0.9296875 +vt 0.7421875 0.9609375 +vt 0.7265625 0.9609375 +vt 0.75 0.9296875 +vt 0.765625 0.9296875 +vt 0.765625 0.9609375 +vt 0.75 0.9609375 +vt 0.7734375 0.9296875 +vt 0.78125 0.9296875 +vt 0.78125 0.9609375 +vt 0.7734375 0.9609375 +vt 0.7890625 0.9296875 +vt 0.796875 0.9296875 +vt 0.796875 0.9609375 +vt 0.7890625 0.9609375 +vt 0.8046875 0.953125 +vt 0.8203125 0.953125 +vt 0.8203125 0.9609375 +vt 0.8046875 0.9609375 +vt 0.828125 0.953125 +vt 0.84375 0.953125 +vt 0.84375 0.9609375 +vt 0.828125 0.9609375 +vt 0.8515625 0.9296875 +vt 0.8671875 0.9296875 +vt 0.8671875 0.9609375 +vt 0.8515625 0.9609375 +vt 0.875 0.9296875 +vt 0.890625 0.9296875 +vt 0.890625 0.9609375 +vt 0.875 0.9609375 +vt 0.8984375 0.9296875 +vt 0.90625 0.9296875 +vt 0.90625 0.9609375 +vt 0.8984375 0.9609375 +vt 0.9140625 0.9296875 +vt 0.921875 0.9296875 +vt 0.921875 0.9609375 +vt 0.9140625 0.9609375 +vt 0.9296875 0.953125 +vt 0.9453125 0.953125 +vt 0.9453125 0.9609375 +vt 0.9296875 0.9609375 +vt 0.953125 0.953125 +vt 0.96875 0.953125 +vt 0.96875 0.9609375 +vt 0.953125 0.9609375 +vt 0.9765625 0.9453125 +vt 0.9921875 0.9453125 +vt 0.9921875 0.9609375 +vt 0.9765625 0.9609375 +vt 0.0 0.90625 +vt 0.015625 0.90625 +vt 0.015625 0.921875 +vt 0.0 0.921875 +vt 0.0234375 0.90625 +vt 0.03125 0.90625 +vt 0.03125 0.921875 +vt 0.0234375 0.921875 +vt 0.0390625 0.90625 +vt 0.046875 0.90625 +vt 0.046875 0.921875 +vt 0.0390625 0.921875 +vt 0.0546875 0.9140625 +vt 0.0703125 0.9140625 +vt 0.0703125 0.921875 +vt 0.0546875 0.921875 +vt 0.078125 0.9140625 +vt 0.09375 0.9140625 +vt 0.09375 0.921875 +vt 0.078125 0.921875 +vt 0.1015625 0.890625 +vt 0.1171875 0.890625 +vt 0.1171875 0.921875 +vt 0.1015625 0.921875 +vt 0.125 0.890625 +vt 0.140625 0.890625 +vt 0.140625 0.921875 +vt 0.125 0.921875 +vt 0.1484375 0.890625 +vt 0.15625 0.890625 +vt 0.15625 0.921875 +vt 0.1484375 0.921875 +vt 0.1640625 0.890625 +vt 0.171875 0.890625 +vt 0.171875 0.921875 +vt 0.1640625 0.921875 +vt 0.1796875 0.9140625 +vt 0.1953125 0.9140625 +vt 0.1953125 0.921875 +vt 0.1796875 0.921875 +vt 0.203125 0.9140625 +vt 0.21875 0.9140625 +vt 0.21875 0.921875 +vt 0.203125 0.921875 +vt 0.2265625 0.890625 +vt 0.2421875 0.890625 +vt 0.2421875 0.921875 +vt 0.2265625 0.921875 +vt 0.25 0.890625 +vt 0.265625 0.890625 +vt 0.265625 0.921875 +vt 0.25 0.921875 +vt 0.2734375 0.890625 +vt 0.28125 0.890625 +vt 0.28125 0.921875 +vt 0.2734375 0.921875 +vt 0.2890625 0.890625 +vt 0.296875 0.890625 +vt 0.296875 0.921875 +vt 0.2890625 0.921875 +vt 0.3046875 0.9140625 +vt 0.3203125 0.9140625 +vt 0.3203125 0.921875 +vt 0.3046875 0.921875 +vt 0.328125 0.9140625 +vt 0.34375 0.9140625 +vt 0.34375 0.921875 +vt 0.328125 0.921875 +vt 0.3515625 0.90625 +vt 0.3671875 0.90625 +vt 0.3671875 0.921875 +vt 0.3515625 0.921875 +vt 0.375 0.90625 +vt 0.390625 0.90625 +vt 0.390625 0.921875 +vt 0.375 0.921875 +vt 0.3984375 0.90625 +vt 0.40625 0.90625 +vt 0.40625 0.921875 +vt 0.3984375 0.921875 +vt 0.4140625 0.90625 +vt 0.421875 0.90625 +vt 0.421875 0.921875 +vt 0.4140625 0.921875 +vt 0.4296875 0.9140625 +vt 0.4453125 0.9140625 +vt 0.4453125 0.921875 +vt 0.4296875 0.921875 +vt 0.453125 0.9140625 +vt 0.46875 0.9140625 +vt 0.46875 0.921875 +vt 0.453125 0.921875 +vt 0.4765625 0.890625 +vt 0.4921875 0.890625 +vt 0.4921875 0.921875 +vt 0.4765625 0.921875 +vt 0.5 0.890625 +vt 0.515625 0.890625 +vt 0.515625 0.921875 +vt 0.5 0.921875 +vt 0.5234375 0.890625 +vt 0.53125 0.890625 +vt 0.53125 0.921875 +vt 0.5234375 0.921875 +vt 0.5390625 0.890625 +vt 0.546875 0.890625 +vt 0.546875 0.921875 +vt 0.5390625 0.921875 +vt 0.5546875 0.9140625 +vt 0.5703125 0.9140625 +vt 0.5703125 0.921875 +vt 0.5546875 0.921875 +vt 0.578125 0.9140625 +vt 0.59375 0.9140625 +vt 0.59375 0.921875 +vt 0.578125 0.921875 +vt 0.6015625 0.890625 +vt 0.6171875 0.890625 +vt 0.6171875 0.921875 +vt 0.6015625 0.921875 +vt 0.625 0.890625 +vt 0.640625 0.890625 +vt 0.640625 0.921875 +vt 0.625 0.921875 +vt 0.6484375 0.890625 +vt 0.65625 0.890625 +vt 0.65625 0.921875 +vt 0.6484375 0.921875 +vt 0.6640625 0.890625 +vt 0.671875 0.890625 +vt 0.671875 0.921875 +vt 0.6640625 0.921875 +vt 0.6796875 0.9140625 +vt 0.6953125 0.9140625 +vt 0.6953125 0.921875 +vt 0.6796875 0.921875 +vt 0.703125 0.9140625 +vt 0.71875 0.9140625 +vt 0.71875 0.921875 +vt 0.703125 0.921875 +vt 0.7265625 0.90625 +vt 0.7421875 0.90625 +vt 0.7421875 0.921875 +vt 0.7265625 0.921875 +vt 0.75 0.90625 +vt 0.765625 0.90625 +vt 0.765625 0.921875 +vt 0.75 0.921875 +vt 0.7734375 0.90625 +vt 0.78125 0.90625 +vt 0.78125 0.921875 +vt 0.7734375 0.921875 +vt 0.7890625 0.90625 +vt 0.796875 0.90625 +vt 0.796875 0.921875 +vt 0.7890625 0.921875 +vt 0.8046875 0.9140625 +vt 0.8203125 0.9140625 +vt 0.8203125 0.921875 +vt 0.8046875 0.921875 +vt 0.828125 0.9140625 +vt 0.84375 0.9140625 +vt 0.84375 0.921875 +vt 0.828125 0.921875 +vt 0.8515625 0.890625 +vt 0.8671875 0.890625 +vt 0.8671875 0.921875 +vt 0.8515625 0.921875 +vt 0.875 0.890625 +vt 0.890625 0.890625 +vt 0.890625 0.921875 +vt 0.875 0.921875 +vt 0.8984375 0.890625 +vt 0.90625 0.890625 +vt 0.90625 0.921875 +vt 0.8984375 0.921875 +vt 0.9140625 0.890625 +vt 0.921875 0.890625 +vt 0.921875 0.921875 +vt 0.9140625 0.921875 +vt 0.9296875 0.9140625 +vt 0.9453125 0.9140625 +vt 0.9453125 0.921875 +vt 0.9296875 0.921875 +vt 0.953125 0.9140625 +vt 0.96875 0.9140625 +vt 0.96875 0.921875 +vt 0.953125 0.921875 +vt 0.9765625 0.890625 +vt 0.9921875 0.890625 +vt 0.9921875 0.921875 +vt 0.9765625 0.921875 +vt 0.0 0.8515625 +vt 0.015625 0.8515625 +vt 0.015625 0.8828125 +vt 0.0 0.8828125 +vt 0.0234375 0.8515625 +vt 0.03125 0.8515625 +vt 0.03125 0.8828125 +vt 0.0234375 0.8828125 +vt 0.0390625 0.8515625 +vt 0.046875 0.8515625 +vt 0.046875 0.8828125 +vt 0.0390625 0.8828125 +vt 0.0546875 0.875 +vt 0.0703125 0.875 +vt 0.0703125 0.8828125 +vt 0.0546875 0.8828125 +vt 0.078125 0.875 +vt 0.09375 0.875 +vt 0.09375 0.8828125 +vt 0.078125 0.8828125 +vt 0.1015625 0.8671875 +vt 0.1171875 0.8671875 +vt 0.1171875 0.8828125 +vt 0.1015625 0.8828125 +vt 0.125 0.8671875 +vt 0.140625 0.8671875 +vt 0.140625 0.8828125 +vt 0.125 0.8828125 +vt 0.1484375 0.8671875 +vt 0.15625 0.8671875 +vt 0.15625 0.8828125 +vt 0.1484375 0.8828125 +vt 0.1640625 0.8671875 +vt 0.171875 0.8671875 +vt 0.171875 0.8828125 +vt 0.1640625 0.8828125 +vt 0.1796875 0.875 +vt 0.1953125 0.875 +vt 0.1953125 0.8828125 +vt 0.1796875 0.8828125 +vt 0.203125 0.875 +vt 0.21875 0.875 +vt 0.21875 0.8828125 +vt 0.203125 0.8828125 +vt 0.2265625 0.8515625 +vt 0.2421875 0.8515625 +vt 0.2421875 0.8828125 +vt 0.2265625 0.8828125 +vt 0.25 0.8515625 +vt 0.265625 0.8515625 +vt 0.265625 0.8828125 +vt 0.25 0.8828125 +vt 0.2734375 0.8515625 +vt 0.28125 0.8515625 +vt 0.28125 0.8828125 +vt 0.2734375 0.8828125 +vt 0.2890625 0.8515625 +vt 0.296875 0.8515625 +vt 0.296875 0.8828125 +vt 0.2890625 0.8828125 +vt 0.3046875 0.875 +vt 0.3203125 0.875 +vt 0.3203125 0.8828125 +vt 0.3046875 0.8828125 +vt 0.328125 0.875 +vt 0.34375 0.875 +vt 0.34375 0.8828125 +vt 0.328125 0.8828125 +vt 0.3515625 0.8515625 +vt 0.3671875 0.8515625 +vt 0.3671875 0.8828125 +vt 0.3515625 0.8828125 +vt 0.375 0.8515625 +vt 0.390625 0.8515625 +vt 0.390625 0.8828125 +vt 0.375 0.8828125 +vt 0.3984375 0.8515625 +vt 0.40625 0.8515625 +vt 0.40625 0.8828125 +vt 0.3984375 0.8828125 +vt 0.4140625 0.8515625 +vt 0.421875 0.8515625 +vt 0.421875 0.8828125 +vt 0.4140625 0.8828125 +vt 0.4296875 0.875 +vt 0.4453125 0.875 +vt 0.4453125 0.8828125 +vt 0.4296875 0.8828125 +vt 0.453125 0.875 +vt 0.46875 0.875 +vt 0.46875 0.8828125 +vt 0.453125 0.8828125 +vt 0.4765625 0.8671875 +vt 0.4921875 0.8671875 +vt 0.4921875 0.8828125 +vt 0.4765625 0.8828125 +vt 0.5 0.8671875 +vt 0.515625 0.8671875 +vt 0.515625 0.8828125 +vt 0.5 0.8828125 +vt 0.5234375 0.8671875 +vt 0.53125 0.8671875 +vt 0.53125 0.8828125 +vt 0.5234375 0.8828125 +vt 0.5390625 0.8671875 +vt 0.546875 0.8671875 +vt 0.546875 0.8828125 +vt 0.5390625 0.8828125 +vt 0.5546875 0.875 +vt 0.5703125 0.875 +vt 0.5703125 0.8828125 +vt 0.5546875 0.8828125 +vt 0.578125 0.875 +vt 0.59375 0.875 +vt 0.59375 0.8828125 +vt 0.578125 0.8828125 +vt 0.6015625 0.8515625 +vt 0.6171875 0.8515625 +vt 0.6171875 0.8828125 +vt 0.6015625 0.8828125 +vt 0.625 0.8515625 +vt 0.640625 0.8515625 +vt 0.640625 0.8828125 +vt 0.625 0.8828125 +vt 0.6484375 0.8515625 +vt 0.65625 0.8515625 +vt 0.65625 0.8828125 +vt 0.6484375 0.8828125 +vt 0.6640625 0.8515625 +vt 0.671875 0.8515625 +vt 0.671875 0.8828125 +vt 0.6640625 0.8828125 +vt 0.6796875 0.875 +vt 0.6953125 0.875 +vt 0.6953125 0.8828125 +vt 0.6796875 0.8828125 +vt 0.703125 0.875 +vt 0.71875 0.875 +vt 0.71875 0.8828125 +vt 0.703125 0.8828125 +vt 0.7265625 0.8515625 +vt 0.7421875 0.8515625 +vt 0.7421875 0.8828125 +vt 0.7265625 0.8828125 +vt 0.75 0.8515625 +vt 0.765625 0.8515625 +vt 0.765625 0.8828125 +vt 0.75 0.8828125 +vt 0.7734375 0.8515625 +vt 0.78125 0.8515625 +vt 0.78125 0.8828125 +vt 0.7734375 0.8828125 +vt 0.7890625 0.8515625 +vt 0.796875 0.8515625 +vt 0.796875 0.8828125 +vt 0.7890625 0.8828125 +vt 0.8046875 0.875 +vt 0.8203125 0.875 +vt 0.8203125 0.8828125 +vt 0.8046875 0.8828125 +vt 0.828125 0.875 +vt 0.84375 0.875 +vt 0.84375 0.8828125 +vt 0.828125 0.8828125 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +vn 0 0 -1 +vn 0 0 1 +vn -1 0 0 +vn 1 0 0 +vn 0 1 0 +vn 0 -1 0 +usemtl Material +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 6/5/2 5/6/2 8/7/2 7/8/2 +f 5/9/3 1/10/3 4/11/3 8/12/3 +f 2/13/4 6/14/4 7/15/4 3/16/4 +f 4/17/5 3/18/5 7/19/5 8/20/5 +f 5/21/6 6/22/6 2/23/6 1/24/6 +f 9/25/7 10/26/7 11/27/7 12/28/7 +f 14/29/8 13/30/8 16/31/8 15/32/8 +f 13/33/9 9/34/9 12/35/9 16/36/9 +f 10/37/10 14/38/10 15/39/10 11/40/10 +f 12/41/11 11/42/11 15/43/11 16/44/11 +f 13/45/12 14/46/12 10/47/12 9/48/12 +f 17/49/13 18/50/13 19/51/13 20/52/13 +f 22/53/14 21/54/14 24/55/14 23/56/14 +f 21/57/15 17/58/15 20/59/15 24/60/15 +f 18/61/16 22/62/16 23/63/16 19/64/16 +f 20/65/17 19/66/17 23/67/17 24/68/17 +f 21/69/18 22/70/18 18/71/18 17/72/18 +f 25/73/19 26/74/19 27/75/19 28/76/19 +f 30/77/20 29/78/20 32/79/20 31/80/20 +f 29/81/21 25/82/21 28/83/21 32/84/21 +f 26/85/22 30/86/22 31/87/22 27/88/22 +f 28/89/23 27/90/23 31/91/23 32/92/23 +f 29/93/24 30/94/24 26/95/24 25/96/24 +f 33/97/25 34/98/25 35/99/25 36/100/25 +f 38/101/26 37/102/26 40/103/26 39/104/26 +f 37/105/27 33/106/27 36/107/27 40/108/27 +f 34/109/28 38/110/28 39/111/28 35/112/28 +f 36/113/29 35/114/29 39/115/29 40/116/29 +f 37/117/30 38/118/30 34/119/30 33/120/30 +f 41/121/31 42/122/31 43/123/31 44/124/31 +f 46/125/32 45/126/32 48/127/32 47/128/32 +f 45/129/33 41/130/33 44/131/33 48/132/33 +f 42/133/34 46/134/34 47/135/34 43/136/34 +f 44/137/35 43/138/35 47/139/35 48/140/35 +f 45/141/36 46/142/36 42/143/36 41/144/36 +f 49/145/37 50/146/37 51/147/37 52/148/37 +f 54/149/38 53/150/38 56/151/38 55/152/38 +f 53/153/39 49/154/39 52/155/39 56/156/39 +f 50/157/40 54/158/40 55/159/40 51/160/40 +f 52/161/41 51/162/41 55/163/41 56/164/41 +f 53/165/42 54/166/42 50/167/42 49/168/42 +f 57/169/43 58/170/43 59/171/43 60/172/43 +f 62/173/44 61/174/44 64/175/44 63/176/44 +f 61/177/45 57/178/45 60/179/45 64/180/45 +f 58/181/46 62/182/46 63/183/46 59/184/46 +f 60/185/47 59/186/47 63/187/47 64/188/47 +f 61/189/48 62/190/48 58/191/48 57/192/48 +f 65/193/49 66/194/49 67/195/49 68/196/49 +f 70/197/50 69/198/50 72/199/50 71/200/50 +f 69/201/51 65/202/51 68/203/51 72/204/51 +f 66/205/52 70/206/52 71/207/52 67/208/52 +f 68/209/53 67/210/53 71/211/53 72/212/53 +f 69/213/54 70/214/54 66/215/54 65/216/54 +f 73/217/55 74/218/55 75/219/55 76/220/55 +f 78/221/56 77/222/56 80/223/56 79/224/56 +f 77/225/57 73/226/57 76/227/57 80/228/57 +f 74/229/58 78/230/58 79/231/58 75/232/58 +f 76/233/59 75/234/59 79/235/59 80/236/59 +f 77/237/60 78/238/60 74/239/60 73/240/60 +f 81/241/61 82/242/61 83/243/61 84/244/61 +f 86/245/62 85/246/62 88/247/62 87/248/62 +f 85/249/63 81/250/63 84/251/63 88/252/63 +f 82/253/64 86/254/64 87/255/64 83/256/64 +f 84/257/65 83/258/65 87/259/65 88/260/65 +f 85/261/66 86/262/66 82/263/66 81/264/66 +f 89/265/67 90/266/67 91/267/67 92/268/67 +f 94/269/68 93/270/68 96/271/68 95/272/68 +f 93/273/69 89/274/69 92/275/69 96/276/69 +f 90/277/70 94/278/70 95/279/70 91/280/70 +f 92/281/71 91/282/71 95/283/71 96/284/71 +f 93/285/72 94/286/72 90/287/72 89/288/72 +f 97/289/73 98/290/73 99/291/73 100/292/73 +f 102/293/74 101/294/74 104/295/74 103/296/74 +f 101/297/75 97/298/75 100/299/75 104/300/75 +f 98/301/76 102/302/76 103/303/76 99/304/76 +f 100/305/77 99/306/77 103/307/77 104/308/77 +f 101/309/78 102/310/78 98/311/78 97/312/78 +f 105/313/79 106/314/79 107/315/79 108/316/79 +f 110/317/80 109/318/80 112/319/80 111/320/80 +f 109/321/81 105/322/81 108/323/81 112/324/81 +f 106/325/82 110/326/82 111/327/82 107/328/82 +f 108/329/83 107/330/83 111/331/83 112/332/83 +f 109/333/84 110/334/84 106/335/84 105/336/84 +f 113/337/85 114/338/85 115/339/85 116/340/85 +f 118/341/86 117/342/86 120/343/86 119/344/86 +f 117/345/87 113/346/87 116/347/87 120/348/87 +f 114/349/88 118/350/88 119/351/88 115/352/88 +f 116/353/89 115/354/89 119/355/89 120/356/89 +f 117/357/90 118/358/90 114/359/90 113/360/90 +f 121/361/91 122/362/91 123/363/91 124/364/91 +f 126/365/92 125/366/92 128/367/92 127/368/92 +f 125/369/93 121/370/93 124/371/93 128/372/93 +f 122/373/94 126/374/94 127/375/94 123/376/94 +f 124/377/95 123/378/95 127/379/95 128/380/95 +f 125/381/96 126/382/96 122/383/96 121/384/96 +f 129/385/97 130/386/97 131/387/97 132/388/97 +f 134/389/98 133/390/98 136/391/98 135/392/98 +f 133/393/99 129/394/99 132/395/99 136/396/99 +f 130/397/100 134/398/100 135/399/100 131/400/100 +f 132/401/101 131/402/101 135/403/101 136/404/101 +f 133/405/102 134/406/102 130/407/102 129/408/102 +f 137/409/103 138/410/103 139/411/103 140/412/103 +f 142/413/104 141/414/104 144/415/104 143/416/104 +f 141/417/105 137/418/105 140/419/105 144/420/105 +f 138/421/106 142/422/106 143/423/106 139/424/106 +f 140/425/107 139/426/107 143/427/107 144/428/107 +f 141/429/108 142/430/108 138/431/108 137/432/108 +f 145/433/109 146/434/109 147/435/109 148/436/109 +f 150/437/110 149/438/110 152/439/110 151/440/110 +f 149/441/111 145/442/111 148/443/111 152/444/111 +f 146/445/112 150/446/112 151/447/112 147/448/112 +f 148/449/113 147/450/113 151/451/113 152/452/113 +f 149/453/114 150/454/114 146/455/114 145/456/114 +f 153/457/115 154/458/115 155/459/115 156/460/115 +f 158/461/116 157/462/116 160/463/116 159/464/116 +f 157/465/117 153/466/117 156/467/117 160/468/117 +f 154/469/118 158/470/118 159/471/118 155/472/118 +f 156/473/119 155/474/119 159/475/119 160/476/119 +f 157/477/120 158/478/120 154/479/120 153/480/120 +f 161/481/121 162/482/121 163/483/121 164/484/121 +f 166/485/122 165/486/122 168/487/122 167/488/122 +f 165/489/123 161/490/123 164/491/123 168/492/123 +f 162/493/124 166/494/124 167/495/124 163/496/124 +f 164/497/125 163/498/125 167/499/125 168/500/125 +f 165/501/126 166/502/126 162/503/126 161/504/126 +f 169/505/127 170/506/127 171/507/127 172/508/127 +f 174/509/128 173/510/128 176/511/128 175/512/128 +f 173/513/129 169/514/129 172/515/129 176/516/129 +f 170/517/130 174/518/130 175/519/130 171/520/130 +f 172/521/131 171/522/131 175/523/131 176/524/131 +f 173/525/132 174/526/132 170/527/132 169/528/132 +f 177/529/133 178/530/133 179/531/133 180/532/133 +f 182/533/134 181/534/134 184/535/134 183/536/134 +f 181/537/135 177/538/135 180/539/135 184/540/135 +f 178/541/136 182/542/136 183/543/136 179/544/136 +f 180/545/137 179/546/137 183/547/137 184/548/137 +f 181/549/138 182/550/138 178/551/138 177/552/138 +f 185/553/139 186/554/139 187/555/139 188/556/139 +f 190/557/140 189/558/140 192/559/140 191/560/140 +f 189/561/141 185/562/141 188/563/141 192/564/141 +f 186/565/142 190/566/142 191/567/142 187/568/142 +f 188/569/143 187/570/143 191/571/143 192/572/143 +f 189/573/144 190/574/144 186/575/144 185/576/144 +f 193/577/145 194/578/145 195/579/145 196/580/145 +f 198/581/146 197/582/146 200/583/146 199/584/146 +f 197/585/147 193/586/147 196/587/147 200/588/147 +f 194/589/148 198/590/148 199/591/148 195/592/148 +f 196/593/149 195/594/149 199/595/149 200/596/149 +f 197/597/150 198/598/150 194/599/150 193/600/150 +f 201/601/151 202/602/151 203/603/151 204/604/151 +f 206/605/152 205/606/152 208/607/152 207/608/152 +f 205/609/153 201/610/153 204/611/153 208/612/153 +f 202/613/154 206/614/154 207/615/154 203/616/154 +f 204/617/155 203/618/155 207/619/155 208/620/155 +f 205/621/156 206/622/156 202/623/156 201/624/156 +f 209/625/157 210/626/157 211/627/157 212/628/157 +f 214/629/158 213/630/158 216/631/158 215/632/158 +f 213/633/159 209/634/159 212/635/159 216/636/159 +f 210/637/160 214/638/160 215/639/160 211/640/160 +f 212/641/161 211/642/161 215/643/161 216/644/161 +f 213/645/162 214/646/162 210/647/162 209/648/162 +f 217/649/163 218/650/163 219/651/163 220/652/163 +f 222/653/164 221/654/164 224/655/164 223/656/164 +f 221/657/165 217/658/165 220/659/165 224/660/165 +f 218/661/166 222/662/166 223/663/166 219/664/166 +f 220/665/167 219/666/167 223/667/167 224/668/167 +f 221/669/168 222/670/168 218/671/168 217/672/168 +f 225/673/169 226/674/169 227/675/169 228/676/169 +f 230/677/170 229/678/170 232/679/170 231/680/170 +f 229/681/171 225/682/171 228/683/171 232/684/171 +f 226/685/172 230/686/172 231/687/172 227/688/172 +f 228/689/173 227/690/173 231/691/173 232/692/173 +f 229/693/174 230/694/174 226/695/174 225/696/174 +f 233/697/175 234/698/175 235/699/175 236/700/175 +f 238/701/176 237/702/176 240/703/176 239/704/176 +f 237/705/177 233/706/177 236/707/177 240/708/177 +f 234/709/178 238/710/178 239/711/178 235/712/178 +f 236/713/179 235/714/179 239/715/179 240/716/179 +f 237/717/180 238/718/180 234/719/180 233/720/180 diff --git a/mods/everness/models/everness_cursed_skull_pole.obj b/mods/everness/models/everness_cursed_skull_pole.obj new file mode 100644 index 0000000..9c56858 --- /dev/null +++ b/mods/everness/models/everness_cursed_skull_pole.obj @@ -0,0 +1,484 @@ +v -0.0625 -0.5000 -0.0625 +v 0.0625 -0.5000 -0.0625 +v 0.0625 1.0625 -0.0625 +v -0.0625 1.0625 -0.0625 +v -0.0625 -0.5000 0.0625 +v 0.0625 -0.5000 0.0625 +v 0.0625 1.0625 0.0625 +v -0.0625 1.0625 0.0625 +v -0.3125 1.2500 -0.3125 +v 0.3125 1.2500 -0.3125 +v 0.3125 1.5000 -0.3125 +v -0.3125 1.5000 -0.3125 +v -0.3125 1.2500 0.3125 +v 0.3125 1.2500 0.3125 +v 0.3125 1.5000 0.3125 +v -0.3125 1.5000 0.3125 +v -0.3125 1.0625 -0.1250 +v 0.3125 1.0625 -0.1250 +v 0.3125 1.2500 -0.1250 +v -0.3125 1.2500 -0.1250 +v -0.3125 1.0625 0.3125 +v 0.3125 1.0625 0.3125 +v 0.3125 1.2500 0.3125 +v -0.3125 1.2500 0.3125 +v -0.3125 1.0625 -0.3125 +v -0.2500 1.0625 -0.3125 +v -0.2500 1.2500 -0.3125 +v -0.3125 1.2500 -0.3125 +v -0.3125 1.0625 -0.1250 +v -0.2500 1.0625 -0.1250 +v -0.2500 1.2500 -0.1250 +v -0.3125 1.2500 -0.1250 +v -0.0625 1.0625 -0.3125 +v 0.0625 1.0625 -0.3125 +v 0.0625 1.2500 -0.3125 +v -0.0625 1.2500 -0.3125 +v -0.0625 1.0625 -0.1250 +v 0.0625 1.0625 -0.1250 +v 0.0625 1.2500 -0.1250 +v -0.0625 1.2500 -0.1250 +v 0.2500 1.0625 -0.3125 +v 0.3125 1.0625 -0.3125 +v 0.3125 1.2500 -0.3125 +v 0.2500 1.2500 -0.3125 +v 0.2500 1.0625 -0.1250 +v 0.3125 1.0625 -0.1250 +v 0.3125 1.2500 -0.1250 +v 0.2500 1.2500 -0.1250 +v -0.2500 0.9375 -0.3125 +v 0.2500 0.9375 -0.3125 +v 0.2500 1.0625 -0.3125 +v -0.2500 1.0625 -0.3125 +v -0.2500 0.9375 0.3125 +v 0.2500 0.9375 0.3125 +v 0.2500 1.0625 0.3125 +v -0.2500 1.0625 0.3125 +v -0.2500 0.8125 -0.3125 +v -0.1875 0.8125 -0.3125 +v -0.1875 0.9375 -0.3125 +v -0.2500 0.9375 -0.3125 +v -0.2500 0.8125 0.3125 +v -0.1875 0.8125 0.3125 +v -0.1875 0.9375 0.3125 +v -0.2500 0.9375 0.3125 +v -0.1250 0.8125 -0.3125 +v -0.0625 0.8125 -0.3125 +v -0.0625 0.9375 -0.3125 +v -0.1250 0.9375 -0.3125 +v -0.1250 0.8125 0.3125 +v -0.0625 0.8125 0.3125 +v -0.0625 0.9375 0.3125 +v -0.1250 0.9375 0.3125 +v 0.0625 0.8125 -0.3125 +v 0.1250 0.8125 -0.3125 +v 0.1250 0.9375 -0.3125 +v 0.0625 0.9375 -0.3125 +v 0.0625 0.8125 0.3125 +v 0.1250 0.8125 0.3125 +v 0.1250 0.9375 0.3125 +v 0.0625 0.9375 0.3125 +v 0.1875 0.8125 -0.3125 +v 0.2500 0.8125 -0.3125 +v 0.2500 0.9375 -0.3125 +v 0.1875 0.9375 -0.3125 +v 0.1875 0.8125 0.3125 +v 0.2500 0.8125 0.3125 +v 0.2500 0.9375 0.3125 +v 0.1875 0.9375 0.3125 +vt 0.0000 0.7109 +vt 0.0156 0.7109 +vt 0.0156 0.9062 +vt 0.0000 0.9062 +vt 0.0000 0.7109 +vt 0.0156 0.7109 +vt 0.0156 0.9062 +vt 0.0000 0.9062 +vt 0.0000 0.7109 +vt 0.0156 0.7109 +vt 0.0156 0.9062 +vt 0.0000 0.9062 +vt 0.0000 0.7109 +vt 0.0156 0.7109 +vt 0.0156 0.9062 +vt 0.0000 0.9062 +vt 0.0000 0.7109 +vt 0.0156 0.7109 +vt 0.0156 0.9062 +vt 0.0000 0.9062 +vt 0.0000 0.7109 +vt 0.0156 0.7109 +vt 0.0156 0.9062 +vt 0.0000 0.9062 +vt 0.0000 0.9688 +vt 0.0781 0.9688 +vt 0.0781 1.0000 +vt 0.0000 1.0000 +vt 0.0938 0.9688 +vt 0.1719 0.9688 +vt 0.1719 1.0000 +vt 0.0938 1.0000 +vt 0.1797 0.9688 +vt 0.2578 0.9688 +vt 0.2578 1.0000 +vt 0.1797 1.0000 +vt 0.2656 0.9688 +vt 0.3438 0.9688 +vt 0.3438 1.0000 +vt 0.2656 1.0000 +vt 0.3516 0.9219 +vt 0.4297 0.9219 +vt 0.4297 1.0000 +vt 0.3516 1.0000 +vt 0.4375 0.9219 +vt 0.5156 0.9219 +vt 0.5156 1.0000 +vt 0.4375 1.0000 +vt 0.0000 0.6719 +vt 0.0312 0.6719 +vt 0.0312 0.7031 +vt 0.0000 0.7031 +vt 0.5234 0.9766 +vt 0.6016 0.9766 +vt 0.6016 1.0000 +vt 0.5234 1.0000 +vt 0.6094 0.9766 +vt 0.6641 0.9766 +vt 0.6641 1.0000 +vt 0.6094 1.0000 +vt 0.6719 0.9766 +vt 0.7266 0.9766 +vt 0.7266 1.0000 +vt 0.6719 1.0000 +vt 0.7344 0.9453 +vt 0.8125 0.9453 +vt 0.8125 1.0000 +vt 0.7344 1.0000 +vt 0.8203 0.9453 +vt 0.8984 0.9453 +vt 0.8984 1.0000 +vt 0.8203 1.0000 +vt 0.0000 0.9453 +vt 0.0078 0.9453 +vt 0.0078 0.9688 +vt 0.0000 0.9688 +vt 0.9062 0.9766 +vt 0.9141 0.9766 +vt 0.9141 1.0000 +vt 0.9062 1.0000 +vt 0.9219 0.9766 +vt 0.9453 0.9766 +vt 0.9453 1.0000 +vt 0.9219 1.0000 +vt 0.9531 0.9766 +vt 0.9766 0.9766 +vt 0.9766 1.0000 +vt 0.9531 1.0000 +vt 0.9844 0.9766 +vt 0.9922 0.9766 +vt 0.9922 1.0000 +vt 0.9844 1.0000 +vt 0.0938 0.8906 +vt 0.1016 0.8906 +vt 0.1016 0.9141 +vt 0.0938 0.9141 +vt 0.0312 0.9453 +vt 0.0469 0.9453 +vt 0.0469 0.9688 +vt 0.0312 0.9688 +vt 0.1094 0.8906 +vt 0.1250 0.8906 +vt 0.1250 0.9141 +vt 0.1094 0.9141 +vt 0.1328 0.8906 +vt 0.1562 0.8906 +vt 0.1562 0.9141 +vt 0.1328 0.9141 +vt 0.1641 0.8906 +vt 0.1875 0.8906 +vt 0.1875 0.9141 +vt 0.1641 0.9141 +vt 0.1953 0.8906 +vt 0.2109 0.8906 +vt 0.2109 0.9141 +vt 0.1953 0.9141 +vt 0.2188 0.8906 +vt 0.2344 0.8906 +vt 0.2344 0.9141 +vt 0.2188 0.9141 +vt 0.0703 0.9453 +vt 0.0781 0.9453 +vt 0.0781 0.9688 +vt 0.0703 0.9688 +vt 0.2422 0.8906 +vt 0.2500 0.8906 +vt 0.2500 0.9141 +vt 0.2422 0.9141 +vt 0.2578 0.8906 +vt 0.2812 0.8906 +vt 0.2812 0.9141 +vt 0.2578 0.9141 +vt 0.2891 0.8906 +vt 0.3125 0.8906 +vt 0.3125 0.9141 +vt 0.2891 0.9141 +vt 0.3203 0.8906 +vt 0.3281 0.8906 +vt 0.3281 0.9141 +vt 0.3203 0.9141 +vt 0.3359 0.8906 +vt 0.3438 0.8906 +vt 0.3438 0.9141 +vt 0.3359 0.9141 +vt 0.0078 0.9297 +vt 0.0703 0.9297 +vt 0.0703 0.9453 +vt 0.0078 0.9453 +vt 0.3516 0.8984 +vt 0.4141 0.8984 +vt 0.4141 0.9141 +vt 0.3516 0.9141 +vt 0.4219 0.8984 +vt 0.5000 0.8984 +vt 0.5000 0.9141 +vt 0.4219 0.9141 +vt 0.5078 0.8984 +vt 0.5859 0.8984 +vt 0.5859 0.9141 +vt 0.5078 0.9141 +vt 0.5938 0.8359 +vt 0.6562 0.8359 +vt 0.6562 0.9141 +vt 0.5938 0.9141 +vt 0.6641 0.8359 +vt 0.7266 0.8359 +vt 0.7266 0.9141 +vt 0.6641 0.9141 +vt 0.0078 0.9141 +vt 0.0156 0.9141 +vt 0.0156 0.9297 +vt 0.0078 0.9297 +vt 0.7344 0.8984 +vt 0.7422 0.8984 +vt 0.7422 0.9141 +vt 0.7344 0.9141 +vt 0.7500 0.8984 +vt 0.8281 0.8984 +vt 0.8281 0.9141 +vt 0.7500 0.9141 +vt 0.8359 0.8984 +vt 0.9141 0.8984 +vt 0.9141 0.9141 +vt 0.8359 0.9141 +vt 0.9219 0.8359 +vt 0.9297 0.8359 +vt 0.9297 0.9141 +vt 0.9219 0.9141 +vt 0.9375 0.8359 +vt 0.9453 0.8359 +vt 0.9453 0.9141 +vt 0.9375 0.9141 +vt 0.0234 0.9141 +vt 0.0312 0.9141 +vt 0.0312 0.9297 +vt 0.0234 0.9297 +vt 0.9531 0.8984 +vt 0.9609 0.8984 +vt 0.9609 0.9141 +vt 0.9531 0.9141 +vt 0.0938 0.8125 +vt 0.1719 0.8125 +vt 0.1719 0.8281 +vt 0.0938 0.8281 +vt 0.1797 0.8125 +vt 0.2578 0.8125 +vt 0.2578 0.8281 +vt 0.1797 0.8281 +vt 0.2656 0.7500 +vt 0.2734 0.7500 +vt 0.2734 0.8281 +vt 0.2656 0.8281 +vt 0.2812 0.7500 +vt 0.2891 0.7500 +vt 0.2891 0.8281 +vt 0.2812 0.8281 +vt 0.0469 0.9141 +vt 0.0547 0.9141 +vt 0.0547 0.9297 +vt 0.0469 0.9297 +vt 0.2969 0.8125 +vt 0.3047 0.8125 +vt 0.3047 0.8281 +vt 0.2969 0.8281 +vt 0.3125 0.8125 +vt 0.3906 0.8125 +vt 0.3906 0.8281 +vt 0.3125 0.8281 +vt 0.3984 0.8125 +vt 0.4766 0.8125 +vt 0.4766 0.8281 +vt 0.3984 0.8281 +vt 0.4844 0.7500 +vt 0.4922 0.7500 +vt 0.4922 0.8281 +vt 0.4844 0.8281 +vt 0.5000 0.7500 +vt 0.5078 0.7500 +vt 0.5078 0.8281 +vt 0.5000 0.8281 +vt 0.0625 0.9141 +vt 0.0703 0.9141 +vt 0.0703 0.9297 +vt 0.0625 0.9297 +vt 0.5156 0.8125 +vt 0.5234 0.8125 +vt 0.5234 0.8281 +vt 0.5156 0.8281 +vt 0.5312 0.8125 +vt 0.6094 0.8125 +vt 0.6094 0.8281 +vt 0.5312 0.8281 +vt 0.6172 0.8125 +vt 0.6953 0.8125 +vt 0.6953 0.8281 +vt 0.6172 0.8281 +vt 0.7031 0.7500 +vt 0.7109 0.7500 +vt 0.7109 0.8281 +vt 0.7031 0.8281 +vt 0.7188 0.7500 +vt 0.7266 0.7500 +vt 0.7266 0.8281 +vt 0.7188 0.8281 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 6/5/2 5/6/2 8/7/2 7/8/2 +f 5/9/3 1/10/3 4/11/3 8/12/3 +f 2/13/4 6/14/4 7/15/4 3/16/4 +f 4/17/5 3/18/5 7/19/5 8/20/5 +f 5/21/6 6/22/6 2/23/6 1/24/6 +f 9/25/7 10/26/7 11/27/7 12/28/7 +f 14/29/8 13/30/8 16/31/8 15/32/8 +f 13/33/9 9/34/9 12/35/9 16/36/9 +f 10/37/10 14/38/10 15/39/10 11/40/10 +f 12/41/11 11/42/11 15/43/11 16/44/11 +f 13/45/12 14/46/12 10/47/12 9/48/12 +f 17/49/13 18/50/13 19/51/13 20/52/13 +f 22/53/14 21/54/14 24/55/14 23/56/14 +f 21/57/15 17/58/15 20/59/15 24/60/15 +f 18/61/16 22/62/16 23/63/16 19/64/16 +f 20/65/17 19/66/17 23/67/17 24/68/17 +f 21/69/18 22/70/18 18/71/18 17/72/18 +f 25/73/19 26/74/19 27/75/19 28/76/19 +f 30/77/20 29/78/20 32/79/20 31/80/20 +f 29/81/21 25/82/21 28/83/21 32/84/21 +f 26/85/22 30/86/22 31/87/22 27/88/22 +f 28/89/23 27/90/23 31/91/23 32/92/23 +f 29/93/24 30/94/24 26/95/24 25/96/24 +f 33/97/25 34/98/25 35/99/25 36/100/25 +f 38/101/26 37/102/26 40/103/26 39/104/26 +f 37/105/27 33/106/27 36/107/27 40/108/27 +f 34/109/28 38/110/28 39/111/28 35/112/28 +f 36/113/29 35/114/29 39/115/29 40/116/29 +f 37/117/30 38/118/30 34/119/30 33/120/30 +f 41/121/31 42/122/31 43/123/31 44/124/31 +f 46/125/32 45/126/32 48/127/32 47/128/32 +f 45/129/33 41/130/33 44/131/33 48/132/33 +f 42/133/34 46/134/34 47/135/34 43/136/34 +f 44/137/35 43/138/35 47/139/35 48/140/35 +f 45/141/36 46/142/36 42/143/36 41/144/36 +f 49/145/37 50/146/37 51/147/37 52/148/37 +f 54/149/38 53/150/38 56/151/38 55/152/38 +f 53/153/39 49/154/39 52/155/39 56/156/39 +f 50/157/40 54/158/40 55/159/40 51/160/40 +f 52/161/41 51/162/41 55/163/41 56/164/41 +f 53/165/42 54/166/42 50/167/42 49/168/42 +f 57/169/43 58/170/43 59/171/43 60/172/43 +f 62/173/44 61/174/44 64/175/44 63/176/44 +f 61/177/45 57/178/45 60/179/45 64/180/45 +f 58/181/46 62/182/46 63/183/46 59/184/46 +f 60/185/47 59/186/47 63/187/47 64/188/47 +f 61/189/48 62/190/48 58/191/48 57/192/48 +f 65/193/49 66/194/49 67/195/49 68/196/49 +f 70/197/50 69/198/50 72/199/50 71/200/50 +f 69/201/51 65/202/51 68/203/51 72/204/51 +f 66/205/52 70/206/52 71/207/52 67/208/52 +f 68/209/53 67/210/53 71/211/53 72/212/53 +f 69/213/54 70/214/54 66/215/54 65/216/54 +f 73/217/55 74/218/55 75/219/55 76/220/55 +f 78/221/56 77/222/56 80/223/56 79/224/56 +f 77/225/57 73/226/57 76/227/57 80/228/57 +f 74/229/58 78/230/58 79/231/58 75/232/58 +f 76/233/59 75/234/59 79/235/59 80/236/59 +f 77/237/60 78/238/60 74/239/60 73/240/60 +f 81/241/61 82/242/61 83/243/61 84/244/61 +f 86/245/62 85/246/62 88/247/62 87/248/62 +f 85/249/63 81/250/63 84/251/63 88/252/63 +f 82/253/64 86/254/64 87/255/64 83/256/64 +f 84/257/65 83/258/65 87/259/65 88/260/65 +f 85/261/66 86/262/66 82/263/66 81/264/66 diff --git a/mods/everness/models/everness_forsaken_fire.obj b/mods/everness/models/everness_forsaken_fire.obj new file mode 100644 index 0000000..77d58cd --- /dev/null +++ b/mods/everness/models/everness_forsaken_fire.obj @@ -0,0 +1,1646 @@ +# Blender v2.83.20 OBJ File: 'everness_forsaken_fire.blend' +# www.blender.org +mtllib everness_forsaken_fire.mtl +o forsaken_fire.vox +v -0.312500 -0.499000 0.312500 +v -0.312500 -0.436500 0.312500 +v -0.375000 -0.374000 0.312500 +v -0.437500 -0.374000 0.437500 +v 0.312500 -0.374000 0.437500 +v -0.437500 -0.374000 0.312500 +v 0.375000 -0.374000 0.312500 +v -0.437500 -0.374000 -0.312500 +v 0.375000 -0.374000 -0.312500 +v 0.312500 -0.249000 0.437500 +v 0.375000 -0.249000 0.375000 +v -0.375000 -0.249000 0.312500 +v -0.500000 -0.249000 0.062500 +v 0.437500 -0.311500 0.062500 +v -0.500000 -0.249000 0.125000 +v -0.500000 -0.249000 -0.125000 +v -0.437500 -0.249000 -0.312500 +v -0.437500 -0.249000 -0.375000 +v 0.062500 -0.249000 -0.437500 +v -0.437500 -0.124000 0.125000 +v -0.500000 -0.124000 0.125000 +v -0.500000 -0.124000 -0.125000 +v -0.062500 -0.061500 0.500000 +v 0.437500 -0.061500 0.437500 +v -0.437500 -0.061500 0.375000 +v -0.437500 -0.124000 -0.062500 +v 0.437500 -0.061500 -0.375000 +v 0.375000 -0.061500 0.437500 +v 0.375000 -0.061500 0.375000 +v -0.375000 0.001000 0.312500 +v 0.375000 0.063500 0.500000 +v -0.437500 0.001000 0.375000 +v -0.312500 0.063500 0.312500 +v -0.312500 0.001000 0.312500 +v 0.375000 0.063500 0.375000 +v -0.500000 0.063500 -0.375000 +v 0.437500 0.001000 -0.437500 +v 0.312500 0.063500 0.437500 +v -0.437500 0.063500 0.312500 +v -0.437500 0.063500 -0.312500 +v -0.437500 0.188500 0.312500 +v 0.312500 0.188500 0.375000 +v -0.437500 0.188500 -0.312500 +v 0.250000 0.188500 0.375000 +v -0.375000 0.188500 0.250000 +v -0.375000 0.188500 -0.250000 +v 0.250000 0.251000 -0.375000 +v 0.250000 0.188500 -0.375000 +v 0.312500 -0.499000 0.312500 +v 0.312500 -0.436500 0.312500 +v -0.312500 -0.374000 0.375000 +v 0.437500 -0.374000 0.312500 +v 0.437500 -0.374000 -0.312500 +v 0.437500 -0.374000 -0.437500 +v 0.062500 -0.311500 0.500000 +v 0.062500 -0.311500 0.437500 +v 0.437500 -0.249000 0.375000 +v 0.375000 -0.249000 -0.312500 +v -0.375000 -0.249000 -0.375000 +v 0.312500 -0.249000 -0.375000 +v -0.312500 -0.249000 -0.437500 +v -0.312500 -0.249000 -0.375000 +v 0.125000 -0.249000 0.437500 +v 0.437500 -0.249000 0.312500 +v 0.500000 -0.249000 0.125000 +v 0.500000 -0.249000 -0.125000 +v 0.437500 -0.249000 -0.125000 +v 0.375000 -0.249000 -0.437500 +v 0.500000 -0.249000 -0.375000 +v -0.062500 -0.249000 -0.437500 +v 0.125000 -0.249000 -0.500000 +v 0.125000 -0.124000 0.437500 +v 0.500000 -0.124000 0.062500 +v 0.125000 -0.124000 -0.500000 +v -0.375000 -0.061500 -0.375000 +v 0.375000 -0.061500 -0.437500 +v -0.375000 0.001000 0.437500 +v 0.375000 0.001000 0.312500 +v 0.375000 0.001000 -0.312500 +v -0.437500 0.001000 0.437500 +v 0.375000 0.063500 0.437500 +v 0.312500 0.063500 0.312500 +v 0.437500 0.063500 -0.312500 +v 0.500000 0.063500 -0.375000 +v -0.375000 0.063500 -0.500000 +v -0.312500 0.063500 0.375000 +v -0.312500 0.063500 -0.312500 +v -0.312500 0.063500 -0.375000 +v -0.312500 0.063500 -0.437500 +v -0.312500 0.188500 0.437500 +v -0.312500 0.188500 0.312500 +v 0.437500 0.188500 0.312500 +v -0.312500 0.188500 -0.312500 +v 0.437500 0.188500 -0.312500 +v -0.250000 0.188500 0.375000 +v 0.375000 0.188500 0.312500 +v 0.375000 0.188500 -0.312500 +v -0.250000 0.188500 -0.375000 +v -0.250000 0.251000 -0.375000 +v 0.375000 0.251000 -0.375000 +v -0.375000 -0.436500 0.375000 +v 0.375000 -0.436500 0.375000 +v 0.312500 -0.374000 0.375000 +v -0.312500 -0.374000 -0.312500 +v -0.312500 -0.374000 0.437500 +v 0.437500 -0.374000 0.437500 +v -0.062500 -0.311500 0.500000 +v -0.312500 -0.249000 0.312500 +v 0.312500 -0.249000 0.312500 +v 0.500000 -0.311500 0.062500 +v -0.312500 -0.249000 -0.312500 +v 0.437500 -0.249000 -0.312500 +v 0.375000 -0.249000 -0.375000 +v -0.062500 -0.311500 -0.437500 +v 0.062500 -0.311500 -0.437500 +v -0.125000 -0.249000 0.500000 +v 0.125000 -0.249000 0.500000 +v 0.375000 -0.249000 0.500000 +v 0.500000 -0.249000 0.500000 +v -0.312500 -0.249000 0.437500 +v -0.125000 -0.249000 0.437500 +v -0.062500 -0.249000 0.437500 +v -0.437500 -0.249000 0.125000 +v -0.500000 -0.249000 -0.062500 +v -0.500000 -0.249000 -0.375000 +v 0.437500 -0.249000 -0.375000 +v -0.375000 -0.249000 -0.437500 +v 0.437500 -0.249000 -0.437500 +v -0.125000 -0.124000 0.500000 +v 0.125000 -0.124000 0.500000 +v -0.125000 -0.124000 0.437500 +v -0.062500 -0.124000 0.437500 +v 0.500000 -0.124000 0.125000 +v 0.437500 -0.124000 0.125000 +v 0.062500 -0.061500 0.500000 +v -0.375000 -0.061500 0.375000 +v 0.437500 -0.061500 0.375000 +v -0.500000 -0.124000 0.062500 +v -0.500000 -0.061500 0.062500 +v 0.437500 -0.124000 0.062500 +v -0.437500 -0.061500 -0.375000 +v -0.437500 -0.061500 -0.437500 +v 0.437500 -0.061500 -0.437500 +v -0.312500 0.001000 0.375000 +v 0.375000 0.001000 0.375000 +v -0.437500 0.001000 -0.375000 +v -0.500000 0.063500 0.500000 +v -0.312500 0.063500 0.437500 +v 0.437500 0.001000 0.375000 +v 0.437500 0.063500 0.375000 +v -0.375000 0.063500 0.312500 +v -0.375000 0.063500 -0.375000 +v 0.312500 0.063500 -0.375000 +v -0.375000 0.063500 -0.437500 +v 0.375000 0.063500 -0.437500 +v -0.375000 0.063500 -0.312500 +v -0.437500 0.188500 0.437500 +v 0.312500 0.188500 0.437500 +v -0.375000 0.188500 -0.312500 +v -0.312500 0.188500 0.375000 +v -0.250000 0.251000 0.375000 +v 0.250000 0.251000 0.375000 +v -0.250000 0.188500 -0.250000 +v 0.250000 0.251000 -0.250000 +v 0.312500 -0.374000 0.312500 +v -0.375000 -0.436500 -0.375000 +v -0.312500 -0.374000 -0.375000 +v 0.375000 -0.436500 -0.375000 +v -0.437500 -0.374000 -0.437500 +v 0.312500 -0.374000 -0.437500 +v 0.062500 -0.249000 0.437500 +v 0.312500 -0.249000 0.375000 +v 0.375000 -0.249000 0.312500 +v -0.437500 -0.249000 -0.062500 +v 0.437500 -0.311500 -0.062500 +v -0.437500 -0.249000 -0.437500 +v -0.062500 -0.311500 -0.500000 +v 0.062500 -0.249000 -0.500000 +v 0.062500 -0.311500 -0.500000 +v -0.437500 -0.249000 0.437500 +v -0.375000 -0.249000 0.437500 +v -0.500000 -0.249000 0.375000 +v -0.437500 -0.249000 0.375000 +v -0.375000 -0.249000 0.375000 +v 0.500000 -0.249000 0.375000 +v -0.437500 -0.249000 0.062500 +v 0.125000 -0.249000 -0.437500 +v 0.312500 -0.249000 -0.437500 +v -0.375000 -0.249000 -0.500000 +v -0.062500 -0.249000 -0.500000 +v 0.375000 -0.249000 -0.500000 +v 0.500000 -0.249000 -0.500000 +v -0.437500 -0.124000 0.062500 +v -0.437500 -0.124000 -0.125000 +v 0.437500 -0.124000 -0.125000 +v 0.500000 -0.124000 -0.125000 +v 0.500000 -0.061500 -0.062500 +v -0.062500 -0.061500 -0.500000 +v -0.312500 0.001000 -0.375000 +v -0.375000 0.063500 0.375000 +v -0.375000 0.001000 -0.312500 +v 0.312500 0.001000 -0.312500 +v 0.375000 0.001000 -0.375000 +v -0.375000 0.001000 -0.437500 +v 0.375000 0.001000 -0.437500 +v -0.500000 0.063500 -0.500000 +v 0.375000 0.063500 -0.500000 +v 0.500000 0.063500 -0.500000 +v 0.375000 0.063500 0.312500 +v 0.312500 0.063500 -0.437500 +v 0.312500 0.188500 0.312500 +v -0.437500 0.188500 -0.437500 +v -0.312500 0.188500 -0.437500 +v 0.312500 0.188500 -0.437500 +v -0.250000 0.188500 0.250000 +v -0.375000 0.251000 -0.375000 +v -0.312500 0.188500 -0.375000 +v -0.312500 -0.499000 -0.312500 +v 0.312500 -0.499000 -0.312500 +v -0.312500 -0.436500 -0.312500 +v 0.312500 -0.436500 -0.312500 +v 0.375000 -0.374000 0.375000 +v -0.312500 -0.374000 -0.437500 +v 0.375000 -0.374000 -0.375000 +v -0.062500 -0.311500 0.437500 +v -0.500000 -0.311500 0.062500 +v -0.437500 -0.311500 0.062500 +v -0.500000 -0.311500 -0.062500 +v -0.437500 -0.311500 -0.062500 +v 0.500000 -0.311500 -0.062500 +v -0.500000 -0.249000 0.500000 +v -0.375000 -0.249000 0.500000 +v 0.375000 -0.249000 0.437500 +v -0.437500 -0.249000 0.312500 +v 0.437500 -0.249000 0.125000 +v 0.500000 -0.249000 0.062500 +v 0.437500 -0.249000 0.062500 +v 0.500000 -0.249000 -0.062500 +v -0.437500 -0.249000 -0.125000 +v -0.125000 -0.249000 -0.437500 +v -0.500000 -0.249000 -0.500000 +v -0.125000 -0.249000 -0.500000 +v -0.062500 -0.124000 0.500000 +v 0.062500 -0.124000 0.500000 +v -0.500000 -0.124000 -0.062500 +v 0.437500 -0.124000 -0.062500 +v 0.500000 -0.124000 -0.062500 +v -0.437500 -0.061500 0.437500 +v -0.375000 -0.061500 0.437500 +v -0.375000 -0.061500 -0.437500 +v 0.375000 -0.061500 -0.375000 +v 0.312500 0.001000 0.375000 +v 0.375000 0.001000 0.437500 +v 0.437500 0.001000 -0.375000 +v -0.375000 0.001000 -0.375000 +v 0.312500 0.001000 -0.375000 +v -0.437500 0.063500 0.437500 +v 0.312500 0.063500 -0.312500 +v 0.375000 0.063500 -0.375000 +v -0.437500 0.063500 -0.375000 +v -0.437500 0.063500 -0.437500 +v 0.437500 0.063500 -0.375000 +v -0.375000 0.188500 0.312500 +v 0.250000 0.188500 0.250000 +v 0.375000 0.188500 0.250000 +v 0.250000 0.188500 -0.250000 +v 0.312500 0.188500 -0.312500 +v 0.375000 0.188500 -0.250000 +v -0.375000 -0.374000 0.375000 +v -0.312500 -0.374000 0.312500 +v -0.375000 -0.374000 -0.312500 +v -0.375000 -0.374000 -0.375000 +v 0.312500 -0.374000 -0.312500 +v 0.312500 -0.374000 -0.375000 +v -0.062500 -0.249000 0.500000 +v 0.062500 -0.249000 0.500000 +v 0.437500 -0.249000 0.437500 +v -0.312500 -0.249000 0.375000 +v 0.437500 -0.249000 -0.062500 +v -0.375000 -0.249000 -0.312500 +v 0.312500 -0.249000 -0.312500 +v 0.062500 -0.124000 0.437500 +v -0.125000 -0.124000 -0.437500 +v -0.062500 -0.124000 -0.437500 +v -0.062500 -0.124000 -0.500000 +v -0.125000 -0.124000 -0.500000 +v 0.062500 -0.124000 -0.437500 +v 0.125000 -0.124000 -0.437500 +v 0.062500 -0.124000 -0.500000 +v -0.062500 -0.061500 0.437500 +v 0.062500 -0.061500 0.437500 +v -0.437500 -0.061500 0.062500 +v 0.437500 -0.061500 0.062500 +v 0.500000 -0.061500 0.062500 +v -0.437500 -0.061500 -0.062500 +v -0.500000 -0.061500 -0.062500 +v 0.437500 -0.061500 -0.062500 +v -0.062500 -0.061500 -0.437500 +v 0.062500 -0.061500 -0.437500 +v 0.062500 -0.061500 -0.500000 +v -0.375000 0.001000 0.375000 +v 0.437500 0.001000 0.437500 +v 0.312500 0.001000 0.312500 +v -0.312500 0.001000 -0.312500 +v -0.437500 0.001000 -0.437500 +v -0.375000 0.063500 0.500000 +v -0.375000 0.063500 0.437500 +v 0.500000 0.063500 0.500000 +v 0.437500 0.063500 0.437500 +v -0.437500 0.063500 0.375000 +v -0.500000 0.063500 0.375000 +v 0.500000 0.063500 0.375000 +v 0.312500 0.063500 0.375000 +v 0.437500 0.063500 0.312500 +v 0.375000 0.063500 -0.312500 +v 0.437500 0.063500 -0.437500 +v 0.375000 0.188500 0.375000 +v 0.437500 0.188500 0.437500 +v -0.375000 0.188500 0.375000 +v -0.375000 0.188500 -0.375000 +v 0.312500 0.188500 -0.375000 +v 0.375000 0.188500 -0.375000 +v 0.437500 0.188500 -0.437500 +v -0.375000 0.251000 0.375000 +v 0.375000 0.251000 0.375000 +v -0.375000 0.251000 0.250000 +v -0.250000 0.251000 0.250000 +v 0.250000 0.251000 0.250000 +v 0.375000 0.251000 0.250000 +v -0.375000 0.251000 -0.250000 +v -0.250000 0.251000 -0.250000 +v 0.375000 0.251000 -0.250000 +v -0.310485 0.001000 0.310485 +v 0.310485 0.001000 -0.310485 +v -0.310485 0.879183 0.310485 +v 0.310485 0.879183 -0.310485 +v 0.310485 0.001000 0.310485 +v -0.310485 0.001000 -0.310485 +v 0.310485 0.879183 0.310485 +v -0.310485 0.879183 -0.310485 +vt 0.958333 0.333333 +vt 0.958333 0.375000 +vt 0.979167 0.375000 +vt 0.979167 0.333333 +vt 0.833333 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.520833 +vt 0.833333 0.520833 +vt 0.708333 0.687500 +vt 0.750000 0.687500 +vt 0.750000 0.708333 +vt 0.708333 0.708333 +vt 0.854167 0.750000 +vt 0.854167 0.770833 +vt 0.875000 0.770833 +vt 0.875000 0.750000 +vt 0.270833 0.625000 +vt 0.291667 0.625000 +vt 0.291667 0.645833 +vt 0.270833 0.645833 +vt 0.333333 0.937500 +vt 0.333333 0.958333 +vt 0.291667 0.958333 +vt 0.291667 0.937500 +vt 0.729167 0.958333 +vt 0.687500 0.958333 +vt 0.687500 0.937500 +vt 0.708333 0.937500 +vt 0.729167 0.937500 +vt 0.375000 0.937500 +vt 0.416667 0.937500 +vt 0.416667 0.958333 +vt 0.375000 0.958333 +vt 0.104167 0.979167 +vt 0.083333 0.979167 +vt 0.083333 0.937500 +vt 0.104167 0.937500 +vt 0.250000 0.604167 +vt 0.041667 0.604167 +vt 0.020833 0.604167 +vt 0.020833 0.625000 +vt 0.270833 0.625000 +vt 0.270833 0.604167 +vt 0.916666 0.687500 +vt 0.937500 0.687500 +vt 0.937500 0.708333 +vt 0.916666 0.708333 +vt 0.312500 0.833333 +vt 0.333333 0.833333 +vt 0.333333 0.854167 +vt 0.312500 0.854167 +vt 0.979167 0.208333 +vt 0.958333 0.208333 +vt 0.958333 0.166667 +vt 0.979167 0.166667 +vt 0.041667 0.937500 +vt 0.041667 0.958333 +vt 0.020833 0.958333 +vt 0.020833 0.979166 +vt 0.000000 0.979166 +vt 0.000000 0.937500 +vt 0.937500 0.208333 +vt 0.958333 0.208333 +vt 0.958333 0.229167 +vt 0.937500 0.229167 +vt 0.979167 0.041667 +vt 0.958333 0.041667 +vt 0.958333 0.000000 +vt 0.979167 0.000000 +vt 0.020833 0.354167 +vt 0.041667 0.354167 +vt 0.041667 0.375000 +vt 0.020833 0.375000 +vt 0.437500 0.937500 +vt 0.416667 0.937500 +vt 0.416667 0.958333 +vt 0.458333 0.958333 +vt 0.458333 0.937500 +vt 0.916666 0.625000 +vt 0.937500 0.625000 +vt 0.937500 0.645833 +vt 0.916666 0.645833 +vt 0.875000 0.395833 +vt 0.875000 0.500000 +vt 0.854167 0.500000 +vt 0.854167 0.479167 +vt 0.833333 0.479167 +vt 0.833333 0.458333 +vt 0.854167 0.458333 +vt 0.854167 0.395833 +vt 0.958333 0.125000 +vt 0.958333 0.166667 +vt 0.979167 0.166667 +vt 0.979167 0.125000 +vt 0.937500 0.812500 +vt 0.916667 0.812500 +vt 0.916667 0.770833 +vt 0.937500 0.770833 +vt 0.583333 0.708333 +vt 0.604167 0.708333 +vt 0.604167 0.645833 +vt 0.583333 0.645833 +vt 0.250000 0.583333 +vt 0.270833 0.583333 +vt 0.854167 0.145833 +vt 0.854167 0.208333 +vt 0.833333 0.208333 +vt 0.833333 0.145833 +vt 0.583333 0.458333 +vt 0.562500 0.458333 +vt 0.562500 0.395833 +vt 0.541667 0.395833 +vt 0.541667 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.479167 +vt 0.583333 0.479167 +vt 0.875000 0.750000 +vt 0.916667 0.750000 +vt 0.916667 0.854167 +vt 0.875000 0.854167 +vt 0.000000 0.333333 +vt 0.020833 0.333333 +vt 0.000000 0.354167 +vt 0.062500 0.979167 +vt 0.083333 0.979167 +vt 0.083333 0.937500 +vt 0.062500 0.937500 +vt 0.333333 0.729167 +vt 0.354167 0.729167 +vt 0.354167 0.750000 +vt 0.333333 0.750000 +vt 0.250000 0.833333 +vt 0.250000 0.854167 +vt 0.270833 0.854167 +vt 0.270833 0.833333 +vt 0.583333 0.812500 +vt 0.604167 0.812500 +vt 0.604167 0.833333 +vt 0.583333 0.833333 +vt 0.500000 0.895833 +vt 0.541667 0.895833 +vt 0.541667 0.937500 +vt 0.500000 0.937500 +vt 0.041667 0.979166 +vt 0.312500 0.645833 +vt 0.312500 0.708333 +vt 0.333333 0.708333 +vt 0.333333 0.645833 +vt 0.291667 0.291667 +vt 0.291667 0.312500 +vt 0.312500 0.312500 +vt 0.312500 0.291667 +vt 0.562500 0.895833 +vt 0.562500 0.937500 +vt 0.541667 0.937500 +vt 0.541667 0.895833 +vt 0.041667 0.041667 +vt 0.041667 0.020833 +vt 0.145833 0.020833 +vt 0.145833 0.000000 +vt 0.187500 0.000000 +vt 0.187500 0.020833 +vt 0.291667 0.020833 +vt 0.291667 0.041667 +vt 0.562500 0.791667 +vt 0.562500 0.833333 +vt 0.583333 0.833333 +vt 0.583333 0.791667 +vt 0.916667 0.958333 +vt 0.916667 0.916667 +vt 0.958333 0.916667 +vt 0.958333 0.937500 +vt 0.937500 0.937500 +vt 0.937500 0.958333 +vt 0.708333 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.333333 +vt 0.708333 0.333333 +vt 0.000000 0.604167 +vt 0.020833 0.583333 +vt 0.250000 0.354167 +vt 0.270833 0.354167 +vt 0.270833 0.375000 +vt 0.250000 0.375000 +vt 0.583333 0.583333 +vt 0.583333 0.604167 +vt 0.562500 0.604167 +vt 0.562500 0.645833 +vt 0.354167 0.645833 +vt 0.354167 0.604167 +vt 0.333333 0.604167 +vt 0.333333 0.583333 +vt 0.916667 0.916667 +vt 0.916667 0.875000 +vt 0.875000 0.875000 +vt 0.875000 0.916667 +vt 0.583333 0.479167 +vt 0.604167 0.479167 +vt 0.604167 0.500000 +vt 0.583333 0.500000 +vt 0.583333 0.750000 +vt 0.583333 0.770833 +vt 0.604167 0.770833 +vt 0.604167 0.750000 +vt 0.541667 0.833333 +vt 0.562500 0.833333 +vt 0.562500 0.791667 +vt 0.541667 0.791667 +vt 0.875000 0.500000 +vt 0.875000 0.395833 +vt 0.854167 0.395833 +vt 0.854167 0.458333 +vt 0.854167 0.479167 +vt 0.854167 0.500000 +vt 0.270833 0.833333 +vt 0.270833 0.854167 +vt 0.583333 0.354167 +vt 0.583333 0.395833 +vt 0.833333 0.395833 +vt 0.833333 0.354167 +vt 0.812500 0.354167 +vt 0.812500 0.395833 +vt 0.604167 0.395833 +vt 0.604167 0.354167 +vt 0.833333 0.583333 +vt 0.875000 0.583333 +vt 0.875000 0.562500 +vt 0.833333 0.562500 +vt 0.291667 0.937500 +vt 0.291667 0.895833 +vt 0.250000 0.895833 +vt 0.250000 0.916667 +vt 0.270833 0.916667 +vt 0.270833 0.937500 +vt 0.541667 0.833333 +vt 0.541667 0.854167 +vt 0.562500 0.854167 +vt 0.562500 0.833333 +vt 0.562500 0.604167 +vt 0.583333 0.604167 +vt 0.583333 0.583333 +vt 0.354167 0.604167 +vt 0.354167 0.645833 +vt 0.562500 0.645833 +vt 0.937500 0.270833 +vt 0.958333 0.270833 +vt 0.083333 0.937500 +vt 0.104167 0.937500 +vt 0.104167 0.916667 +vt 0.125000 0.916667 +vt 0.125000 0.895833 +vt 0.083333 0.895833 +vt 0.791667 0.520833 +vt 0.791667 0.500000 +vt 0.583333 0.500000 +vt 0.583333 0.520833 +vt 0.458333 0.312500 +vt 0.479167 0.312500 +vt 0.479167 0.333333 +vt 0.458333 0.333333 +vt 0.895833 0.416667 +vt 0.875000 0.416667 +vt 0.875000 0.208333 +vt 0.895833 0.208333 +vt 0.375000 0.020833 +vt 0.375000 0.000000 +vt 0.583333 0.000000 +vt 0.583333 0.020833 +vt 0.583333 0.041667 +vt 0.375000 0.041667 +vt 0.291667 0.854167 +vt 0.250000 0.895833 +vt 0.270833 0.895833 +vt 0.291667 0.895833 +vt 0.562500 0.395833 +vt 0.562500 0.458333 +vt 0.583333 0.458333 +vt 0.583333 0.395833 +vt 0.020833 0.291667 +vt 0.020833 0.312500 +vt 0.041667 0.312500 +vt 0.041667 0.291667 +vt 0.937500 0.291667 +vt 0.937500 0.333333 +vt 0.916666 0.333333 +vt 0.916666 0.291667 +vt 0.854167 0.750000 +vt 0.854167 0.770833 +vt 0.729167 0.958333 +vt 0.729167 0.937500 +vt 0.708333 0.937500 +vt 0.541667 0.833333 +vt 0.562500 0.833333 +vt 0.562500 0.854167 +vt 0.541667 0.854167 +vt 0.583333 0.333333 +vt 0.833333 0.333333 +vt 0.312500 0.729167 +vt 0.312500 0.750000 +vt 0.166667 0.937500 +vt 0.166667 0.895833 +vt 0.208333 0.895833 +vt 0.208333 0.937500 +vt 0.958333 0.750000 +vt 0.958333 0.708333 +vt 0.937500 0.708333 +vt 0.937500 0.729167 +vt 0.916666 0.729167 +vt 0.916666 0.750000 +vt 0.604167 0.479167 +vt 0.812500 0.479167 +vt 0.875000 0.854167 +vt 0.916667 0.854167 +vt 0.833333 0.500000 +vt 0.958333 0.250000 +vt 0.979167 0.250000 +vt 0.979167 0.208333 +vt 0.958333 0.208333 +vt 0.354167 0.250000 +vt 0.354167 0.270833 +vt 0.375000 0.270833 +vt 0.375000 0.250000 +vt 0.750000 0.312500 +vt 0.645833 0.312500 +vt 0.645833 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.208333 +vt 0.666667 0.208333 +vt 0.666667 0.250000 +vt 0.729167 0.250000 +vt 0.729167 0.291667 +vt 0.750000 0.291667 +vt 0.000000 0.625000 +vt 0.208333 0.625000 +vt 0.208333 0.833333 +vt 0.000000 0.833333 +vt 0.020833 0.020833 +vt 0.020833 0.041667 +vt 0.041667 0.583333 +vt 0.333333 0.291667 +vt 0.354167 0.291667 +vt 0.354167 0.312500 +vt 0.333333 0.312500 +vt 0.375000 0.895833 +vt 0.375000 0.916667 +vt 0.395833 0.916667 +vt 0.395833 0.937500 +vt 0.416667 0.937500 +vt 0.416667 0.895833 +vt 0.583333 0.333333 +vt 0.583333 0.312500 +vt 0.604167 0.312500 +vt 0.604167 0.291667 +vt 0.625000 0.291667 +vt 0.625000 0.333333 +vt 0.562500 0.583333 +vt 0.541667 0.583333 +vt 0.541667 0.541667 +vt 0.562500 0.541667 +vt 0.916666 0.416667 +vt 0.916666 0.520833 +vt 0.875000 0.520833 +vt 0.875000 0.416667 +vt 0.270833 0.687500 +vt 0.291667 0.687500 +vt 0.291667 0.708333 +vt 0.270833 0.708333 +vt 0.854167 0.812500 +vt 0.854167 0.833333 +vt 0.875000 0.833333 +vt 0.875000 0.812500 +vt 0.583333 0.750000 +vt 0.604167 0.750000 +vt 0.604167 0.770833 +vt 0.583333 0.770833 +vt 0.541667 0.312500 +vt 0.541667 0.333333 +vt 0.562500 0.333333 +vt 0.562500 0.312500 +vt 0.812500 0.583333 +vt 0.833333 0.583333 +vt 0.833333 0.541667 +vt 0.812500 0.541667 +vt 0.583333 0.291667 +vt 0.583333 0.583333 +vt 0.583333 0.541667 +vt 0.791667 0.541667 +vt 0.791667 0.583333 +vt 0.604167 0.395833 +vt 0.812500 0.395833 +vt 0.812500 0.354167 +vt 0.583333 0.354167 +vt 0.604167 0.354167 +vt 0.750000 0.312500 +vt 0.791667 0.312500 +vt 0.791667 0.333333 +vt 0.750000 0.333333 +vt 0.541667 0.770833 +vt 0.541667 0.750000 +vt 0.333333 0.750000 +vt 0.333333 0.770833 +vt 0.333333 0.312500 +vt 0.354167 0.312500 +vt 0.354167 0.333333 +vt 0.333333 0.333333 +vt 0.645833 0.687500 +vt 0.625000 0.687500 +vt 0.625000 0.625000 +vt 0.645833 0.625000 +vt 0.291667 0.958333 +vt 0.250000 0.958333 +vt 0.250000 0.937500 +vt 0.270833 0.937500 +vt 0.291667 0.937500 +vt 0.208333 0.937500 +vt 0.208333 0.958333 +vt 0.166667 0.958333 +vt 0.166667 0.937500 +vt 0.958333 0.812500 +vt 0.937500 0.812500 +vt 0.937500 0.770833 +vt 0.958333 0.770833 +vt 0.583333 0.541667 +vt 0.583333 0.583333 +vt 0.583333 0.520833 +vt 0.541667 0.395833 +vt 0.562500 0.479167 +vt 0.562500 0.500000 +vt 0.541667 0.500000 +vt 0.666667 0.333333 +vt 0.708333 0.333333 +vt 0.708333 0.312500 +vt 0.666667 0.312500 +vt 0.916666 0.708333 +vt 0.958333 0.645833 +vt 0.958333 0.687500 +vt 0.937500 0.687500 +vt 0.937500 0.645833 +vt 0.500000 0.958333 +vt 0.541667 0.958333 +vt 0.541667 0.937500 +vt 0.500000 0.937500 +vt 0.750000 0.687500 +vt 0.750000 0.666667 +vt 0.729167 0.666667 +vt 0.729167 0.625000 +vt 0.666667 0.625000 +vt 0.666667 0.583333 +vt 0.625000 0.583333 +vt 0.937500 0.708333 +vt 0.958333 0.708333 +vt 0.583333 0.791667 +vt 0.583333 0.833333 +vt 0.833333 0.875000 +vt 0.854167 0.875000 +vt 0.854167 0.895833 +vt 0.833333 0.895833 +vt 0.291667 0.854167 +vt 0.291667 0.895833 +vt 0.312500 0.895833 +vt 0.333333 0.895833 +vt 0.041667 0.854167 +vt 0.041667 0.833333 +vt 0.312500 0.729167 +vt 0.312500 0.750000 +vt 0.166667 0.979167 +vt 0.145833 0.979167 +vt 0.145833 0.937500 +vt 0.166667 0.937500 +vt 0.854167 0.812500 +vt 0.875000 0.812500 +vt 0.875000 0.833333 +vt 0.854167 0.833333 +vt 0.104167 0.937500 +vt 0.104167 0.979167 +vt 0.125000 0.979167 +vt 0.125000 0.937500 +vt 0.833333 0.895833 +vt 0.833333 0.937500 +vt 0.791667 0.937500 +vt 0.791667 0.895833 +vt 0.937500 0.625000 +vt 0.958333 0.625000 +vt 0.916667 0.833333 +vt 0.937500 0.833333 +vt 0.937500 0.854167 +vt 0.916667 0.854167 +vt 0.625000 0.333333 +vt 0.666667 0.333333 +vt 0.666667 0.312500 +vt 0.625000 0.312500 +vt 0.395833 0.291667 +vt 0.416667 0.291667 +vt 0.416667 0.312500 +vt 0.395833 0.312500 +vt 0.604167 0.708333 +vt 0.583333 0.708333 +vt 0.583333 0.645833 +vt 0.604167 0.645833 +vt 0.416667 0.895833 +vt 0.458333 0.895833 +vt 0.458333 0.937500 +vt 0.437500 0.937500 +vt 0.437500 0.916667 +vt 0.416667 0.916667 +vt 0.666667 0.916667 +vt 0.708333 0.916667 +vt 0.708333 0.937500 +vt 0.666667 0.937500 +vt 0.312500 0.833333 +vt 0.333333 0.833333 +vt 0.333333 0.791667 +vt 0.312500 0.791667 +vt 0.312500 0.895833 +vt 0.291667 0.895833 +vt 0.291667 0.854167 +vt 0.312500 0.854167 +vt 0.375000 0.291667 +vt 0.583333 0.250000 +vt 0.583333 0.270833 +vt 0.583333 0.291667 +vt 0.458333 0.333333 +vt 0.458333 0.312500 +vt 0.437500 0.312500 +vt 0.437500 0.291667 +vt 0.416667 0.291667 +vt 0.416667 0.333333 +vt 0.250000 0.937500 +vt 0.208333 0.937500 +vt 0.208333 0.895833 +vt 0.250000 0.895833 +vt 0.937500 0.895833 +vt 0.958333 0.895833 +vt 0.958333 0.916667 +vt 0.937500 0.916667 +vt 0.583333 0.875000 +vt 0.791667 0.875000 +vt 0.791667 0.895833 +vt 0.583333 0.895833 +vt 0.937500 0.104167 +vt 0.958333 0.104167 +vt 0.958333 0.041667 +vt 0.937500 0.041667 +vt 0.291667 0.729167 +vt 0.291667 0.770833 +vt 0.270833 0.770833 +vt 0.270833 0.729167 +vt 0.875000 0.520833 +vt 0.875000 0.625000 +vt 0.916666 0.625000 +vt 0.916666 0.520833 +vt 0.687500 0.958333 +vt 0.687500 0.937500 +vt 0.645833 0.937500 +vt 0.645833 0.958333 +vt 0.583333 0.729167 +vt 0.583333 0.750000 +vt 0.604167 0.750000 +vt 0.604167 0.729167 +vt 0.958333 0.375000 +vt 0.958333 0.416667 +vt 0.937500 0.416667 +vt 0.937500 0.375000 +vt 0.854167 0.937500 +vt 0.875000 0.937500 +vt 0.875000 0.958333 +vt 0.854167 0.958333 +vt 0.583333 0.500000 +vt 0.604167 0.500000 +vt 0.270833 0.833333 +vt 0.250000 0.833333 +vt 0.250000 0.625000 +vt 0.270833 0.625000 +vt 0.312500 0.041667 +vt 0.312500 0.145833 +vt 0.333333 0.145833 +vt 0.333333 0.187500 +vt 0.312500 0.187500 +vt 0.937500 0.354167 +vt 0.958333 0.354167 +vt 0.958333 0.312500 +vt 0.937500 0.312500 +vt 0.541667 0.750000 +vt 0.541667 0.770833 +vt 0.291667 0.604167 +vt 0.291667 0.625000 +vt 0.604167 0.958333 +vt 0.604167 0.937500 +vt 0.583333 0.937500 +vt 0.562500 0.937500 +vt 0.562500 0.958333 +vt 0.875000 0.625000 +vt 0.875000 0.687500 +vt 0.854167 0.687500 +vt 0.854167 0.625000 +vt 0.020833 0.187500 +vt 0.000000 0.187500 +vt 0.000000 0.145833 +vt 0.020833 0.145833 +vt 0.833333 0.333333 +vt 0.875000 0.333333 +vt 0.875000 0.312500 +vt 0.833333 0.312500 +vt 0.958333 0.041667 +vt 0.958333 0.083333 +vt 0.979167 0.083333 +vt 0.979167 0.041667 +vt 0.687500 0.687500 +vt 0.687500 0.708333 +vt 0.625000 0.708333 +vt 0.625000 0.729167 +vt 0.833333 0.729167 +vt 0.833333 0.708333 +vt 0.770833 0.708333 +vt 0.770833 0.687500 +vt 0.354167 0.750000 +vt 0.354167 0.729167 +vt 0.500000 0.291667 +vt 0.520833 0.291667 +vt 0.520833 0.312500 +vt 0.541667 0.312500 +vt 0.541667 0.333333 +vt 0.500000 0.333333 +vt 0.625000 0.312500 +vt 0.645833 0.687500 +vt 0.645833 0.625000 +vt 0.541667 0.833333 +vt 0.541667 0.791667 +vt 0.500000 0.958333 +vt 0.458333 0.958333 +vt 0.458333 0.937500 +vt 0.479167 0.937500 +vt 0.500000 0.937500 +vt 0.270833 0.791667 +vt 0.291667 0.791667 +vt 0.625000 0.250000 +vt 0.604167 0.250000 +vt 0.604167 0.041667 +vt 0.625000 0.041667 +vt 0.750000 0.687500 +vt 0.666667 0.583333 +vt 0.666667 0.625000 +vt 0.729167 0.625000 +vt 0.729167 0.666667 +vt 0.750000 0.666667 +vt 0.041667 0.937500 +vt 0.041667 0.979167 +vt 0.062500 0.979167 +vt 0.062500 0.937500 +vt 0.583333 0.729167 +vt 0.562500 0.729167 +vt 0.916667 0.916667 +vt 0.875000 0.916667 +vt 0.875000 0.958333 +vt 0.895833 0.958333 +vt 0.895833 0.937500 +vt 0.916667 0.937500 +vt 0.916666 0.520833 +vt 0.958333 0.520833 +vt 0.958333 0.416667 +vt 0.916666 0.416667 +vt 0.937500 0.270833 +vt 0.916666 0.270833 +vt 0.916666 0.208333 +vt 0.916666 0.416667 +vt 0.916666 0.354167 +vt 0.937500 0.354167 +vt 0.354167 0.020833 +vt 0.354167 0.041667 +vt 0.312500 0.708333 +vt 0.312500 0.645833 +vt 0.291667 0.645833 +vt 0.291667 0.750000 +vt 0.270833 0.791667 +vt 0.270833 0.833333 +vt 0.291667 0.833333 +vt 0.291667 0.791667 +vt 0.875000 0.875000 +vt 0.833333 0.916667 +vt 0.875000 0.916667 +vt 0.958333 0.375000 +vt 0.937500 0.375000 +vt 0.583333 0.333333 +vt 0.583333 0.500000 +vt 0.875000 0.708333 +vt 0.875000 0.750000 +vt 0.833333 0.750000 +vt 0.833333 0.708333 +vt 0.312500 0.020833 +vt 0.916667 0.750000 +vt 0.937500 0.750000 +vt 0.979167 0.125000 +vt 0.958333 0.125000 +vt 0.958333 0.083333 +vt 0.979167 0.083333 +vt 0.833333 0.833333 +vt 0.833333 0.875000 +vt 0.875000 0.875000 +vt 0.583333 0.875000 +vt 0.625000 0.875000 +vt 0.625000 0.833333 +vt 0.812500 0.479167 +vt 0.812500 0.500000 +vt 0.020833 0.895833 +vt 0.041667 0.895833 +vt 0.020833 0.854167 +vt 0.000000 0.854167 +vt 0.000000 0.895833 +vt 0.020833 0.895833 +vt 0.000000 0.895833 +vt 0.000000 0.854167 +vt 0.020833 0.854167 +vt 0.041667 0.854167 +vt 0.041667 0.895833 +vt 0.270833 0.937500 +vt 0.250000 0.937500 +vt 0.250000 0.958333 +vt 0.416667 0.958333 +vt 0.416667 0.937500 +vt 0.541667 0.291667 +vt 0.291667 0.833333 +vt 0.291667 0.791667 +vt 0.604167 0.937500 +vt 0.645833 0.937500 +vt 0.645833 0.958333 +vt 0.604167 0.958333 +vt 0.937500 0.750000 +vt 0.958333 0.750000 +vt 0.833333 0.750000 +vt 0.625000 0.750000 +vt 0.916667 0.958333 +vt 0.395833 0.312500 +vt 0.416667 0.312500 +vt 0.416667 0.333333 +vt 0.395833 0.333333 +vt 0.604167 0.729167 +vt 0.604167 0.750000 +vt 0.583333 0.750000 +vt 0.250000 0.958333 +vt 0.208333 0.958333 +vt 0.208333 0.937500 +vt 0.229167 0.937500 +vt 0.250000 0.937500 +vt 0.916666 0.520833 +vt 0.916666 0.416667 +vt 0.604167 0.270833 +vt 0.958333 0.208333 +vt 0.958333 0.187500 +vt 0.937500 0.187500 +vt 0.937500 0.145833 +vt 0.875000 0.145833 +vt 0.875000 0.104167 +vt 0.833333 0.104167 +vt 0.541667 0.583333 +vt 0.541667 0.333333 +vt 0.520833 0.354167 +vt 0.520833 0.562500 +vt 0.625000 0.750000 +vt 0.625000 0.645833 +vt 0.458333 0.291667 +vt 0.500000 0.333333 +vt 0.500000 0.291667 +vt 0.562500 0.750000 +vt 0.583333 0.854167 +vt 0.583333 0.895833 +vt 0.562500 0.895833 +vt 0.541667 0.895833 +vt 0.833333 0.958333 +vt 0.875000 0.916667 +vt 0.833333 0.916667 +vt 0.750000 0.687500 +vt 0.750000 0.666667 +vt 0.770833 0.666667 +vt 0.770833 0.625000 +vt 0.833333 0.625000 +vt 0.833333 0.583333 +vt 0.875000 0.583333 +vt 0.854167 0.625000 +vt 0.854167 0.687500 +vt 0.000000 0.937500 +vt 0.000000 0.895833 +vt 0.041667 0.895833 +vt 0.041667 0.937500 +vt 0.625000 0.645833 +vt 0.625000 0.750000 +vt 0.291667 0.791667 +vt 0.291667 0.833333 +vt 0.312500 0.833333 +vt 0.312500 0.791667 +vt 0.229167 0.708333 +vt 0.229167 0.750000 +vt 0.208333 0.750000 +vt 0.208333 0.708333 +vt 0.333333 0.041667 +vt 0.333333 0.250000 +vt 0.937500 0.833333 +vt 0.958333 0.833333 +vt 0.958333 0.854167 +vt 0.937500 0.854167 +vt 0.604167 0.020833 +vt 0.916667 0.833333 +vt 0.937500 0.833333 +vt 0.875000 0.687500 +vt 0.833333 0.687500 +vt 0.541667 0.583333 +vt 0.562500 0.583333 +vt 0.562500 0.541667 +vt 0.541667 0.541667 +vt 0.333333 0.958333 +vt 0.375000 0.958333 +vt 0.375000 0.937500 +vt 0.333333 0.937500 +vt 0.916666 0.729167 +vt 0.875000 0.729167 +vt 0.875000 0.625000 +vt 0.916666 0.625000 +vt 0.750000 0.312500 +vt 0.854167 0.312500 +vt 0.854167 0.250000 +vt 0.875000 0.250000 +vt 0.875000 0.208333 +vt 0.833333 0.208333 +vt 0.833333 0.250000 +vt 0.770833 0.250000 +vt 0.770833 0.291667 +vt 0.750000 0.291667 +vt 0.020833 0.833333 +vt 0.041667 0.833333 +vt 0.312500 0.562500 +vt 0.312500 0.354167 +vt 0.916667 0.000000 +vt 0.958333 0.000000 +vt 0.833333 0.104167 +vt 0.833333 0.083333 +vt 0.854167 0.083333 +vt 0.854167 0.041667 +vt 0.916667 0.041667 +vt 0.833333 0.208333 +vt 0.833333 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.208333 +vt 0.583333 0.812500 +vt 0.875000 0.812500 +vt 0.833333 0.812500 +vt 0.833333 0.770833 +vt 0.625000 0.770833 +vt 0.625000 0.812500 +vt 0.916667 0.895833 +vt 0.937500 0.895833 +vt 0.000000 0.625000 +vt 0.270833 0.333333 +vt 0.291667 0.333333 +vt 0.291667 0.354167 +vt 0.937500 0.291667 +vt 0.958333 0.291667 +vt 0.958333 0.520833 +vt 0.916666 0.520833 +vt 0.916666 0.625000 +vt 0.958333 0.625000 +vt 0.937500 0.833333 +vt 0.958333 0.833333 +vt 0.770833 0.958333 +vt 0.770833 0.937500 +vt 0.562500 0.729167 +vt 0.562500 0.750000 +vt 0.312500 0.833333 +vt 0.291667 0.750000 +vt 0.291667 0.645833 +vt 0.875000 0.729167 +vt 0.916666 0.729167 +vt 0.916666 0.750000 +vt 0.875000 0.750000 +vt 0.916666 0.625000 +vt 0.916666 0.520833 +vt 0.833333 0.875000 +vt 0.833333 0.833333 +vt 0.625000 0.833333 +vt 0.625000 0.875000 +vt 0.604167 0.833333 +vt 0.604167 0.812500 +vt 0.875000 0.875000 +vt 0.833333 0.583333 +vt 0.812500 0.583333 +vt 0.812500 0.541667 +vt 0.833333 0.541667 +vt 0.791667 0.333333 +vt 0.833333 0.333333 +vt 0.833333 0.312500 +vt 0.791667 0.312500 +vt 0.041667 0.937500 +vt 0.041667 0.916667 +vt 0.062500 0.916667 +vt 0.062500 0.895833 +vt 0.083333 0.895833 +vt 0.083333 0.937500 +vt 0.125000 0.895833 +vt 0.125000 0.937500 +vt 0.166667 0.937500 +vt 0.166667 0.916667 +vt 0.145833 0.916667 +vt 0.145833 0.895833 +vt 0.333333 0.937500 +vt 0.375000 0.937500 +vt 0.375000 0.916667 +vt 0.354167 0.916667 +vt 0.354167 0.895833 +vt 0.333333 0.895833 +vt 0.958333 0.291667 +vt 0.958333 0.333333 +vt 0.979167 0.333333 +vt 0.979167 0.291667 +vt 0.375000 0.895833 +vt 0.312500 0.916667 +vt 0.291667 0.916667 +vt 0.291667 0.937500 +vt 0.333333 0.937500 +vt 0.333333 0.895833 +vt 0.583333 0.333333 +vt 0.541667 0.291667 +vt 0.583333 0.291667 +vt 0.458333 0.895833 +vt 0.479167 0.895833 +vt 0.479167 0.916667 +vt 0.500000 0.916667 +vt 0.500000 0.937500 +vt 0.458333 0.937500 +vt 0.937500 0.916667 +vt 0.916667 0.916667 +vt 0.375000 0.937500 +vt 0.270833 0.708333 +vt 0.291667 0.708333 +vt 0.208333 0.770833 +vt 0.229167 0.770833 +vt 0.229167 0.833333 +vt 0.229167 0.625000 +vt 0.229167 0.687500 +vt 0.208333 0.687500 +vt 0.833333 0.562500 +vt 0.875000 0.562500 +vt 0.833333 0.875000 +vt 0.791667 0.875000 +vt 0.958333 0.291667 +vt 0.937500 0.291667 +vt 0.979167 0.291667 +vt 0.958333 0.291667 +vt 0.958333 0.250000 +vt 0.979167 0.250000 +vt 0.812500 0.500000 +vt 0.145833 0.333333 +vt 0.145833 0.312500 +vt 0.187500 0.312500 +vt 0.187500 0.333333 +vt 0.291667 0.333333 +vt 0.291667 0.583333 +vt 0.875000 0.312500 +vt 0.020833 0.833333 +vt 0.291667 0.895833 +vt 0.270833 0.895833 +vt 0.291667 0.854167 +vt 0.125000 0.937500 +vt 0.125000 0.979167 +vt 0.145833 0.979167 +vt 0.145833 0.937500 +vt 0.583333 0.812500 +vt 0.625000 0.812500 +vt 0.625000 0.770833 +vt 0.833333 0.770833 +vt 0.833333 0.812500 +vt 0.729167 0.937500 +vt 0.729167 0.916667 +vt 0.791667 0.916667 +vt 0.583333 0.916667 +vt 0.645833 0.916667 +vt 0.645833 0.937500 +vt 0.583333 0.854167 +vt 0.541667 0.895833 +vt 0.562500 0.895833 +vt 0.583333 0.895833 +vt 0.833333 0.583333 +vt 0.833333 0.625000 +vt 0.770833 0.625000 +vt 0.770833 0.666667 +vt 0.750000 0.666667 +vt 0.750000 0.687500 +vt 0.458333 0.291667 +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 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.7071 0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +g forsaken_fire.vox_forsaken_fire.vox_forsaken_fire.vox_Material +usemtl forsaken_fire.vox_Material +s off +f 67/1/1 195/2/1 196/3/1 66/4/1 +f 114/5/2 115/6/2 19/7/2 70/8/2 +f 275/9/3 276/10/3 171/11/3 122/12/3 +f 254/13/4 262/14/4 316/15/4 37/16/4 +f 21/17/3 20/18/3 193/19/3 138/20/3 +f 98/21/5 99/22/5 331/23/5 163/24/5 +f 161/25/2 324/26/2 319/27/2 160/28/2 95/29/2 +f 266/30/2 268/31/2 332/32/2 164/33/2 +f 73/34/5 133/35/5 65/36/5 236/37/5 +f 256/38/6 199/39/6 255/40/6 204/41/6 205/42/6 203/43/6 +f 138/44/2 193/45/2 292/46/2 139/47/2 +f 30/48/2 34/49/2 33/50/2 151/51/2 +f 74/52/5 288/53/5 187/54/5 71/55/5 +f 306/56/3 307/57/3 257/58/3 310/59/3 311/60/3 147/61/3 +f 134/62/3 133/63/3 73/64/3 140/65/3 +f 20/66/2 21/67/2 15/68/2 123/69/2 +f 301/70/3 144/71/3 34/72/3 30/73/3 +f 159/74/4 46/75/4 330/76/4 216/77/4 320/78/4 +f 226/79/2 227/80/2 186/81/2 13/82/2 +f 69/83/2 84/84/2 262/85/2 254/86/2 203/87/2 251/88/2 27/89/2 126/90/2 +f 242/91/1 286/92/1 285/93/1 190/94/1 +f 132/95/5 243/96/5 275/97/5 122/98/5 +f 75/99/4 250/100/4 127/101/4 59/102/4 +f 202/103/3 79/104/3 203/43/3 256/38/3 +f 127/105/2 250/106/2 142/107/2 176/108/2 +f 29/109/4 28/110/4 233/111/4 118/112/4 31/113/4 81/114/4 253/115/4 145/116/4 +f 118/117/2 119/118/2 308/119/2 31/120/2 +f 80/121/3 77/122/3 301/70/3 32/123/3 +f 228/124/6 229/125/6 227/126/6 226/127/6 +f 301/128/5 30/129/5 151/130/5 200/131/5 +f 202/132/1 258/133/1 315/134/1 79/135/1 +f 80/136/5 32/137/5 310/138/5 257/139/5 +f 324/140/3 161/141/3 327/142/3 326/143/3 +f 257/58/6 310/59/6 200/144/6 307/57/6 +f 181/145/4 249/146/4 136/147/4 184/148/4 +f 251/149/6 76/150/6 143/151/6 27/152/6 +f 63/153/5 72/154/5 130/155/5 117/156/5 +f 136/157/3 249/158/3 290/159/3 23/160/3 135/161/3 291/162/3 28/163/3 29/164/3 +f 7/165/1 173/166/1 64/167/1 52/168/1 +f 41/169/3 157/170/3 90/171/3 160/172/3 319/173/3 263/174/3 +f 107/175/2 55/176/2 276/177/2 275/178/2 +f 32/123/6 146/179/6 255/40/6 201/180/6 30/73/6 301/70/6 +f 252/181/3 145/182/3 78/183/3 303/184/3 +f 102/185/2 222/186/2 103/187/2 172/188/2 278/189/2 51/190/2 269/191/2 101/192/2 +f 26/193/4 174/194/4 186/195/4 193/196/4 +f 255/197/2 199/198/2 88/199/2 152/200/2 +f 302/201/4 309/202/4 150/203/4 149/204/4 +f 111/205/4 62/206/4 167/207/4 104/208/4 +f 207/209/4 191/210/4 68/211/4 76/212/4 251/88/4 203/87/4 205/213/4 155/214/4 +f 202/132/5 256/215/5 153/216/5 258/133/5 +f 222/217/4 11/218/4 29/109/4 251/88/4 113/219/4 224/220/4 9/221/4 58/222/4 173/223/4 7/224/4 +f 198/225/1 300/226/1 289/227/1 285/228/1 +f 98/229/6 163/230/6 46/231/6 159/232/6 93/233/6 217/234/6 +f 304/235/4 87/236/4 88/237/4 199/238/4 +f 271/239/4 272/240/4 166/241/4 101/192/4 269/191/4 3/242/4 12/243/4 280/244/4 +f 140/65/6 246/245/6 247/246/6 73/64/6 +f 48/247/6 321/248/6 267/249/6 97/250/6 268/251/6 266/252/6 +f 221/253/1 219/254/1 218/255/1 220/256/1 +f 233/257/3 277/258/3 57/259/3 11/260/3 +f 58/261/3 281/262/3 109/263/3 173/264/3 +f 86/265/3 148/266/3 38/267/3 313/268/3 82/269/3 33/270/3 +f 113/219/1 251/88/1 27/89/1 126/90/1 +f 210/271/4 153/216/4 258/133/4 267/272/4 321/273/4 214/274/4 +f 18/275/1 141/276/1 75/277/1 59/278/1 +f 141/279/6 142/280/6 250/281/6 75/282/6 +f 236/283/3 238/284/3 279/285/3 237/286/3 +f 205/287/2 37/16/2 316/15/2 155/288/2 +f 324/26/4 326/289/4 45/290/4 263/291/4 319/27/4 +f 303/292/2 78/293/2 209/294/2 82/295/2 +f 102/296/5 168/297/5 224/220/5 9/221/5 58/222/5 173/223/5 7/224/5 222/217/5 +f 77/298/4 307/299/4 200/131/4 301/128/4 +f 328/300/3 162/301/3 325/302/3 329/303/3 +f 192/304/6 69/305/6 126/306/6 128/307/6 68/308/6 191/309/6 +f 78/310/5 145/116/5 29/109/5 251/88/5 203/87/5 79/311/5 +f 227/312/5 229/313/5 174/194/5 186/195/5 +f 203/87/5 205/213/5 155/214/5 259/314/5 +f 283/315/4 286/316/4 242/317/4 240/318/4 +f 156/319/6 152/320/6 88/321/6 87/322/6 +f 293/323/5 137/324/5 57/325/5 277/326/5 106/327/5 52/328/5 64/329/5 235/330/5 134/331/5 140/332/5 +f 34/333/3 303/334/3 202/335/3 304/336/3 +f 248/337/6 25/338/6 136/157/6 249/158/6 +f 201/180/3 304/339/3 199/39/3 255/40/3 +f 129/340/3 243/341/3 132/342/3 131/343/3 +f 5/344/6 103/345/6 222/346/6 7/347/6 52/348/6 106/349/6 +f 207/350/3 155/351/3 316/352/3 262/353/3 84/354/3 208/355/3 +f 280/356/2 17/357/2 8/358/2 271/359/2 +f 232/360/2 306/361/2 147/362/2 231/363/2 +f 245/364/3 26/365/3 194/366/3 22/367/3 +f 253/368/1 81/369/1 309/370/1 302/371/1 +f 245/364/6 26/365/6 193/19/6 138/20/6 +f 305/372/2 204/373/2 154/374/2 261/375/2 +f 81/376/6 35/377/6 150/378/6 309/379/6 +f 60/380/4 188/381/4 170/382/4 274/383/4 +f 259/384/6 155/351/6 316/352/6 262/353/6 +f 111/385/2 104/386/2 220/256/2 221/253/2 273/387/2 281/388/2 +f 62/389/2 60/390/2 274/391/2 224/220/2 113/219/2 251/88/2 75/277/2 59/278/2 272/392/2 167/393/2 +f 110/394/5 230/395/5 238/396/5 236/397/5 +f 220/398/4 218/399/4 1/400/4 2/401/4 +f 29/109/5 28/110/5 233/111/5 11/218/5 +f 283/402/3 284/403/3 285/404/3 286/405/3 +f 25/406/5 248/407/5 180/408/5 183/409/5 +f 100/410/5 332/411/5 268/412/5 97/413/5 322/414/5 +f 247/415/5 197/416/5 294/417/5 73/418/5 +f 247/419/2 246/420/2 279/421/2 238/422/2 +f 165/423/4 109/424/4 281/388/4 273/387/4 221/253/4 50/425/4 +f 33/50/1 82/295/1 303/292/1 34/49/1 +f 125/426/2 18/275/2 141/276/2 75/277/2 255/197/2 146/427/2 260/428/2 36/429/2 +f 13/430/4 124/431/4 228/432/4 226/433/4 +f 113/434/3 126/306/3 128/307/3 68/308/3 +f 190/435/5 285/436/5 284/437/5 70/438/5 +f 60/380/5 281/388/5 273/387/5 274/383/5 +f 177/439/6 179/440/6 115/441/6 114/442/6 +f 292/443/4 193/444/4 20/445/4 123/446/4 234/447/4 6/448/4 4/449/4 180/408/4 183/409/4 25/406/4 +f 284/437/4 298/450/4 198/451/4 285/436/4 +f 223/452/5 61/453/5 62/206/5 167/207/5 +f 273/454/3 9/455/3 224/456/3 274/457/3 +f 151/51/1 39/458/1 41/459/1 263/460/1 91/461/1 33/50/1 +f 82/462/4 258/133/4 202/132/4 303/463/4 +f 32/464/2 301/128/2 200/131/2 310/465/2 +f 130/466/2 244/467/2 276/468/2 117/469/2 +f 146/470/5 305/471/5 261/472/5 260/473/5 +f 15/474/4 21/475/4 138/476/4 13/477/4 +f 171/478/2 282/479/2 132/480/2 122/481/2 +f 114/482/4 70/438/4 190/435/4 177/483/4 +f 55/484/5 56/485/5 171/486/5 276/487/5 +f 225/488/6 56/489/6 55/490/6 107/491/6 +f 244/492/3 130/493/3 72/494/3 282/495/3 +f 137/496/2 29/497/2 11/498/2 57/499/2 +f 158/500/3 318/501/3 92/502/3 96/503/3 317/504/3 42/505/3 +f 70/506/3 19/507/3 178/508/3 190/509/3 +f 278/510/4 108/511/4 270/512/4 51/513/4 +f 160/514/5 90/515/5 148/516/5 86/517/5 33/50/5 91/461/5 +f 89/518/3 88/321/3 87/322/3 258/519/3 153/520/3 210/521/3 +f 189/522/6 127/523/6 176/524/6 18/525/6 125/526/6 241/527/6 +f 99/528/3 216/529/3 330/530/3 331/531/3 +f 287/532/5 289/533/5 300/534/5 299/535/5 +f 111/536/3 281/537/3 60/538/3 62/539/3 +f 28/540/1 24/541/1 277/542/1 233/543/1 +f 174/544/2 26/545/2 245/546/2 124/547/2 +f 241/548/1 206/549/1 85/550/1 189/551/1 +f 328/552/4 264/553/4 44/554/4 162/555/4 +f 255/556/4 152/557/4 154/558/4 204/559/4 +f 66/560/5 196/561/5 247/562/5 238/563/5 +f 269/564/3 51/565/3 270/566/3 3/567/3 +f 132/342/6 282/495/6 244/492/6 243/341/6 +f 145/116/4 35/568/4 209/569/4 78/310/4 +f 111/570/3 280/571/3 12/572/3 108/573/3 +f 251/149/3 29/164/3 137/574/3 293/575/3 294/576/3 197/577/3 297/578/3 27/152/3 +f 140/579/1 73/580/1 236/581/1 237/582/1 +f 1/400/2 49/583/2 50/584/2 2/401/2 +f 203/43/3 254/585/3 37/586/3 205/42/3 +f 99/587/1 98/588/1 217/589/1 320/590/1 216/591/1 +f 128/592/2 143/593/2 76/594/2 68/595/2 +f 136/157/3 75/282/3 141/279/3 295/596/3 296/597/3 139/598/3 292/599/3 25/338/3 +f 139/600/4 296/601/4 245/602/4 138/603/4 +f 116/604/4 129/605/4 131/606/4 121/607/4 +f 13/82/1 138/44/1 193/45/1 186/81/1 +f 171/11/6 122/12/6 275/9/6 116/608/6 121/609/6 120/610/6 278/611/6 172/612/6 10/613/6 63/614/6 117/615/6 276/10/6 +f 301/128/1 200/131/1 86/616/1 144/617/1 +f 36/618/3 260/619/3 261/620/3 154/621/3 85/622/3 206/623/3 +f 277/326/4 24/624/4 137/324/4 57/325/4 +f 180/408/1 248/407/1 249/625/1 181/626/1 +f 270/512/1 108/511/1 109/627/1 165/628/1 50/584/1 2/401/1 +f 329/629/5 325/630/5 317/631/5 96/632/5 265/633/5 +f 245/546/1 296/634/1 295/635/1 26/545/1 +f 83/636/3 315/637/3 258/519/3 82/269/3 209/638/3 314/639/3 +f 290/640/2 249/625/2 181/626/2 180/408/2 4/449/2 105/641/2 120/642/2 121/643/2 131/644/2 132/645/2 +f 16/646/1 22/647/1 194/648/1 239/649/1 +f 144/617/2 301/128/2 136/147/2 29/497/2 145/650/2 252/651/2 +f 232/652/6 231/653/6 182/654/6 183/655/6 180/656/6 181/657/6 +f 36/658/4 206/659/4 241/660/4 125/661/4 +f 279/285/6 237/286/6 236/283/6 65/662/6 235/663/6 64/664/6 173/264/6 58/261/6 112/665/6 67/666/6 66/667/6 238/284/6 +f 200/668/6 151/669/6 33/270/6 86/265/6 +f 32/464/1 301/128/1 136/147/1 25/670/1 183/671/1 182/672/1 311/673/1 310/465/1 +f 124/674/4 245/675/4 22/676/4 16/677/4 +f 53/678/6 9/455/6 224/456/6 274/457/6 170/679/6 54/680/6 +f 140/579/2 73/580/2 294/681/2 293/682/2 +f 166/683/1 272/392/1 167/393/1 62/389/1 60/390/1 274/391/1 224/220/1 168/297/1 +f 219/254/5 221/253/5 50/425/5 49/684/5 +f 279/685/5 246/686/5 140/687/5 237/688/5 +f 280/356/1 111/385/1 104/386/1 271/359/1 +f 28/163/6 29/164/6 137/574/6 24/689/6 +f 107/690/4 275/97/4 122/98/4 225/691/4 +f 243/692/2 129/693/2 116/694/2 275/695/2 +f 40/696/4 43/697/4 212/698/4 261/472/4 260/473/4 146/470/4 32/137/4 310/138/4 257/139/4 157/699/4 41/700/4 39/701/4 +f 256/702/2 203/87/2 259/314/2 153/703/2 +f 42/704/4 211/705/4 82/462/4 313/706/4 38/707/4 158/708/4 +f 159/709/2 43/710/2 40/711/2 156/712/2 87/713/2 93/714/2 +f 100/410/1 322/414/1 321/715/1 48/716/1 47/717/1 +f 47/718/4 48/719/4 266/30/4 164/33/4 +f 260/619/6 261/620/6 154/621/6 152/720/6 +f 278/510/5 120/721/5 105/722/5 51/513/5 +f 46/723/2 163/724/2 331/725/2 330/726/2 +f 175/727/1 279/421/1 238/422/1 230/728/1 +f 278/611/3 172/612/3 109/729/3 108/730/3 +f 180/656/3 181/657/3 184/731/3 183/655/3 +f 287/732/3 288/733/3 74/734/3 289/735/3 +f 278/189/1 51/190/1 269/191/1 184/148/1 136/147/1 29/497/1 11/498/1 222/186/1 103/187/1 172/188/1 +f 145/650/2 149/736/2 150/737/2 35/738/2 +f 251/88/1 75/277/1 255/197/1 199/198/1 256/702/1 203/87/1 +f 325/739/2 162/740/2 44/741/2 42/742/2 317/743/2 +f 231/363/4 147/362/4 311/744/4 182/745/4 +f 203/87/1 259/314/1 262/85/1 254/86/1 +f 258/519/6 153/520/6 259/746/6 315/637/6 +f 298/747/1 284/748/1 283/749/1 240/750/1 61/751/1 223/752/1 169/753/1 176/108/1 127/105/1 250/106/1 +f 168/754/6 102/755/6 50/756/6 221/757/6 +f 220/398/5 104/208/5 111/205/5 108/511/5 270/512/5 2/401/5 +f 145/650/1 149/736/1 150/737/1 312/758/1 185/759/1 57/499/1 137/496/1 29/497/1 +f 34/49/5 304/235/5 87/236/5 33/50/5 +f 118/760/6 233/257/6 277/258/6 57/259/6 185/761/6 119/762/6 +f 285/404/6 289/735/6 287/732/6 284/403/6 +f 252/651/1 313/763/1 35/738/1 145/650/1 +f 7/165/2 173/166/2 109/627/2 165/628/2 +f 87/236/5 88/237/5 89/764/5 213/765/5 217/766/5 93/767/5 +f 6/768/6 3/567/6 269/564/6 51/565/6 105/769/6 4/770/6 +f 297/771/5 246/772/5 195/773/5 67/774/5 112/775/5 53/776/5 54/777/5 128/592/5 126/778/5 27/779/5 +f 47/780/3 164/781/3 332/782/3 100/783/3 +f 189/784/5 85/785/5 154/558/5 204/559/5 255/556/5 75/99/5 250/100/5 127/101/5 +f 6/786/1 234/787/1 12/788/1 3/789/1 +f 186/790/3 174/791/3 124/792/3 13/793/3 +f 39/794/3 151/669/3 33/270/3 87/322/3 156/319/3 40/795/3 +f 115/796/5 179/797/5 178/798/5 19/799/5 +f 313/268/6 82/269/6 209/638/6 35/800/6 +f 243/96/4 23/801/4 290/802/4 132/95/4 +f 279/685/4 175/803/4 14/804/4 237/688/4 +f 10/805/4 172/806/4 103/807/4 5/808/4 +f 76/212/5 251/88/5 113/219/5 68/211/5 +f 328/809/1 329/810/1 265/811/1 264/812/1 +f 312/813/5 308/814/5 119/815/5 185/816/5 +f 295/817/4 141/818/4 18/819/4 176/820/4 169/821/4 8/822/4 17/823/4 239/824/4 194/825/4 26/826/4 +f 201/827/1 156/712/1 87/713/1 304/828/1 +f 220/829/3 2/830/3 50/756/3 221/757/3 +f 5/831/2 106/832/2 277/542/2 233/543/2 28/540/2 291/833/2 282/834/2 72/835/2 63/836/2 10/837/2 +f 219/838/6 49/839/6 1/840/6 218/841/6 +f 318/842/5 309/202/5 150/203/5 149/204/5 254/13/5 262/14/5 316/15/5 323/843/5 94/844/5 83/845/5 314/846/5 92/847/5 +f 244/848/4 282/849/4 171/486/4 276/487/4 +f 146/179/3 255/40/3 204/41/3 305/850/3 +f 253/851/3 302/852/3 149/853/3 145/182/3 +f 14/854/2 110/855/2 236/581/2 237/582/2 +f 192/856/1 191/857/1 207/858/1 208/859/1 +f 246/420/1 297/860/1 197/861/1 247/419/1 +f 326/289/1 327/862/1 215/863/1 45/290/1 +f 201/864/5 255/556/5 152/557/5 156/865/5 +f 144/866/4 86/517/4 33/50/4 34/49/4 +f 301/128/5 77/298/5 307/299/5 306/867/5 232/868/5 181/145/5 249/146/5 136/147/5 +f 243/869/2 244/870/2 135/871/2 23/872/2 +f 192/856/5 208/859/5 84/873/5 69/874/5 +f 158/875/2 38/876/2 148/877/2 90/878/2 157/699/2 257/139/2 307/879/2 77/880/2 253/368/2 81/369/2 309/370/2 318/881/2 +f 112/882/2 58/883/2 9/884/2 53/885/2 +f 190/886/1 178/887/1 179/888/1 177/889/1 +f 214/890/3 321/891/3 322/892/3 97/893/3 94/894/3 323/895/3 +f 44/896/6 264/897/6 265/898/6 96/899/6 211/900/6 42/901/6 +f 253/115/5 145/116/5 35/568/5 81/114/5 +f 304/828/2 202/132/2 258/133/2 87/713/2 +f 169/902/6 223/903/6 167/904/6 272/905/6 271/906/6 8/907/6 +f 126/778/4 27/779/4 143/593/4 128/592/4 +f 14/908/6 175/909/6 230/910/6 110/911/6 +f 271/906/3 104/912/3 167/904/3 272/905/3 +f 91/913/6 263/914/6 45/915/6 215/916/6 95/917/6 160/514/6 +f 312/918/3 150/378/3 309/379/3 81/376/3 31/919/3 308/920/3 +f 43/921/3 159/922/3 320/923/3 217/924/3 213/925/3 212/926/3 +f 244/848/5 282/849/5 291/927/5 135/928/5 +f 78/183/6 79/104/6 203/43/6 254/585/6 149/853/6 145/182/6 +f 165/423/5 109/424/5 172/806/5 103/807/5 +f 103/345/3 222/346/3 7/347/3 165/929/3 +f 146/427/1 260/428/1 152/200/1 255/197/1 +f 80/136/1 257/139/1 307/879/1 77/880/1 +f 228/930/1 124/547/1 174/544/1 229/931/1 +f 108/511/2 12/788/2 3/789/2 270/512/2 +f 186/790/6 174/791/6 124/792/6 16/932/6 239/933/6 17/934/6 280/571/6 12/572/6 234/935/6 123/936/6 15/937/6 13/793/6 +f 273/387/1 281/388/1 58/883/1 9/884/1 +f 284/938/1 287/939/1 19/7/1 70/8/1 +f 215/863/5 327/862/5 161/25/5 95/29/5 +f 122/481/1 171/478/1 56/940/1 225/941/1 +f 246/245/3 247/246/3 196/942/3 195/943/3 +f 287/532/4 289/533/4 178/798/4 19/799/4 +f 253/851/6 77/122/6 301/70/6 144/71/6 252/181/6 145/182/6 +f 133/944/2 134/945/2 235/946/2 65/947/2 +f 12/243/5 280/244/5 271/239/5 272/240/5 59/102/5 75/99/5 136/147/5 184/148/5 269/191/5 3/242/5 +f 79/311/4 315/948/4 259/314/4 203/87/4 +f 198/949/3 298/950/3 250/281/3 75/282/3 251/149/3 76/150/3 299/951/3 300/952/3 +f 221/757/6 220/829/6 2/830/6 50/756/6 102/755/6 101/953/6 166/954/6 168/754/6 +f 142/955/5 141/818/5 18/819/5 176/820/5 +f 252/956/5 303/463/5 82/462/5 313/706/5 +f 201/864/4 255/556/4 75/99/4 136/147/4 301/128/4 30/129/4 +f 94/957/2 97/958/2 267/272/2 258/133/2 315/134/2 83/959/2 +f 178/960/1 289/961/1 74/962/1 71/963/1 +f 29/164/6 136/157/6 75/282/6 251/149/6 +f 323/843/1 316/15/1 155/288/1 205/287/1 204/373/1 154/374/1 261/375/1 212/964/1 213/965/1 89/966/1 210/967/1 214/968/1 +f 70/506/6 19/507/6 178/508/6 71/969/6 187/970/6 188/971/6 60/538/6 62/539/6 61/972/6 240/973/6 242/974/6 190/509/6 +f 314/975/1 209/294/1 82/295/1 211/976/1 96/977/1 92/978/1 +f 136/147/2 25/670/2 183/671/2 184/148/2 +f 170/979/1 188/980/1 187/981/1 288/982/1 287/983/1 299/984/1 76/594/1 68/595/1 128/592/1 54/777/1 +f 18/525/3 59/985/3 127/523/3 176/524/3 +g forsaken_fire.vox_forsaken_fire.vox_fire +usemtl fire +f 333/986/7 334/987/7 336/988/7 335/989/7 +f 337/990/8 338/991/8 340/992/8 339/993/8 diff --git a/mods/everness/models/everness_forsythia_mesh.obj b/mods/everness/models/everness_forsythia_mesh.obj new file mode 100644 index 0000000..7f30b8f --- /dev/null +++ b/mods/everness/models/everness_forsythia_mesh.obj @@ -0,0 +1,62 @@ +# Blender v2.83.20 OBJ File: 'everness_mesh_bush.blend' +# www.blender.org +mtllib everness_forsythia_mesh.mtl +o Cube +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.353553 0.500000 -0.353553 +v 0.353553 -0.500000 -0.353553 +v -0.353553 0.500000 0.353553 +v -0.353553 -0.500000 0.353553 +v -0.353553 0.500000 -0.353553 +v -0.353553 -0.500000 -0.353553 +v 0.353553 0.500000 0.353553 +v 0.353553 -0.500000 0.353553 +vt 0.333333 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 0.333333 0.500000 +vt 0.666667 0.500000 +vt 0.666667 1.000000 +vt 0.333333 1.000000 +vt 0.333333 0.500000 +vt 0.666667 0.000000 +vt 0.666667 0.500000 +vt 0.333333 0.500000 +vt 0.333333 0.000000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.312500 0.000000 +vt 0.312500 0.500000 +vt -0.000000 0.500000 +vt -0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.666667 0.500000 +vt 0.666667 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.666667 0.500000 +vt 0.666667 0.000000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.7071 0.0000 0.7071 +vn 0.7071 0.0000 -0.7071 +usemtl Material +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/6/2 7/7/2 8/8/2 +f 8/9/3 7/10/3 5/11/3 6/12/3 +f 2/13/4 1/14/4 3/6/4 4/5/4 +f 6/15/5 5/16/5 1/17/5 2/18/5 +f 10/19/6 9/20/6 11/21/6 12/22/6 +f 14/23/7 13/24/7 15/25/7 16/26/7 diff --git a/mods/everness/models/everness_glowing_pillar.obj b/mods/everness/models/everness_glowing_pillar.obj new file mode 100644 index 0000000..f75e70c --- /dev/null +++ b/mods/everness/models/everness_glowing_pillar.obj @@ -0,0 +1,292 @@ +# Blender v2.83.20 OBJ File: 'everness_glowing_pillar.blend' +# www.blender.org +mtllib everness_glowing_pillar.mtl +o Cube +v 0.625000 -0.500000 -0.625000 +v -0.625000 -0.500000 0.625000 +v -0.625000 -0.500000 -0.625000 +v 0.625000 -0.500000 0.625000 +v 0.625000 2.000000 -0.625000 +v -0.625000 2.000000 0.625000 +v -0.625000 2.000000 -0.625000 +v 0.625000 2.000000 0.625000 +v 0.625000 3.250000 -0.625000 +v 0.625000 2.000000 -0.625000 +v 0.625000 3.250000 0.625000 +v 0.625000 2.000000 0.625000 +v -0.625000 3.250000 -0.625000 +v -0.625000 2.000000 -0.625000 +v -0.625000 3.250000 0.625000 +v -0.625000 2.000000 0.625000 +v -1.250000 2.167468 0.625000 +v -0.625000 3.250000 0.625000 +v -1.250000 2.167468 -0.625000 +v -0.625000 3.250000 -0.625000 +v -0.625000 0.750000 0.625000 +v -0.625000 2.000000 0.625000 +v -0.625000 0.750000 -0.625000 +v -0.625000 2.000000 -0.625000 +v -1.250000 0.917468 0.625000 +v -0.625000 2.000000 0.625000 +v -1.250000 0.917468 -0.625000 +v -0.625000 2.000000 -0.625000 +v -1.250000 1.698712 0.625000 +v -0.625000 2.781244 0.625000 +v -1.250000 1.698712 -0.625000 +v -0.625000 2.781244 -0.625000 +v -1.250000 1.304804 0.625000 +v -0.625000 2.387336 0.625000 +v -1.250000 1.304804 -0.625000 +v -0.625000 2.387336 -0.625000 +v 1.249999 2.167468 -0.625000 +v 0.624999 3.250000 -0.625000 +v 1.250000 2.167468 0.625000 +v 0.625000 3.250000 0.625000 +v 0.624999 0.750000 -0.625000 +v 0.625000 2.000000 -0.625000 +v 0.625000 0.750000 0.625000 +v 0.625000 2.000000 0.625000 +v 1.250000 0.917468 -0.625000 +v 0.625000 2.000000 -0.625000 +v 1.250000 0.917468 0.625000 +v 0.625000 2.000000 0.625000 +v 1.249999 1.698713 -0.625000 +v 0.625000 2.781244 -0.625000 +v 1.250000 1.698712 0.625000 +v 0.625000 2.781244 0.625000 +v 1.250000 1.304805 -0.625000 +v 0.624999 2.387336 -0.625000 +v 1.250000 1.304805 0.625000 +v 0.625000 2.387336 0.625000 +v -0.625000 2.167468 -1.250000 +v -0.625000 3.250000 -0.625000 +v 0.625000 2.167468 -1.250001 +v 0.625000 3.250000 -0.625001 +v -0.625000 0.750000 -0.625000 +v -0.625000 2.000000 -0.625000 +v 0.625000 0.750000 -0.625001 +v 0.625000 2.000000 -0.625001 +v -0.625000 0.917468 -1.250000 +v -0.625000 2.000000 -0.625000 +v 0.625000 0.917468 -1.250001 +v 0.625000 2.000000 -0.625001 +v -0.625000 1.698712 -1.250000 +v -0.625000 2.781244 -0.625000 +v 0.625000 1.698712 -1.250001 +v 0.625000 2.781244 -0.625001 +v -0.625000 1.304804 -1.250000 +v -0.625000 2.387336 -0.625000 +v 0.625000 1.304805 -1.250001 +v 0.625000 2.387336 -0.625001 +v 0.625000 2.167468 1.250000 +v 0.625000 3.250000 0.625000 +v -0.625000 2.167468 1.250001 +v -0.625000 3.250000 0.625001 +v 0.625000 0.750000 0.625000 +v 0.625000 2.000000 0.625000 +v -0.625000 0.750000 0.625001 +v -0.625000 2.000000 0.625001 +v 0.625000 0.917468 1.250000 +v 0.625000 2.000000 0.625000 +v -0.624999 0.917468 1.250001 +v -0.625000 2.000000 0.625001 +v 0.625000 1.698712 1.250000 +v 0.625000 2.781244 0.625000 +v -0.624999 1.698712 1.250001 +v -0.625000 2.781244 0.625001 +v 0.625000 1.304805 1.250000 +v 0.625000 2.387336 0.625000 +v -0.624999 1.304804 1.250001 +v -0.625000 2.387336 0.625001 +v 0.625001 3.562500 0.625000 +v 0.625000 3.562500 -0.625000 +v -0.624999 3.562500 0.625001 +v -0.625000 3.562500 -0.624999 +v 0.000001 3.250000 0.000000 +v -0.624269 3.250000 0.625000 +v -0.624269 5.016733 0.625000 +v 0.624999 3.250000 -0.624269 +v 0.624999 5.016733 -0.624269 +v 0.625000 5.016734 0.625000 +v 0.625000 3.250000 0.625000 +v -0.624269 5.016734 -0.624268 +v -0.624269 3.250000 -0.624268 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.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 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 1.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 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.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 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.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 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.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 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.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 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.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 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.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 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.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 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.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 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.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 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.500000 0.000000 +vt 1.000000 0.500000 +vt -0.000000 0.500000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 1.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 1.000000 0.000000 +vt 1.000000 1.000000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -0.8660 0.5000 0.0000 +vn 0.8660 0.5000 -0.0000 +vn -0.0000 0.5000 -0.8660 +vn 0.0000 0.5000 0.8660 +vn -0.4472 0.8944 0.0000 +vn 0.0000 0.8944 0.4472 +vn 0.4472 0.8944 0.0000 +vn -0.0000 0.8944 -0.4472 +vn -0.7071 0.0000 -0.7071 +g Cube_Cube_Roots +usemtl Roots +s off +f 3/1/1 7/2/1 8/3/1 4/4/1 +f 1/5/2 5/6/2 6/7/2 2/8/2 +g Cube_Cube_Luminophor +usemtl Luminophor +f 9/9/3 13/10/3 15/11/3 11/12/3 +f 12/13/4 11/14/4 15/15/4 16/16/4 +f 16/16/5 15/15/5 13/17/5 14/18/5 +f 14/19/6 10/20/6 12/13/6 16/16/6 +f 10/21/7 9/9/7 11/22/7 12/23/7 +f 14/24/8 13/10/8 9/9/8 10/21/8 +g Cube_Cube_Leaves +usemtl Leaves +f 17/25/9 18/26/9 20/27/9 19/28/9 +f 21/29/5 22/30/5 24/31/5 23/32/5 +f 25/33/9 26/34/9 28/35/9 27/36/9 +f 29/37/9 30/38/9 32/39/9 31/40/9 +f 33/41/9 34/42/9 36/43/9 35/44/9 +f 37/45/10 38/46/10 40/47/10 39/48/10 +f 41/49/7 42/50/7 44/51/7 43/52/7 +f 45/53/10 46/54/10 48/55/10 47/56/10 +f 49/57/10 50/58/10 52/59/10 51/60/10 +f 53/61/10 54/62/10 56/63/10 55/64/10 +f 57/65/11 58/66/11 60/67/11 59/68/11 +f 61/69/8 62/70/8 64/71/8 63/72/8 +f 65/73/11 66/74/11 68/75/11 67/76/11 +f 69/77/11 70/78/11 72/79/11 71/80/11 +f 73/81/11 74/82/11 76/83/11 75/84/11 +f 77/85/12 78/86/12 80/87/12 79/88/12 +f 81/89/4 82/90/4 84/91/4 83/92/4 +f 85/93/12 86/94/12 88/95/12 87/96/12 +f 89/97/12 90/98/12 92/99/12 91/100/12 +f 93/101/12 94/102/12 96/103/12 95/104/12 +f 97/105/13 98/106/13 101/107/13 +f 98/108/14 100/109/14 101/107/14 +f 100/110/15 99/111/15 101/107/15 +f 99/112/16 97/113/16 101/107/16 +f 105/114/17 104/115/17 102/116/17 103/117/17 +f 106/118/1 107/119/1 109/120/1 108/121/1 diff --git a/mods/everness/models/everness_hammer_pick.obj b/mods/everness/models/everness_hammer_pick.obj new file mode 100644 index 0000000..ff744fd --- /dev/null +++ b/mods/everness/models/everness_hammer_pick.obj @@ -0,0 +1,436 @@ +# Blender 5.2.1 LTS +# www.blender.org +mtllib everness_hammer_pick.mtl +g hammer_head.vox_hammer_head.vox +v 0.117043 0.562218 -0.240000 +v 0.117043 0.562218 0.240000 +v -0.222369 0.901630 -0.240000 +v -0.561780 -0.116604 -0.240000 +v -0.901191 0.222807 0.240000 +v -0.561780 -0.116604 0.240000 +v -0.222369 0.901630 0.240000 +v -0.901191 0.222807 -0.240000 +v 0.097391 -0.177433 0.040000 +v -0.142609 -0.017433 -0.040000 +v -0.222609 0.062567 0.040000 +v -0.222609 0.062567 -0.040000 +v -0.142609 0.062567 -0.040000 +v -0.382609 0.222567 -0.040000 +v 0.577391 -0.337433 -0.040000 +v 0.417391 -0.337433 -0.040000 +v 0.417391 -0.337433 0.040000 +v 0.417391 -0.257433 -0.040000 +v 0.337391 -0.257433 0.040000 +v 0.337391 -0.177433 0.040000 +v 0.337391 -0.177433 -0.040000 +v 0.257391 -0.177433 0.040000 +v 0.257391 -0.097433 0.040000 +v 0.177391 -0.017433 -0.040000 +v 0.017391 0.062567 -0.040000 +v -0.062609 0.222567 0.040000 +v -0.142609 0.302567 -0.040000 +v -0.222609 0.302567 0.040000 +v -0.222609 0.382567 0.040000 +v 0.577391 -0.577433 0.040000 +v 0.417391 -0.257433 0.040000 +v 0.257391 -0.417433 0.040000 +v 0.257391 -0.337433 0.040000 +v 0.177391 -0.257433 0.040000 +v 0.177391 -0.337433 0.040000 +v 0.097391 -0.257433 0.040000 +v 0.177391 -0.097433 0.040000 +v 0.097391 -0.017433 0.040000 +v 0.017391 0.062567 0.040000 +v -0.062609 -0.017433 0.040000 +v -0.062609 0.142567 0.040000 +v -0.142609 -0.017433 0.040000 +v -0.142609 0.062567 0.040000 +v -0.142609 0.222567 0.040000 +v -0.222609 0.142567 0.040000 +v -0.142609 0.302567 0.040000 +v -0.302609 0.302567 0.040000 +v -0.302609 0.222567 0.040000 +v -0.382609 0.222567 0.040000 +v 0.257391 -0.337433 -0.040000 +v 0.257391 -0.177433 -0.040000 +v 0.257391 -0.097433 -0.040000 +v 0.177391 -0.257433 -0.040000 +v 0.097391 -0.257433 -0.040000 +v 0.097391 -0.177433 -0.040000 +v 0.017391 -0.177433 -0.040000 +v 0.017391 -0.097433 -0.040000 +v 0.097391 -0.017433 -0.040000 +v -0.062609 -0.017433 -0.040000 +v 0.017391 0.142567 -0.040000 +v -0.062609 0.222567 -0.040000 +v -0.222609 0.142567 -0.040000 +v -0.302609 0.222567 -0.040000 +v -0.302609 0.302567 -0.040000 +v -0.222609 0.302567 -0.040000 +v -0.222609 0.382567 -0.040000 +v 0.577391 -0.577433 -0.040000 +v 0.577391 -0.337433 0.040000 +v 0.337391 -0.257433 -0.040000 +v 0.177391 -0.097433 -0.040000 +v 0.177391 -0.017433 0.040000 +v 0.097391 0.062567 -0.040000 +v 0.097391 0.062567 0.040000 +v 0.017391 0.142567 0.040000 +v -0.062609 0.142567 -0.040000 +v -0.142609 0.222567 -0.040000 +v 0.337391 -0.577433 0.040000 +v 0.337391 -0.577433 -0.040000 +v 0.337391 -0.417433 0.040000 +v 0.337391 -0.417433 -0.040000 +v 0.257391 -0.417433 -0.040000 +v 0.177391 -0.337433 -0.040000 +v 0.017391 -0.177433 0.040000 +v 0.017391 -0.097433 0.040000 +v -0.062609 -0.097433 0.040000 +v -0.062609 -0.097433 -0.040000 +v -0.302609 0.142567 0.040000 +v -0.302609 0.142567 -0.040000 +v -0.302609 0.382567 0.040000 +v -0.302609 0.382567 -0.040000 +v -0.382609 0.302567 0.040000 +v -0.382609 0.302567 -0.040000 +v 0.122134 0.563916 -0.242400 +v 0.122134 0.563916 0.242400 +v -0.220672 0.906721 -0.242400 +v -0.563477 -0.121695 -0.242400 +v -0.906282 0.221110 0.242400 +v -0.563477 -0.121695 0.242400 +v -0.220672 0.906721 0.242400 +v -0.906282 0.221110 -0.242400 +vn -0.0000 -0.0000 1.0000 +vn 0.7071 0.7071 -0.0000 +vn -0.7071 -0.7071 -0.0000 +vn 0.7071 -0.7071 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vn -0.7071 0.7071 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -1.0000 -0.0000 -0.0000 +vn 0.2858 0.2858 -0.9147 +vn -0.1526 -0.1526 -0.9764 +vn -0.2858 -0.2858 0.9147 +vn -0.6155 -0.6155 0.4924 +vn -0.1526 -0.1526 0.9764 +vn 0.5645 0.5645 0.6022 +vt 0.500000 1.000000 +vt 0.000000 0.750000 +vt 0.000000 1.000000 +vt 0.500000 0.750000 +vt 0.750000 1.000000 +vt 1.000000 0.750000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 0.500000 0.250000 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.000000 0.250000 +vt 0.000000 0.880000 +vt 0.071429 1.000000 +vt 0.000000 0.760000 +vt 0.071429 0.800000 +vt 0.000000 0.800000 +vt 0.000000 0.640000 +vt 0.071429 0.720000 +vt 0.000000 0.720000 +vt 0.000000 0.560000 +vt 0.071429 0.600000 +vt 0.000000 0.600000 +vt 0.000000 0.480000 +vt 0.071429 0.520000 +vt 0.000000 0.520000 +vt 0.000000 0.400000 +vt 0.071429 0.440000 +vt 0.000000 0.440000 +vt 0.000000 0.320000 +vt 0.071429 0.360000 +vt 0.000000 0.360000 +vt 0.000000 0.240000 +vt 0.071429 0.280000 +vt 0.000000 0.280000 +vt 0.000000 0.160000 +vt 0.071429 0.200000 +vt 0.000000 0.200000 +vt 0.000000 0.080000 +vt 0.071429 0.120000 +vt 0.000000 0.120000 +vt 0.071429 0.760000 +vt 0.142857 0.720000 +vt 0.142857 0.760000 +vt 0.071429 0.640000 +vt 0.142857 0.600000 +vt 0.142857 0.640000 +vt 0.071429 0.560000 +vt 0.142857 0.520000 +vt 0.142857 0.560000 +vt 0.071429 0.480000 +vt 0.142857 0.440000 +vt 0.142857 0.480000 +vt 0.071429 0.400000 +vt 0.142857 0.360000 +vt 0.142857 0.400000 +vt 0.071429 0.320000 +vt 0.142857 0.280000 +vt 0.142857 0.320000 +vt 0.071429 0.240000 +vt 0.142857 0.200000 +vt 0.142857 0.240000 +vt 0.071429 0.160000 +vt 0.142857 0.120000 +vt 0.142857 0.160000 +vt 0.071429 0.080000 +vt 0.142857 0.040000 +vt 0.142857 0.080000 +vt 0.071429 0.000000 +vt 0.000000 0.040000 +vt 0.642857 0.760000 +vt 0.571429 0.800000 +vt 0.428571 0.640000 +vt 0.357143 0.680000 +vt 0.142857 0.880000 +vt 0.071429 0.880000 +vt 0.142857 1.000000 +vt 0.142857 0.800000 +vt 0.142857 0.000000 +vt 0.750000 0.750000 +vt 0.000000 0.500000 +vt 0.071429 0.040000 +vt 0.285714 0.680000 +vt 0.285714 0.640000 +vt 0.357143 0.520000 +vt 0.357143 0.600000 +vt 0.428571 0.600000 +vt 0.500000 0.640000 +vt 0.500000 0.680000 +vt 0.571429 0.680000 +vt 0.571429 0.720000 +vt 0.642857 0.720000 +vt 0.714286 0.760000 +vt 0.714286 0.800000 +vt 0.785714 0.800000 +vt 0.785714 0.840000 +vt 0.857143 0.840000 +vt 0.857143 0.880000 +vt 0.928571 0.880000 +vt 0.928571 0.920000 +vt 1.000000 0.920000 +vt 1.000000 0.960000 +vt 0.928571 0.960000 +vt 0.928571 1.000000 +vt 0.857143 1.000000 +vt 0.857143 0.960000 +vt 0.785714 0.960000 +vt 0.785714 0.920000 +vt 0.714286 0.920000 +vt 0.714286 0.880000 +vt 0.642857 0.880000 +vt 0.642857 0.840000 +vt 0.571429 0.840000 +vt 0.500000 0.800000 +vt 0.500000 0.760000 +vt 0.428571 0.760000 +vt 0.428571 0.720000 +vt 0.357143 0.720000 +s 0 +g hammer +g hammer_head.vox_hammer +usemtl hammer +f 5/1/1 2/2/1 7/3/1 +f 2/4/2 3/5/2 7/1/2 +f 4/6/3 5/5/3 8/7/3 +f 6/8/4 1/9/4 2/10/4 +f 3/2/5 4/11/5 8/4/5 +f 3/11/6 5/12/6 7/9/6 +f 5/1/1 6/4/1 2/2/1 +f 2/4/2 1/80/2 3/5/2 +f 4/6/3 6/80/3 5/5/3 +f 6/8/4 4/12/4 1/9/4 +f 3/2/5 1/81/5 4/11/5 +f 3/11/6 8/81/6 5/12/6 +g handle +g hammer_head.vox_handle +usemtl handle +f 77/13/7 67/14/7 30/3/7 +f 32/15/7 80/16/7 79/17/7 +f 35/18/7 50/19/7 33/20/7 +f 36/21/7 53/22/7 34/23/7 +f 83/24/7 55/25/7 9/26/7 +f 85/27/7 57/28/7 84/29/7 +f 42/30/7 59/31/7 40/32/7 +f 11/33/7 13/34/7 43/35/7 +f 87/36/7 62/37/7 45/38/7 +f 49/39/7 63/40/7 48/41/7 +f 18/42/8 19/43/8 31/44/8 +f 21/45/8 22/46/8 20/47/8 +f 52/48/8 37/49/8 23/50/8 +f 24/51/8 38/52/8 71/53/8 +f 72/54/8 39/55/8 73/56/8 +f 60/57/8 41/58/8 74/59/8 +f 61/60/8 44/61/8 26/62/8 +f 27/63/8 28/64/8 46/65/8 +f 66/66/8 89/67/8 29/68/8 +f 64/69/8 91/70/8 47/8/8 +f 67/49/5 57/71/5 58/72/5 +f 84/71/1 33/73/1 19/74/1 +f 16/16/8 68/75/8 15/76/8 +f 15/76/9 30/77/9 67/14/9 +f 16/16/9 31/44/9 17/78/9 +f 69/19/9 20/47/9 19/43/9 +f 51/22/9 23/50/9 22/46/9 +f 70/25/9 71/53/9 37/49/9 +f 58/28/9 73/56/9 38/52/9 +f 25/31/9 74/59/9 39/55/9 +f 75/34/9 26/62/9 41/58/9 +f 76/37/9 46/65/9 44/61/9 +f 65/40/9 29/68/9 28/64/9 +f 33/20/10 81/42/10 32/15/10 +f 34/23/10 82/45/10 35/18/10 +f 9/26/10 54/48/10 36/21/10 +f 84/29/10 56/51/10 83/24/10 +f 40/32/10 86/54/10 85/27/10 +f 42/30/10 13/34/10 10/57/10 +f 45/38/10 12/60/10 11/33/10 +f 48/41/10 88/63/10 87/36/10 +f 89/67/10 64/69/10 47/79/10 +f 91/70/10 14/66/10 49/39/10 +f 80/16/10 77/13/10 79/17/10 +f 77/13/7 78/76/7 67/14/7 +f 32/15/7 81/42/7 80/16/7 +f 35/18/7 82/45/7 50/19/7 +f 36/21/7 54/48/7 53/22/7 +f 83/24/7 56/51/7 55/25/7 +f 85/27/7 86/54/7 57/28/7 +f 42/30/7 10/57/7 59/31/7 +f 11/33/7 12/60/7 13/34/7 +f 87/36/7 88/63/7 62/37/7 +f 49/39/7 14/66/7 63/40/7 +f 18/42/8 69/19/8 19/43/8 +f 21/45/8 51/22/8 22/46/8 +f 52/48/8 70/25/8 37/49/8 +f 24/51/8 58/28/8 38/52/8 +f 72/54/8 25/31/8 39/55/8 +f 60/57/8 75/34/8 41/58/8 +f 61/60/8 76/37/8 44/61/8 +f 27/63/8 65/40/8 28/64/8 +f 66/66/8 90/82/8 89/67/8 +f 64/69/8 92/82/8 91/70/8 +f 69/74/5 18/83/5 16/84/5 +f 16/84/5 15/47/5 67/49/5 +f 67/49/5 78/85/5 80/86/5 +f 80/86/5 81/87/5 50/73/5 +f 50/73/5 82/88/5 53/89/5 +f 53/89/5 54/90/5 55/91/5 +f 55/91/5 56/92/5 57/71/5 +f 57/71/5 86/93/5 59/94/5 +f 59/94/5 10/95/5 13/96/5 +f 13/96/5 12/97/5 62/98/5 +f 62/98/5 88/99/5 63/100/5 +f 63/100/5 14/101/5 92/102/5 +f 64/103/5 90/104/5 66/105/5 +f 63/100/5 92/102/5 64/103/5 +f 62/98/5 63/100/5 64/103/5 +f 64/103/5 66/105/5 65/106/5 +f 65/106/5 27/107/5 76/108/5 +f 76/108/5 61/109/5 75/110/5 +f 75/110/5 60/111/5 25/112/5 +f 25/112/5 72/113/5 58/72/5 +f 58/72/5 24/114/5 70/115/5 +f 70/115/5 52/116/5 51/117/5 +f 51/117/5 21/118/5 69/74/5 +f 69/74/5 16/84/5 67/49/5 +f 67/49/5 80/86/5 50/73/5 +f 53/89/5 55/91/5 57/71/5 +f 67/49/5 50/73/5 53/89/5 +f 51/117/5 69/74/5 67/49/5 +f 58/72/11 70/115/11 51/117/11 +f 75/110/12 25/112/12 58/72/12 +f 65/106/11 76/108/11 75/110/11 +f 62/98/5 64/103/5 65/106/5 +f 57/71/5 59/94/5 13/96/5 +f 13/96/5 62/98/5 65/106/5 +f 13/96/5 65/106/5 75/110/5 +f 67/49/5 53/89/5 57/71/5 +f 57/71/5 13/96/5 75/110/5 +f 58/72/5 51/117/5 67/49/5 +f 57/71/5 75/110/5 58/72/5 +f 38/72/1 73/113/1 39/112/1 +f 39/112/1 74/111/1 41/110/1 +f 41/110/1 26/109/1 44/108/1 +f 44/108/1 46/107/1 28/106/1 +f 28/106/1 29/105/1 89/104/1 +f 47/103/1 91/102/1 49/101/1 +f 28/106/1 89/104/1 47/103/1 +f 41/110/13 44/108/13 28/106/13 +f 38/72/1 39/112/1 41/110/1 +f 37/115/1 71/114/1 38/72/1 +f 22/117/1 23/116/1 37/115/1 +f 19/74/1 20/118/1 22/117/1 +f 17/84/1 31/83/1 19/74/1 +f 30/49/1 68/47/1 17/84/1 +f 79/86/1 77/85/1 30/49/1 +f 33/73/1 32/87/1 79/86/1 +f 34/89/1 35/88/1 33/73/1 +f 9/91/1 36/90/1 34/89/1 +f 84/71/1 83/92/1 9/91/1 +f 40/94/1 85/93/1 84/71/1 +f 43/96/1 42/95/1 40/94/1 +f 45/98/1 11/97/1 43/96/1 +f 48/100/1 87/99/1 45/98/1 +f 47/103/1 49/101/1 48/100/1 +f 41/110/1 28/106/1 47/103/1 +f 22/117/14 37/115/14 38/72/14 +f 38/72/1 41/110/1 47/103/1 +f 47/103/1 48/100/1 45/98/1 +f 43/96/15 40/94/15 84/71/15 +f 47/103/1 45/98/1 43/96/1 +f 22/117/1 38/72/1 47/103/1 +f 30/49/1 17/84/1 19/74/1 +f 19/74/1 22/117/1 47/103/1 +f 47/103/1 43/96/1 84/71/1 +f 84/71/1 9/91/1 34/89/1 +f 33/73/1 79/86/1 30/49/1 +f 84/71/16 34/89/16 33/73/16 +f 19/74/1 47/103/1 84/71/1 +f 33/73/1 30/49/1 19/74/1 +f 16/16/8 17/78/8 68/75/8 +f 15/76/9 68/75/9 30/77/9 +f 16/16/9 18/42/9 31/44/9 +f 69/19/9 21/45/9 20/47/9 +f 51/22/9 52/48/9 23/50/9 +f 70/25/9 24/51/9 71/53/9 +f 58/28/9 72/54/9 73/56/9 +f 25/31/9 60/57/9 74/59/9 +f 75/34/9 61/60/9 26/62/9 +f 76/37/9 27/63/9 46/65/9 +f 65/40/9 66/66/9 29/68/9 +f 33/20/10 50/19/10 81/42/10 +f 34/23/10 53/22/10 82/45/10 +f 9/26/10 55/25/10 54/48/10 +f 84/29/10 57/28/10 56/51/10 +f 40/32/10 59/31/10 86/54/10 +f 42/30/10 43/35/10 13/34/10 +f 45/38/10 62/37/10 12/60/10 +f 48/41/10 63/40/10 88/63/10 +f 89/67/10 90/82/10 64/69/10 +f 91/70/10 92/82/10 14/66/10 +f 80/16/10 78/76/10 77/13/10 +g glint +g hammer_head.vox_glint +usemtl glint +f 97/1/1 94/2/1 99/3/1 +f 94/4/2 95/5/2 99/1/2 +f 96/6/3 97/5/3 100/7/3 +f 98/8/4 93/9/4 94/10/4 +f 95/2/5 96/11/5 100/4/5 +f 95/11/6 97/12/6 99/9/6 +f 97/1/1 98/4/1 94/2/1 +f 94/4/2 93/80/2 95/5/2 +f 96/6/3 98/80/3 97/5/3 +f 98/8/4 96/12/4 93/9/4 +f 95/2/5 93/81/5 96/11/5 +f 95/11/6 100/81/6 97/12/6 diff --git a/mods/everness/models/everness_lotus_flower.obj b/mods/everness/models/everness_lotus_flower.obj new file mode 100644 index 0000000..ad1ed26 --- /dev/null +++ b/mods/everness/models/everness_lotus_flower.obj @@ -0,0 +1,235 @@ +# Blender v2.83.20 OBJ File: 'everness_lotus_flower.blend' +# www.blender.org +mtllib everness_lotus_flower.mtl +o Cube +v -0.308107 -0.055472 -0.746216 +v -0.009900 -0.499000 -0.342751 +v 0.655918 0.011755 -0.265300 +v -0.732371 -0.055472 -0.321952 +v -0.328906 -0.499000 -0.023745 +v -0.308107 -0.055472 0.698725 +v 0.231654 0.011755 -0.689564 +v 0.288417 -0.055942 0.698836 +v 0.712681 -0.055942 0.274572 +v -0.732371 -0.055472 0.274461 +v -0.486053 -0.100909 -0.211530 +v -0.160819 -0.498639 -0.160819 +v 0.211530 -0.100909 -0.486054 +v 0.160819 -0.498639 -0.160819 +v -0.486053 -0.100909 0.211530 +v -0.160819 -0.498639 0.160819 +v 0.211530 -0.100909 0.486053 +v 0.160819 -0.498639 0.160819 +v -0.211530 -0.100909 -0.486054 +v 0.486054 -0.100909 0.211530 +v 0.486054 -0.100909 -0.211530 +v -0.211530 -0.100909 0.486053 +v 0.160592 -0.498186 0.160592 +v 0.160592 -0.177003 0.160592 +v -0.160592 -0.498186 0.160592 +v -0.160592 -0.177003 0.160592 +v 0.160592 -0.498186 -0.160592 +v 0.160592 -0.177003 -0.160592 +v -0.160592 -0.498186 -0.160592 +v -0.160592 -0.177003 -0.160592 +v 0.309302 -0.499453 -0.023720 +v -0.009875 -0.499453 0.295457 +v 0.000000 -0.330263 0.355694 +v 0.000000 0.589835 0.355694 +v -0.355694 -0.330263 -0.000000 +v -0.355694 0.589835 -0.000000 +v 0.355694 -0.330263 -0.000000 +v 0.355694 0.589835 -0.000000 +v 0.000000 -0.330263 -0.355694 +v 0.000000 0.589835 -0.355694 +v 0.500438 -0.055472 -0.534084 +v 0.149602 -0.499000 -0.183248 +v 0.548643 -0.154723 -0.000000 +v 0.160819 -0.498639 -0.000000 +v 0.000000 -0.154723 -0.548643 +v 0.000000 -0.498639 -0.160819 +v -0.160819 -0.498639 -0.000000 +v -0.548642 -0.154723 -0.000000 +v 0.000000 -0.498639 0.160819 +v 0.000000 -0.154723 0.548642 +v -0.169403 -0.499000 0.135758 +v -0.567776 -0.135591 0.534130 +v -0.169403 -0.499000 -0.183248 +v -0.567776 -0.135591 -0.581621 +v 0.548086 -0.136060 0.534241 +v 0.150919 -0.498639 0.137074 +vt 0.500000 0.750000 +vt -0.000000 0.500000 +vt 0.000000 0.750000 +vt 0.500000 0.750000 +vt -0.000000 0.500000 +vt 0.000000 0.750000 +vt 0.000000 0.250000 +vt 0.500000 0.250000 +vt 0.250000 0.000000 +vt 0.500000 0.750000 +vt 0.000000 0.500000 +vt 0.000000 0.750000 +vt 0.000000 1.000000 +vt 0.875000 0.812500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.875000 0.812500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.875000 0.625000 +vt 0.500000 0.250000 +vt 0.875000 0.250000 +vt 0.875000 0.625000 +vt 0.500000 0.250000 +vt 0.875000 0.250000 +vt 0.875000 0.625000 +vt 0.500000 0.250000 +vt 0.875000 0.250000 +vt 0.875000 0.625000 +vt 0.500000 0.250000 +vt 0.875000 0.250000 +vt 0.500000 0.250000 +vt 0.875000 0.250000 +vt 0.000000 1.000000 +vt 0.875000 0.812500 +vt 0.500000 1.000000 +vt 0.875000 1.000000 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.500000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 0.812500 +vt 0.500000 0.625000 +vt 0.500000 0.812500 +vt 0.500000 1.000000 +vt 0.875000 1.000000 +vt 0.500000 1.000000 +vt 0.875000 1.000000 +vt -0.000000 1.000000 +vt 0.500000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt -0.000000 0.000000 +vt 0.500000 0.500000 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.875000 0.625000 +vt 0.875000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 1.000000 +vt 0.875000 0.625000 +vt 0.875000 0.625000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 -0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.000000 +vn -0.3842 0.8402 -0.3827 +vn 0.3847 0.8403 -0.3819 +vn 0.0000 1.0000 0.0000 +vn -0.4713 0.7455 0.4713 +vn 0.3833 0.8403 -0.3833 +vn 0.0000 0.7482 0.6635 +vn 0.6635 0.7482 -0.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn -0.4699 0.7455 0.4726 +vn -0.6979 0.6171 -0.3635 +vn -0.6635 0.7482 -0.0000 +vn 0.6979 0.6171 0.3635 +vn -0.0000 0.7482 -0.6635 +vn 0.3635 0.6171 -0.6979 +vn -0.3635 0.6171 0.6979 +vn -0.1925 0.7280 -0.6580 +vn 0.3833 0.8403 0.3833 +vn -0.6580 0.7280 -0.1925 +vn 0.1928 0.7276 -0.6584 +vn 0.0014 1.0000 0.0014 +vn -0.2680 0.6247 0.7334 +vn 0.6580 0.7280 -0.1925 +vn 0.3635 0.6171 0.6979 +vn 0.6979 0.6171 -0.3635 +vn -0.7337 0.6243 0.2683 +vn -0.6979 0.6171 0.3635 +vn -0.3635 0.6171 -0.6979 +vn -0.3827 0.8402 -0.3842 +vn 0.1925 0.7280 0.6580 +vn 0.6580 0.7280 0.1925 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +g Cube_Cube_lotus +usemtl lotus +s off +f 55/1/1 31/2/1 56/3/1 +f 52/4/2 32/5/2 51/6/2 +f 51/7/3 42/8/3 53/9/3 +f 41/10/4 2/11/4 42/12/4 +f 5/13/5 52/4/5 51/6/5 +f 45/14/6 12/15/6 46/16/6 +f 48/17/7 16/18/7 47/19/7 +f 24/20/8 25/21/8 23/22/8 +f 26/23/9 29/24/9 25/25/9 +f 30/26/10 27/27/10 29/28/10 +f 28/29/11 23/30/11 27/31/11 +f 26/23/3 28/32/3 30/33/3 +f 31/34/12 41/10/12 42/12/12 +f 43/35/13 18/36/13 20/37/13 +f 43/35/14 14/38/14 44/39/14 +f 48/17/15 12/40/15 11/41/15 +f 50/42/16 18/43/16 49/44/16 +f 50/42/17 16/45/17 22/46/17 +f 45/14/18 14/47/18 13/48/18 +f 55/1/19 32/49/19 8/50/19 +f 2/51/20 54/52/20 53/53/20 +f 54/52/20 5/54/20 53/53/20 +f 55/1/21 9/55/21 31/2/21 +f 52/4/22 6/56/22 32/5/22 +f 53/9/3 5/57/3 51/7/3 +f 51/7/23 32/5/23 31/58/23 +f 42/8/3 2/59/3 53/9/3 +f 51/7/23 31/58/23 42/8/23 +f 41/10/24 7/60/24 2/11/24 +f 5/13/25 10/61/25 52/4/25 +f 45/14/26 19/62/26 12/15/26 +f 48/17/27 15/63/27 16/18/27 +f 24/20/8 26/64/8 25/21/8 +f 26/23/9 30/65/9 29/24/9 +f 30/26/10 28/66/10 27/27/10 +f 28/29/11 24/67/11 23/30/11 +f 26/23/3 24/67/3 28/32/3 +f 31/34/28 3/68/28 41/10/28 +f 43/35/14 44/39/14 18/36/14 +f 43/35/29 21/69/29 14/38/29 +f 48/17/7 47/19/7 12/40/7 +f 50/42/30 17/70/30 18/43/30 +f 50/42/16 49/44/16 16/45/16 +f 45/14/6 46/16/6 14/47/6 +f 55/1/31 56/3/31 32/49/31 +f 2/51/32 1/71/32 54/52/32 +f 54/52/33 4/72/33 5/54/33 +g Cube_Cube_flies +usemtl flies +f 33/73/34 34/74/34 36/75/34 35/76/34 +f 35/76/35 36/75/35 40/77/35 39/78/35 +f 39/79/36 40/80/36 38/81/36 37/82/36 +f 37/82/37 38/81/37 34/74/37 33/73/37 diff --git a/mods/everness/models/everness_lumabus.obj b/mods/everness/models/everness_lumabus.obj new file mode 100644 index 0000000..2cab569 --- /dev/null +++ b/mods/everness/models/everness_lumabus.obj @@ -0,0 +1,88 @@ +# Blender v2.83.20 OBJ File: 'everness_lumabus.blend' +# www.blender.org +mtllib everness_lumabus.mtl +o Cube +v 0.312500 -0.499500 0.312500 +v 0.312500 0.125500 0.312500 +v 0.312500 -0.499500 -0.312500 +v 0.312500 0.125500 -0.312500 +v -0.312500 -0.499500 0.312500 +v -0.312500 0.125500 0.312500 +v -0.312500 -0.499500 -0.312500 +v -0.312500 0.125500 -0.312500 +v 0.312500 -0.499828 0.312500 +v 0.791278 -0.098086 0.312500 +v 0.312500 -0.499828 -0.312500 +v 0.312500 -0.098086 -0.791278 +v -0.312500 -0.499828 0.312500 +v -0.312500 -0.098086 0.791278 +v -0.312500 -0.499828 -0.312500 +v -0.312500 -0.098086 -0.791278 +v -0.791278 -0.098086 -0.312500 +v 0.791278 -0.098086 -0.312500 +v 0.312500 -0.098086 0.791278 +v -0.791278 -0.098086 0.312500 +vt 0.750000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.000000 +vt 0.750000 0.000000 +vt 0.750000 0.500000 +vt 0.750000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.750000 1.000000 +vt 0.750000 0.500000 +vt 0.250000 0.500000 +vt 0.750000 0.500000 +vt 0.750000 0.000000 +vt 0.250000 0.000000 +vt 0.750000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.250000 1.000000 +vt 0.681818 0.681818 +vt 0.318182 0.681818 +vt 0.318182 0.318182 +vt 0.681818 0.318182 +vt 0.681818 -0.000000 +vt 0.681818 0.363636 +vt 0.318182 0.363636 +vt 0.318182 -0.000000 +vt -0.000000 0.318182 +vt 0.363636 0.318182 +vt 0.363636 0.681818 +vt -0.000000 0.681818 +vt 1.000000 0.681818 +vt 0.636364 0.681818 +vt 0.636364 0.318182 +vt 1.000000 0.318182 +vt 0.318182 1.000000 +vt 0.318182 0.636364 +vt 0.681818 0.636364 +vt 0.681818 1.000000 +vn 0.0000 -1.0000 -0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 -0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -0.0000 1.0000 +vn 0.0000 -0.7660 -0.6428 +vn -0.6428 -0.7660 -0.0000 +vn 0.6428 -0.7660 -0.0000 +vn 0.0000 -0.7660 0.6428 +g Cube_Cube_bulb +usemtl bulb +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/6/2 7/7/2 8/8/2 +f 8/8/3 7/7/3 5/9/3 6/10/3 +f 6/11/4 2/12/4 4/13/4 8/14/4 +f 2/12/5 1/15/5 3/16/5 4/17/5 +f 6/11/6 5/18/6 1/15/6 2/12/6 +g Cube_Cube_leaves +usemtl leaves +f 9/19/1 13/20/1 15/21/1 11/22/1 +f 12/23/7 11/24/7 15/25/7 16/26/7 +f 17/27/8 15/28/8 13/29/8 20/30/8 +f 10/31/9 9/32/9 11/33/9 18/34/9 +f 14/35/10 13/36/10 9/37/10 19/38/10 diff --git a/mods/everness/models/everness_lumecorn.obj b/mods/everness/models/everness_lumecorn.obj new file mode 100644 index 0000000..a13dc76 --- /dev/null +++ b/mods/everness/models/everness_lumecorn.obj @@ -0,0 +1,84 @@ +# Blender v2.83.20 OBJ File: 'everness_lumecorn.blend' +# www.blender.org +mtllib everness_lumecorn.mtl +o Cube +v 0.441942 0.750000 -0.441942 +v 0.441942 -0.500000 -0.441942 +v -0.441942 0.750000 0.441942 +v -0.441942 -0.500000 0.441942 +v -0.441942 0.750000 -0.441942 +v -0.441942 -0.500000 -0.441942 +v 0.441942 0.750000 0.441942 +v 0.441942 -0.500000 0.441942 +v 1.767767 0.350000 0.000000 +v -0.000000 0.350000 -1.767767 +v 0.000000 0.350000 1.767767 +v -1.767767 0.350000 -0.000000 +v -0.883883 0.750000 -0.883883 +v 0.883883 0.750000 0.883883 +v -0.883883 0.750000 0.883883 +v 0.883883 0.750000 -0.883883 +v 0.000000 0.750000 0.000000 +v -0.441942 5.750000 -0.441942 +v -0.441942 0.750000 -0.441942 +v 0.441942 5.750000 0.441942 +v 0.441942 0.750000 0.441942 +v -0.441942 5.750000 0.441942 +v -0.441942 0.750000 0.441942 +v 0.441942 5.750000 -0.441942 +v 0.441942 0.750000 -0.441942 +vt 0.999900 0.000100 +vt 0.999900 0.999900 +vt 0.000100 0.999900 +vt 0.000100 0.000100 +vt 0.999900 0.000100 +vt 0.999900 0.999900 +vt 0.000100 0.999900 +vt 0.000100 0.000100 +vt 0.000000 0.500000 +vt 0.500000 1.000000 +vt 1.000000 0.500000 +vt 1.000000 0.500000 +vt 0.500000 0.000000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.500000 +vt 0.500000 1.000000 +vt 1.000000 0.500000 +vt 0.500000 1.000000 +vt 0.500000 1.000000 +vt 0.999900 0.000100 +vt 0.999900 0.999900 +vt 0.000100 0.999900 +vt 0.000100 0.000100 +vt 0.999900 0.000100 +vt 0.999900 0.999900 +vt 0.000100 0.999900 +vt 0.000100 0.000100 +vn -0.7071 0.0000 0.7071 +vn 0.7071 0.0000 0.7071 +vn 0.0000 -0.9111 -0.4123 +vn 0.0000 -1.0000 0.0000 +vn -0.4123 -0.9111 0.0000 +vn -0.0000 -0.9111 0.4123 +vn 0.4123 -0.9111 -0.0000 +g Cube_Cube_root +usemtl root +s off +f 8/1/1 7/2/1 5/3/1 6/4/1 +f 2/5/2 1/6/2 3/7/2 4/8/2 +g Cube_Cube_leaves +usemtl leaves +f 14/9/3 11/10/3 15/11/3 +f 13/12/4 17/13/4 15/14/4 +f 16/15/4 17/13/4 13/16/4 +f 16/17/5 9/18/5 14/19/5 +f 17/13/4 14/9/4 15/11/4 +f 17/13/4 16/17/4 14/19/4 +f 10/20/6 16/15/6 13/16/6 +f 12/21/7 13/12/7 15/14/7 +g Cube_Cube_light +usemtl light +f 21/22/1 20/23/1 18/24/1 19/25/1 +f 25/26/2 24/27/2 22/28/2 23/29/2 diff --git a/mods/everness/models/everness_mineral_torch.obj b/mods/everness/models/everness_mineral_torch.obj new file mode 100644 index 0000000..5d96b5d --- /dev/null +++ b/mods/everness/models/everness_mineral_torch.obj @@ -0,0 +1,243 @@ +# Blender v2.83.20 OBJ File: 'everness_mineral_torch.blend' +# www.blender.org +mtllib everness_mineral_torch.mtl +o everness_mineral_torch.vox +v -0.062500 -0.490000 0.062500 +v -0.062500 0.135000 0.062500 +v -0.125000 0.135000 -0.125000 +v -0.125000 0.385000 0.125000 +v -0.000000 0.510000 0.062500 +v -0.000000 0.447500 0.062500 +v 0.000000 0.447500 0.250000 +v 0.125000 0.385000 -0.125000 +v -0.000000 -0.052500 0.062500 +v 0.062500 -0.490000 0.062500 +v 0.000000 0.447500 0.187500 +v -0.000000 0.010000 0.062500 +v 0.000000 0.135000 0.187500 +v 0.125000 0.385000 0.125000 +v 0.000000 0.385000 -0.187500 +v -0.000000 0.072500 0.125000 +v 0.000000 0.447500 -0.062500 +v 0.000000 0.385000 0.250000 +v -0.000000 0.010000 0.125000 +v 0.000000 -0.052500 -0.125000 +v 0.000000 0.010000 -0.125000 +v -0.000000 -0.052500 0.125000 +v 0.000000 0.010000 -0.187500 +v 0.000000 0.072500 -0.187500 +v 0.000000 0.072500 -0.250000 +v 0.000000 0.135000 -0.250000 +v 0.000000 0.510000 0.187500 +v 0.062500 0.135000 -0.125000 +v 0.000000 0.135000 -0.312500 +v -0.125000 0.385000 -0.125000 +v 0.000000 0.385000 -0.312500 +v 0.000000 0.385000 0.312500 +v 0.000000 0.510000 -0.187500 +v 0.000000 0.135000 0.312500 +v -0.062500 -0.490000 -0.062500 +v 0.000000 0.385000 0.187500 +v 0.062500 -0.490000 -0.062500 +v 0.000000 0.135000 0.250000 +v 0.000000 0.072500 0.250000 +v 0.000000 0.072500 0.187500 +v -0.125000 0.135000 0.125000 +v 0.062500 0.135000 0.062500 +v 0.125000 0.135000 0.125000 +v -0.125000 0.135000 -0.062500 +v -0.062500 0.135000 -0.062500 +v 0.062500 0.135000 -0.062500 +v 0.125000 0.135000 -0.125000 +v 0.000000 0.385000 -0.250000 +v 0.000000 0.072500 -0.125000 +v 0.000000 0.135000 -0.187500 +v 0.000000 0.010000 0.187500 +v 0.000000 0.010000 -0.062500 +v 0.000000 0.447500 -0.187500 +v 0.000000 -0.052500 -0.062500 +v 0.000000 0.447500 -0.250000 +v 0.000000 0.510000 -0.062500 +v 0.196875 0.072500 0.187500 +v -0.178125 0.072500 0.187500 +v -0.178125 0.447500 -0.187500 +v 0.196875 0.447500 0.187500 +v 0.196875 0.447500 -0.187500 +v -0.178125 0.447500 0.187500 +v -0.178125 0.072500 -0.187500 +v 0.196875 0.072500 -0.187500 +vt 0.250000 0.500000 +vt 0.187500 0.437500 +vt 0.250000 0.437500 +vt 0.187500 0.562500 +vt 0.125000 0.500000 +vt 0.187500 0.500000 +vt 0.250000 0.625000 +vt 0.437500 0.875000 +vt 0.187500 0.875000 +vt 0.125000 0.625000 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.937500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.375000 0.000000 +vt 0.250000 0.625000 +vt 0.250000 0.000000 +vt 0.375000 0.000000 +vt 0.250000 0.625000 +vt 0.250000 0.000000 +vt 0.125000 1.000000 +vt 0.250000 0.937500 +vt 0.250000 1.000000 +vt 0.187500 0.875000 +vt 0.437500 0.625000 +vt 0.437500 0.875000 +vt 0.187500 0.625000 +vt 0.187500 0.875000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.562500 0.562500 +vt 0.500000 0.562500 +vt 0.250000 0.625000 +vt 0.437500 0.875000 +vt 0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.187500 0.875000 +vt 0.437500 0.625000 +vt 0.437500 0.875000 +vt 0.562500 0.875000 +vt 0.625000 0.625000 +vt 0.562500 0.625000 +vt 0.500000 0.937500 +vt 0.500000 0.875000 +vt 0.437500 0.562500 +vt 0.500000 0.500000 +vt 0.437500 0.500000 +vt 0.250000 -0.000000 +vt 0.125000 0.125000 +vt 0.125000 -0.000000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.250000 0.687500 +vt 0.375000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.375000 0.500000 +vt 0.437500 0.437500 +vt 0.375000 0.437500 +vt 0.500000 1.000000 +vt 0.375000 0.937500 +vt 0.375000 1.000000 +vt 0.187500 0.625000 +vt 0.062500 0.937500 +vt 0.375000 0.625000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.000000 0.875000 +vt 0.625000 0.875000 +vt 0.562500 0.937500 +vt 0.250000 0.125000 +vt 0.250000 0.812500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.375000 0.687500 +vt 0.333333 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 1.000000 +vt 0.666667 -0.000000 +vt 0.166667 -0.000000 +vt 0.166667 1.000000 +vt 0.833333 -0.000000 +vt 0.666667 1.000000 +vt 0.666667 -0.000000 +vt 0.000000 1.000000 +vt 0.000000 -0.000000 +vt 1.000000 -0.000000 +vt 0.833333 1.000000 +vt 0.833333 -0.000000 +vt 0.333333 -0.000000 +vt 0.666667 1.000000 +vt 0.833333 1.000000 +vt 1.000000 1.000000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 0.0000 +g everness_mineral_torch.vox_everness_mineral_torch.vox_torch +usemtl torch +s off +f 52/1/1 20/2/1 54/3/1 +f 49/4/1 23/5/1 21/6/1 +f 44/7/1 4/8/1 30/9/1 +f 50/10/1 25/11/1 24/12/1 +f 53/13/1 48/14/1 15/15/1 +f 1/16/1 45/17/1 35/18/1 +f 37/19/2 42/20/2 10/21/2 +f 33/22/1 17/23/1 56/24/1 +f 8/25/3 4/26/3 14/27/3 +f 42/20/4 1/16/4 10/21/4 +f 41/28/4 14/27/4 4/29/4 +f 46/30/5 35/18/5 45/17/5 +f 13/31/2 39/32/2 40/33/2 +f 28/34/5 30/35/5 8/25/5 +f 48/14/1 29/36/1 26/37/1 +f 14/38/2 47/39/2 8/40/2 +f 18/41/2 34/42/2 38/43/2 +f 11/44/2 18/41/2 36/45/2 +f 16/46/2 51/47/2 19/48/2 +f 1/49/6 37/50/6 10/51/6 +f 43/52/6 41/53/6 42/54/6 +f 45/55/6 44/56/6 3/57/6 +f 12/58/2 22/59/2 9/60/2 +f 27/61/2 6/62/2 5/63/2 +f 52/1/1 21/6/1 20/2/1 +f 49/4/1 24/12/1 23/5/1 +f 30/9/1 3/64/1 44/7/1 +f 44/7/1 41/53/1 4/8/1 +f 50/10/1 26/37/1 25/11/1 +f 53/13/1 55/65/1 48/14/1 +f 1/16/1 2/66/1 45/17/1 +f 37/19/2 46/30/2 42/20/2 +f 33/22/1 53/13/1 17/23/1 +f 8/25/3 30/67/3 4/26/3 +f 42/20/4 2/66/4 1/16/4 +f 41/28/4 43/68/4 14/27/4 +f 46/30/5 37/19/5 35/18/5 +f 13/31/2 38/43/2 39/32/2 +f 8/25/5 47/69/5 28/34/5 +f 28/34/5 3/70/5 30/35/5 +f 48/14/1 31/71/1 29/36/1 +f 14/38/2 43/52/2 47/39/2 +f 18/41/2 32/72/2 34/42/2 +f 11/44/2 7/73/2 18/41/2 +f 16/46/2 40/33/2 51/47/2 +f 1/49/6 35/74/6 37/50/6 +f 42/54/6 46/75/6 43/52/6 +f 46/75/6 28/76/6 47/77/6 +f 43/52/6 46/75/6 47/77/6 +f 41/53/6 44/56/6 2/78/6 +f 44/56/6 45/55/6 2/78/6 +f 41/53/6 2/78/6 42/54/6 +f 3/57/6 28/76/6 45/55/6 +f 28/76/6 46/75/6 45/55/6 +f 12/58/2 19/48/2 22/59/2 +f 27/61/2 11/44/2 6/62/2 +g everness_mineral_torch.vox_everness_mineral_torch.vox_particle_cube +usemtl particle_cube +f 60/79/2 64/80/2 61/81/2 +f 63/82/5 61/81/5 64/80/5 +f 58/83/4 60/79/4 62/84/4 +f 61/85/3 62/86/3 60/87/3 +f 58/83/1 59/88/1 63/89/1 +f 58/90/6 64/91/6 57/92/6 +f 60/79/2 57/93/2 64/80/2 +f 63/82/5 59/94/5 61/81/5 +f 58/83/4 57/93/4 60/79/4 +f 61/85/3 59/95/3 62/86/3 +f 58/83/1 62/84/1 59/88/1 +f 58/90/6 63/96/6 64/91/6 diff --git a/mods/everness/models/everness_mineral_torch_ceiling.obj b/mods/everness/models/everness_mineral_torch_ceiling.obj new file mode 100644 index 0000000..81581ab --- /dev/null +++ b/mods/everness/models/everness_mineral_torch_ceiling.obj @@ -0,0 +1,243 @@ +# Blender v2.83.20 OBJ File: 'everness_mineral_torch_wall.blend' +# www.blender.org +mtllib everness_mineral_torch_ceiling.mtl +o everness_mineral_torch.vox +v 0.062500 -0.561250 -0.170873 +v 0.062500 -0.019984 0.141627 +v -0.125000 -0.051234 0.195753 +v 0.125000 0.165272 0.320753 +v 0.062500 0.336025 0.275000 +v 0.062500 0.281899 0.243750 +v 0.250000 0.281899 0.243750 +v -0.125000 0.290272 0.104247 +v 0.062500 -0.151114 -0.006250 +v 0.062500 -0.498750 -0.279127 +v 0.187500 0.281899 0.243750 +v 0.062500 -0.096987 0.025000 +v 0.187500 0.011266 0.087500 +v 0.125000 0.290272 0.104247 +v -0.187500 0.227772 0.212500 +v 0.125000 -0.042861 0.056250 +v -0.062500 0.281899 0.243750 +v 0.250000 0.227772 0.212500 +v 0.125000 -0.096987 0.025000 +v -0.125000 -0.151114 -0.006250 +v -0.125000 -0.096987 0.025000 +v 0.125000 -0.151114 -0.006250 +v -0.187500 -0.096987 0.025000 +v -0.187500 -0.042861 0.056250 +v -0.250000 -0.042861 0.056250 +v -0.250000 0.011266 0.087500 +v 0.187500 0.336025 0.275000 +v -0.125000 0.042516 0.033373 +v -0.312500 0.011266 0.087500 +v -0.125000 0.165272 0.320753 +v -0.312500 0.227772 0.212500 +v 0.312500 0.227772 0.212500 +v -0.187500 0.336025 0.275000 +v 0.312500 0.011266 0.087500 +v -0.062500 -0.561250 -0.170873 +v 0.187500 0.227772 0.212500 +v -0.062500 -0.498750 -0.279127 +v 0.250000 0.011266 0.087500 +v 0.250000 -0.042861 0.056250 +v 0.187500 -0.042861 0.056250 +v 0.125000 -0.051234 0.195753 +v 0.062500 0.042516 0.033373 +v 0.125000 0.073766 -0.020753 +v -0.062500 -0.051234 0.195753 +v -0.062500 -0.019984 0.141627 +v -0.062500 0.042516 0.033373 +v -0.125000 0.073766 -0.020753 +v -0.250000 0.227772 0.212500 +v -0.125000 -0.042861 0.056250 +v -0.187500 0.011266 0.087500 +v 0.187500 -0.096987 0.025000 +v -0.062500 -0.096987 0.025000 +v -0.187500 0.281899 0.243750 +v -0.062500 -0.151114 -0.006250 +v -0.250000 0.281899 0.243750 +v -0.062500 0.336025 0.275000 +v 0.187500 0.055577 -0.114249 +v 0.187500 -0.131923 0.210511 +v -0.187500 0.192836 0.398011 +v 0.187500 0.380336 0.073251 +v -0.187500 0.380336 0.073251 +v 0.187500 0.192836 0.398011 +v -0.187500 -0.131923 0.210511 +v -0.187500 0.055577 -0.114249 +vt 0.250000 0.500000 +vt 0.187500 0.437500 +vt 0.250000 0.437500 +vt 0.187500 0.562500 +vt 0.125000 0.500000 +vt 0.187500 0.500000 +vt 0.250000 0.625000 +vt 0.437500 0.875000 +vt 0.187500 0.875000 +vt 0.125000 0.625000 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.937500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.375000 0.000000 +vt 0.250000 0.625000 +vt 0.250000 0.000000 +vt 0.375000 0.000000 +vt 0.250000 0.625000 +vt 0.250000 0.000000 +vt 0.125000 1.000000 +vt 0.250000 0.937500 +vt 0.250000 1.000000 +vt 0.187500 0.875000 +vt 0.437500 0.625000 +vt 0.437500 0.875000 +vt 0.187500 0.625000 +vt 0.187500 0.875000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.562500 0.562500 +vt 0.500000 0.562500 +vt 0.250000 0.625000 +vt 0.437500 0.875000 +vt 0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.187500 0.875000 +vt 0.437500 0.625000 +vt 0.437500 0.875000 +vt 0.562500 0.875000 +vt 0.625000 0.625000 +vt 0.562500 0.625000 +vt 0.500000 0.937500 +vt 0.500000 0.875000 +vt 0.437500 0.562500 +vt 0.500000 0.500000 +vt 0.437500 0.500000 +vt 0.250000 -0.000000 +vt 0.125000 0.125000 +vt 0.125000 -0.000000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.250000 0.687500 +vt 0.375000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.375000 0.500000 +vt 0.437500 0.437500 +vt 0.375000 0.437500 +vt 0.500000 1.000000 +vt 0.375000 0.937500 +vt 0.375000 1.000000 +vt 0.187500 0.625000 +vt 0.062500 0.937500 +vt 0.375000 0.625000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.000000 0.875000 +vt 0.625000 0.875000 +vt 0.562500 0.937500 +vt 0.250000 0.125000 +vt 0.250000 0.812500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.375000 0.687500 +vt 0.333333 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 1.000000 +vt 0.666667 -0.000000 +vt 0.166667 -0.000000 +vt 0.166667 1.000000 +vt 0.833333 -0.000000 +vt 0.666667 1.000000 +vt 0.666667 -0.000000 +vt 0.000000 1.000000 +vt 0.000000 -0.000000 +vt 1.000000 -0.000000 +vt 0.833333 1.000000 +vt 0.833333 -0.000000 +vt 0.333333 -0.000000 +vt 0.666667 1.000000 +vt 0.833333 1.000000 +vt 1.000000 1.000000 +vn 0.0000 -0.5000 0.8660 +vn 0.0000 0.5000 -0.8660 +vn 0.0000 0.8660 0.5000 +vn 1.0000 0.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.8660 -0.5000 +g everness_mineral_torch.vox_everness_mineral_torch.vox_torch +usemtl torch +s off +f 52/1/1 20/2/1 54/3/1 +f 49/4/1 23/5/1 21/6/1 +f 44/7/1 4/8/1 30/9/1 +f 50/10/1 25/11/1 24/12/1 +f 53/13/1 48/14/1 15/15/1 +f 1/16/1 45/17/1 35/18/1 +f 37/19/2 42/20/2 10/21/2 +f 33/22/1 17/23/1 56/24/1 +f 8/25/3 4/26/3 14/27/3 +f 42/20/4 1/16/4 10/21/4 +f 41/28/4 14/27/4 4/29/4 +f 46/30/5 35/18/5 45/17/5 +f 13/31/2 39/32/2 40/33/2 +f 28/34/5 30/35/5 8/25/5 +f 48/14/1 29/36/1 26/37/1 +f 14/38/2 47/39/2 8/40/2 +f 18/41/2 34/42/2 38/43/2 +f 11/44/2 18/41/2 36/45/2 +f 16/46/2 51/47/2 19/48/2 +f 1/49/6 37/50/6 10/51/6 +f 43/52/6 41/53/6 42/54/6 +f 45/55/6 44/56/6 3/57/6 +f 12/58/2 22/59/2 9/60/2 +f 27/61/2 6/62/2 5/63/2 +f 52/1/1 21/6/1 20/2/1 +f 49/4/1 24/12/1 23/5/1 +f 30/9/1 3/64/1 44/7/1 +f 44/7/1 41/53/1 4/8/1 +f 50/10/1 26/37/1 25/11/1 +f 53/13/1 55/65/1 48/14/1 +f 1/16/1 2/66/1 45/17/1 +f 37/19/2 46/30/2 42/20/2 +f 33/22/1 53/13/1 17/23/1 +f 8/25/3 30/67/3 4/26/3 +f 42/20/4 2/66/4 1/16/4 +f 41/28/4 43/68/4 14/27/4 +f 46/30/5 37/19/5 35/18/5 +f 13/31/2 38/43/2 39/32/2 +f 8/25/5 47/69/5 28/34/5 +f 28/34/5 3/70/5 30/35/5 +f 48/14/1 31/71/1 29/36/1 +f 14/38/2 43/52/2 47/39/2 +f 18/41/2 32/72/2 34/42/2 +f 11/44/2 7/73/2 18/41/2 +f 16/46/2 40/33/2 51/47/2 +f 1/49/6 35/74/6 37/50/6 +f 42/54/6 46/75/6 43/52/6 +f 46/75/6 28/76/6 47/77/6 +f 43/52/6 46/75/6 47/77/6 +f 41/53/6 44/56/6 2/78/6 +f 44/56/6 45/55/6 2/78/6 +f 41/53/6 2/78/6 42/54/6 +f 3/57/6 28/76/6 45/55/6 +f 28/76/6 46/75/6 45/55/6 +f 12/58/2 19/48/2 22/59/2 +f 27/61/2 11/44/2 6/62/2 +g everness_mineral_torch.vox_everness_mineral_torch.vox_particle_cube +usemtl particle_cube +f 60/79/2 64/80/2 61/81/2 +f 63/82/5 61/81/5 64/80/5 +f 58/83/4 60/79/4 62/84/4 +f 61/85/3 62/86/3 60/87/3 +f 58/83/1 59/88/1 63/89/1 +f 58/90/6 64/91/6 57/92/6 +f 60/79/2 57/93/2 64/80/2 +f 63/82/5 59/94/5 61/81/5 +f 58/83/4 57/93/4 60/79/4 +f 61/85/3 59/95/3 62/86/3 +f 58/83/1 62/84/1 59/88/1 +f 58/90/6 63/96/6 64/91/6 diff --git a/mods/everness/models/everness_mineral_torch_wall.obj b/mods/everness/models/everness_mineral_torch_wall.obj new file mode 100644 index 0000000..2f9d978 --- /dev/null +++ b/mods/everness/models/everness_mineral_torch_wall.obj @@ -0,0 +1,243 @@ +# Blender v2.83.20 OBJ File: 'everness_mineral_torch.blend' +# www.blender.org +mtllib everness_mineral_torch_wall.mtl +o everness_mineral_torch.vox +v 0.062500 -0.594127 -0.408750 +v 0.062500 -0.281627 0.132516 +v -0.125000 -0.335753 0.163766 +v 0.125000 -0.210753 0.380272 +v 0.062500 -0.040000 0.426025 +v 0.062500 -0.071250 0.371899 +v 0.250000 -0.071250 0.371899 +v -0.125000 0.005753 0.255272 +v 0.062500 -0.321250 -0.061114 +v 0.062500 -0.485873 -0.471250 +v 0.187500 -0.071250 0.371899 +v 0.062500 -0.290000 -0.006987 +v 0.187500 -0.227500 0.101266 +v 0.125000 0.005753 0.255272 +v -0.187500 -0.102500 0.317772 +v 0.125000 -0.258750 0.047139 +v -0.062500 -0.071250 0.371899 +v 0.250000 -0.102500 0.317772 +v 0.125000 -0.290000 -0.006987 +v -0.125000 -0.321250 -0.061114 +v -0.125000 -0.290000 -0.006987 +v 0.125000 -0.321250 -0.061114 +v -0.187500 -0.290000 -0.006987 +v -0.187500 -0.258750 0.047139 +v -0.250000 -0.258750 0.047139 +v -0.250000 -0.227500 0.101266 +v 0.187500 -0.040000 0.426025 +v -0.125000 -0.173373 0.070016 +v -0.312500 -0.227500 0.101266 +v -0.125000 -0.210753 0.380272 +v -0.312500 -0.102500 0.317772 +v 0.312500 -0.102500 0.317772 +v -0.187500 -0.040000 0.426025 +v 0.312500 -0.227500 0.101266 +v -0.062500 -0.594127 -0.408750 +v 0.187500 -0.102500 0.317772 +v -0.062500 -0.485873 -0.471250 +v 0.250000 -0.227500 0.101266 +v 0.250000 -0.258750 0.047139 +v 0.187500 -0.258750 0.047139 +v 0.125000 -0.335753 0.163766 +v 0.062500 -0.173373 0.070016 +v 0.125000 -0.119247 0.038766 +v -0.062500 -0.335753 0.163766 +v -0.062500 -0.281627 0.132516 +v -0.062500 -0.173373 0.070016 +v -0.125000 -0.119247 0.038766 +v -0.250000 -0.102500 0.317772 +v -0.125000 -0.258750 0.047139 +v -0.187500 -0.227500 0.101266 +v 0.187500 -0.290000 -0.006987 +v -0.062500 -0.290000 -0.006987 +v -0.187500 -0.071250 0.371899 +v -0.062500 -0.321250 -0.061114 +v -0.250000 -0.071250 0.371899 +v -0.062500 -0.040000 0.426025 +v 0.187500 -0.088251 -0.051298 +v 0.187500 -0.413011 0.136202 +v -0.187500 -0.225511 0.460961 +v 0.187500 0.099249 0.273461 +v -0.187500 0.099249 0.273461 +v 0.187500 -0.225511 0.460961 +v -0.187500 -0.413011 0.136202 +v -0.187500 -0.088251 -0.051298 +vt 0.250000 0.500000 +vt 0.187500 0.437500 +vt 0.250000 0.437500 +vt 0.187500 0.562500 +vt 0.125000 0.500000 +vt 0.187500 0.500000 +vt 0.250000 0.625000 +vt 0.437500 0.875000 +vt 0.187500 0.875000 +vt 0.125000 0.625000 +vt 0.062500 0.562500 +vt 0.125000 0.562500 +vt 0.125000 0.937500 +vt 0.062500 0.875000 +vt 0.125000 0.875000 +vt 0.375000 0.000000 +vt 0.250000 0.625000 +vt 0.250000 0.000000 +vt 0.375000 0.000000 +vt 0.250000 0.625000 +vt 0.250000 0.000000 +vt 0.125000 1.000000 +vt 0.250000 0.937500 +vt 0.250000 1.000000 +vt 0.187500 0.875000 +vt 0.437500 0.625000 +vt 0.437500 0.875000 +vt 0.187500 0.625000 +vt 0.187500 0.875000 +vt 0.375000 0.625000 +vt 0.500000 0.625000 +vt 0.562500 0.562500 +vt 0.500000 0.562500 +vt 0.250000 0.625000 +vt 0.437500 0.875000 +vt 0.000000 0.625000 +vt 0.062500 0.625000 +vt 0.187500 0.875000 +vt 0.437500 0.625000 +vt 0.437500 0.875000 +vt 0.562500 0.875000 +vt 0.625000 0.625000 +vt 0.562500 0.625000 +vt 0.500000 0.937500 +vt 0.500000 0.875000 +vt 0.437500 0.562500 +vt 0.500000 0.500000 +vt 0.437500 0.500000 +vt 0.250000 -0.000000 +vt 0.125000 0.125000 +vt 0.125000 -0.000000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.250000 0.687500 +vt 0.375000 0.812500 +vt 0.437500 0.812500 +vt 0.437500 0.875000 +vt 0.375000 0.500000 +vt 0.437500 0.437500 +vt 0.375000 0.437500 +vt 0.500000 1.000000 +vt 0.375000 0.937500 +vt 0.375000 1.000000 +vt 0.187500 0.625000 +vt 0.062500 0.937500 +vt 0.375000 0.625000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.187500 0.625000 +vt 0.437500 0.625000 +vt 0.000000 0.875000 +vt 0.625000 0.875000 +vt 0.562500 0.937500 +vt 0.250000 0.125000 +vt 0.250000 0.812500 +vt 0.250000 0.875000 +vt 0.187500 0.875000 +vt 0.375000 0.687500 +vt 0.333333 1.000000 +vt 0.500000 -0.000000 +vt 0.500000 1.000000 +vt 0.666667 -0.000000 +vt 0.166667 -0.000000 +vt 0.166667 1.000000 +vt 0.833333 -0.000000 +vt 0.666667 1.000000 +vt 0.666667 -0.000000 +vt 0.000000 1.000000 +vt 0.000000 -0.000000 +vt 1.000000 -0.000000 +vt 0.833333 1.000000 +vt 0.833333 -0.000000 +vt 0.333333 -0.000000 +vt 0.666667 1.000000 +vt 0.833333 1.000000 +vt 1.000000 1.000000 +vn 0.0000 -0.8660 0.5000 +vn 0.0000 0.8660 -0.5000 +vn 0.0000 0.5000 0.8660 +vn 1.0000 0.0000 -0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.5000 -0.8660 +g everness_mineral_torch.vox_everness_mineral_torch.vox_torch +usemtl torch +s off +f 52/1/1 20/2/1 54/3/1 +f 49/4/1 23/5/1 21/6/1 +f 44/7/1 4/8/1 30/9/1 +f 50/10/1 25/11/1 24/12/1 +f 53/13/1 48/14/1 15/15/1 +f 1/16/1 45/17/1 35/18/1 +f 37/19/2 42/20/2 10/21/2 +f 33/22/1 17/23/1 56/24/1 +f 8/25/3 4/26/3 14/27/3 +f 42/20/4 1/16/4 10/21/4 +f 41/28/4 14/27/4 4/29/4 +f 46/30/5 35/18/5 45/17/5 +f 13/31/2 39/32/2 40/33/2 +f 28/34/5 30/35/5 8/25/5 +f 48/14/1 29/36/1 26/37/1 +f 14/38/2 47/39/2 8/40/2 +f 18/41/2 34/42/2 38/43/2 +f 11/44/2 18/41/2 36/45/2 +f 16/46/2 51/47/2 19/48/2 +f 1/49/6 37/50/6 10/51/6 +f 43/52/6 41/53/6 42/54/6 +f 45/55/6 44/56/6 3/57/6 +f 12/58/2 22/59/2 9/60/2 +f 27/61/2 6/62/2 5/63/2 +f 52/1/1 21/6/1 20/2/1 +f 49/4/1 24/12/1 23/5/1 +f 30/9/1 3/64/1 44/7/1 +f 44/7/1 41/53/1 4/8/1 +f 50/10/1 26/37/1 25/11/1 +f 53/13/1 55/65/1 48/14/1 +f 1/16/1 2/66/1 45/17/1 +f 37/19/2 46/30/2 42/20/2 +f 33/22/1 53/13/1 17/23/1 +f 8/25/3 30/67/3 4/26/3 +f 42/20/4 2/66/4 1/16/4 +f 41/28/4 43/68/4 14/27/4 +f 46/30/5 37/19/5 35/18/5 +f 13/31/2 38/43/2 39/32/2 +f 8/25/5 47/69/5 28/34/5 +f 28/34/5 3/70/5 30/35/5 +f 48/14/1 31/71/1 29/36/1 +f 14/38/2 43/52/2 47/39/2 +f 18/41/2 32/72/2 34/42/2 +f 11/44/2 7/73/2 18/41/2 +f 16/46/2 40/33/2 51/47/2 +f 1/49/6 35/74/6 37/50/6 +f 42/54/6 46/75/6 43/52/6 +f 46/75/6 28/76/6 47/77/6 +f 43/52/6 46/75/6 47/77/6 +f 41/53/6 44/56/6 2/78/6 +f 44/56/6 45/55/6 2/78/6 +f 41/53/6 2/78/6 42/54/6 +f 3/57/6 28/76/6 45/55/6 +f 28/76/6 46/75/6 45/55/6 +f 12/58/2 19/48/2 22/59/2 +f 27/61/2 11/44/2 6/62/2 +g everness_mineral_torch.vox_everness_mineral_torch.vox_particle_cube +usemtl particle_cube +f 60/79/2 64/80/2 61/81/2 +f 63/82/5 61/81/5 64/80/5 +f 58/83/4 60/79/4 62/84/4 +f 61/85/3 62/86/3 60/87/3 +f 58/83/1 59/88/1 63/89/1 +f 58/90/6 64/91/6 57/92/6 +f 60/79/2 57/93/2 64/80/2 +f 63/82/5 59/94/5 61/81/5 +f 58/83/4 57/93/4 60/79/4 +f 61/85/3 59/95/3 62/86/3 +f 58/83/1 62/84/1 59/88/1 +f 58/90/6 63/96/6 64/91/6 diff --git a/mods/everness/models/everness_skull_with_candle.obj b/mods/everness/models/everness_skull_with_candle.obj new file mode 100644 index 0000000..415343a --- /dev/null +++ b/mods/everness/models/everness_skull_with_candle.obj @@ -0,0 +1,170 @@ +# Blender v2.83.20 OBJ File: 'everness_skull_with_candle.blend' +# www.blender.org +mtllib scull_with_candle.vox.mtl +o scull_with_candle.vox +v -0.225000 0.026000 0.225000 +v -0.075000 0.026000 0.000000 +v -0.075000 0.026000 0.075000 +v 0.075000 0.551000 -0.075000 +v -0.300000 -0.499000 0.300000 +v 0.225000 -0.424000 0.225000 +v -0.300000 0.101000 -0.300000 +v 0.075000 0.026000 0.075000 +v 0.075000 0.101000 0.075000 +v -0.300000 0.101000 0.300000 +v -0.075000 0.101000 -0.075000 +v -0.300000 -0.499000 -0.300000 +v 0.300000 0.101000 -0.300000 +v -0.075000 0.101000 0.075000 +v -0.075000 0.551000 -0.075000 +v 0.300000 -0.499000 0.300000 +v 0.225000 -0.424000 -0.225000 +v 0.225000 0.026000 -0.225000 +v -0.225000 0.026000 -0.225000 +v 0.075000 0.026000 -0.075000 +v 0.300000 0.101000 0.300000 +v 0.075000 0.551000 0.075000 +v 0.300000 -0.499000 -0.300000 +v -0.075000 0.026000 -0.075000 +v 0.225000 0.026000 0.225000 +v -0.225000 -0.424000 -0.225000 +v -0.225000 -0.424000 0.225000 +v 0.075000 0.101000 -0.075000 +v -0.075000 0.551000 0.075000 +v 0.075000 0.551000 -0.000000 +v -0.075000 0.551000 -0.000000 +v 0.075000 0.701000 -0.000000 +v -0.075000 0.701000 -0.000000 +v -0.000000 0.551000 -0.075000 +v -0.000000 0.701000 -0.075000 +v 0.000000 0.551000 0.075000 +v 0.000000 0.701000 0.075000 +vt 0.866667 0.233333 +vt 0.866667 0.033333 +vt 0.800000 0.033333 +vt 0.800000 0.233333 +vt 0.466667 0.533333 +vt 0.266667 0.533333 +vt 0.333333 0.666667 +vt 0.333333 0.600000 +vt 0.400000 0.600000 +vt 0.400000 0.633333 +vt 0.533333 0.266667 +vt 0.733333 0.266667 +vt 0.733333 0.466667 +vt 0.533333 0.466667 +vt 0.600000 0.733333 +vt 0.600000 0.800000 +vt 0.533333 0.800000 +vt 0.533333 0.733333 +vt 0.000000 0.800000 +vt 0.000000 0.533333 +vt 0.266667 0.533333 +vt 0.266667 0.800000 +vt 0.533333 0.766667 +vt 0.533333 0.966667 +vt 0.466667 0.966667 +vt 0.466667 0.766667 +vt 0.533333 0.266667 +vt 0.266667 0.266667 +vt 0.266667 0.533333 +vt 0.533333 0.533333 +vt 0.466667 0.933333 +vt 0.266667 0.933333 +vt 0.266667 0.733333 +vt 0.466667 0.733333 +vt 0.666667 0.533333 +vt 0.666667 0.733333 +vt 0.866667 0.733333 +vt 0.866667 0.533333 +vt 0.266667 0.733333 +vt 0.466667 0.733333 +vt 0.400000 0.666667 +vt 0.266667 0.266667 +vt 0.266667 0.000000 +vt 0.433333 0.100000 +vt 0.366667 0.100000 +vt 0.366667 0.166667 +vt 0.433333 0.166667 +vt 0.933333 0.566667 +vt 0.866667 0.566667 +vt 0.866667 0.766667 +vt 0.933333 0.766667 +vt 0.533333 0.000000 +vt 0.533333 0.266667 +vt 0.800000 0.266667 +vt 0.800000 0.000000 +vt 0.800000 0.000000 +vt 0.866667 0.000000 +vt 0.000000 0.266667 +vt 0.000000 0.000000 +vt 0.266667 0.000000 +vt 0.266667 0.266667 +vt 0.266667 0.266667 +vt 0.000000 0.266667 +vt 0.000000 0.533333 +vt 0.266667 0.533333 +vt 0.933333 0.033333 +vt 0.933333 0.233333 +vt 0.866667 0.233333 +vt 0.866667 0.033333 +vt 0.933333 0.533333 +vt 0.866667 0.533333 +vt 0.533333 0.000000 +vt 0.533333 0.266667 +vt 0.933333 0.000000 +vt 0.900000 0.000000 +vt 0.866667 0.000000 +vt 0.533333 0.733333 +vt 0.466667 0.733333 +vt 0.733333 0.466667 +vt 0.933333 0.466667 +vt 0.933333 0.266667 +vt 0.733333 0.266667 +vt 0.466667 0.733333 +vt 0.466667 0.533333 +vt 0.666667 0.533333 +vt 0.666667 0.733333 +vt 0.866667 0.733333 +vt 0.866667 1.000000 +vt 0.600000 1.000000 +vt 0.600000 0.733333 +vt 0.866667 1.000000 +vt 0.600000 1.000000 +vt 0.600000 0.733333 +vt 0.866667 0.733333 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn -0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 -0.0000 +usemtl scull_with_candle.vox_Material +s off +f 29/1/1 14/2/1 9/3/1 22/4/1 +f 19/5/2 18/6/2 8/7/2 20/8/2 24/9/2 2/10/2 +f 17/11/3 26/12/3 27/13/3 6/14/3 +f 15/15/3 29/16/3 22/17/3 4/18/3 +f 13/19/4 23/20/4 12/21/4 7/22/4 +f 11/23/4 15/24/4 4/25/4 28/26/4 +f 12/27/2 23/28/2 16/29/2 5/30/2 +f 25/31/5 18/32/5 17/33/5 6/34/5 +f 26/35/6 19/36/6 1/37/6 27/38/6 +f 25/39/2 1/40/2 19/5/2 2/10/2 3/41/2 8/7/2 18/6/2 +f 21/42/3 13/43/3 11/44/3 28/45/3 9/46/3 14/47/3 +f 9/48/6 28/49/6 4/50/6 22/51/6 +f 28/45/2 9/46/2 14/47/2 11/44/2 +f 16/52/1 21/53/1 10/54/1 5/55/1 +f 14/2/4 9/3/4 8/56/4 3/57/4 +f 7/58/5 12/59/5 5/60/5 10/61/5 +f 16/62/6 23/63/6 13/64/6 21/65/6 +f 14/66/5 29/67/5 15/68/5 11/69/5 +f 8/70/5 9/48/5 28/49/5 20/71/5 +f 7/72/3 10/73/3 21/42/3 14/47/3 11/44/3 13/43/3 +f 11/69/6 14/66/6 3/74/6 2/75/6 24/76/6 +f 28/26/1 11/23/1 24/77/1 20/78/1 +f 18/79/1 19/80/1 26/81/1 17/82/1 +f 25/83/4 6/84/4 27/85/4 1/86/4 +usemtl candle_fire.001 +f 31/87/4 33/88/4 32/89/4 30/90/4 +f 35/91/6 37/92/6 36/93/6 34/94/6 diff --git a/mods/everness/models/everness_twisted_crystal_spire.obj b/mods/everness/models/everness_twisted_crystal_spire.obj new file mode 100644 index 0000000..86d2a83 --- /dev/null +++ b/mods/everness/models/everness_twisted_crystal_spire.obj @@ -0,0 +1,3368 @@ +# Wavefront OBJ +v -0.2400 -0.5000 0.0000 +v -0.1800 -0.5000 0.0000 +v -0.1200 -0.5000 0.0000 +v -0.0600 -0.5000 0.0000 +v 0.0000 -0.5000 0.0000 +v 0.0600 -0.5000 0.0000 +v 0.1200 -0.5000 0.0000 +v 0.1800 -0.5000 0.0000 +v 0.2400 -0.5000 0.0000 +v -0.2400 -0.4688 0.0000 +v -0.1800 -0.4688 0.0000 +v -0.1200 -0.4688 0.0000 +v -0.0600 -0.4688 0.0000 +v 0.0000 -0.4688 0.0000 +v 0.0600 -0.4688 0.0000 +v 0.1200 -0.4688 0.0000 +v 0.1800 -0.4688 0.0000 +v 0.2400 -0.4688 0.0000 +v -0.2400 -0.4375 0.0000 +v -0.1800 -0.4375 0.0000 +v -0.1200 -0.4375 0.0000 +v -0.0600 -0.4375 0.0000 +v 0.0000 -0.4375 0.0000 +v 0.0600 -0.4375 0.0000 +v 0.1200 -0.4375 0.0000 +v 0.1800 -0.4375 0.0000 +v 0.2400 -0.4375 0.0000 +v -0.2400 -0.4062 0.0000 +v -0.1800 -0.4062 0.0000 +v -0.1200 -0.4062 0.0000 +v -0.0600 -0.4062 0.0000 +v 0.0000 -0.4062 0.0000 +v 0.0600 -0.4062 0.0000 +v 0.1200 -0.4062 0.0000 +v 0.1800 -0.4062 0.0000 +v 0.2400 -0.4062 0.0000 +v -0.2400 -0.3750 0.0000 +v -0.1800 -0.3750 0.0000 +v -0.1200 -0.3750 0.0000 +v -0.0600 -0.3750 0.0000 +v 0.0000 -0.3750 0.0000 +v 0.0600 -0.3750 0.0000 +v 0.1200 -0.3750 0.0000 +v 0.1800 -0.3750 0.0000 +v 0.2400 -0.3750 0.0000 +v -0.2323 -0.2834 0.0013 +v -0.1742 -0.2985 0.0010 +v -0.1161 -0.3136 0.0007 +v -0.0581 -0.3287 0.0003 +v 0.0000 -0.3438 0.0000 +v 0.0581 -0.3588 -0.0003 +v 0.1161 -0.3739 -0.0007 +v 0.1742 -0.3890 -0.0010 +v 0.2323 -0.4041 -0.0013 +v -0.2073 -0.2251 0.0026 +v -0.1514 -0.2469 0.0026 +v -0.0955 -0.2688 0.0027 +v -0.0396 -0.2906 0.0027 +v 0.0163 -0.3125 0.0028 +v 0.0721 -0.3344 0.0028 +v 0.1280 -0.3562 0.0029 +v 0.1839 -0.3781 0.0029 +v 0.2398 -0.3999 0.0029 +v -0.2093 -0.2271 0.0032 +v -0.1509 -0.2406 0.0047 +v -0.0924 -0.2542 0.0062 +v -0.0340 -0.2677 0.0077 +v 0.0244 -0.2812 0.0092 +v 0.0829 -0.2948 0.0107 +v 0.1413 -0.3083 0.0122 +v 0.1997 -0.3219 0.0137 +v 0.2582 -0.3354 0.0152 +v -0.2065 -0.2131 0.0073 +v -0.1473 -0.2223 0.0101 +v -0.0881 -0.2315 0.0130 +v -0.0289 -0.2408 0.0158 +v 0.0303 -0.2500 0.0186 +v 0.0896 -0.2592 0.0215 +v 0.1488 -0.2685 0.0243 +v 0.2080 -0.2777 0.0272 +v 0.2672 -0.2869 0.0300 +v -0.2056 -0.2036 0.0108 +v -0.1459 -0.2074 0.0157 +v -0.0862 -0.2112 0.0206 +v -0.0265 -0.2150 0.0255 +v 0.0332 -0.2188 0.0304 +v 0.0928 -0.2225 0.0353 +v 0.1525 -0.2263 0.0402 +v 0.2122 -0.2301 0.0451 +v 0.2719 -0.2339 0.0500 +v -0.2057 -0.1971 0.0135 +v -0.1462 -0.1947 0.0210 +v -0.0867 -0.1923 0.0285 +v -0.0272 -0.1899 0.0360 +v 0.0323 -0.1875 0.0435 +v 0.0917 -0.1851 0.0511 +v 0.1512 -0.1827 0.0586 +v 0.2107 -0.1803 0.0661 +v 0.2702 -0.1779 0.0736 +v -0.2065 -0.1918 0.0158 +v -0.1480 -0.1829 0.0261 +v -0.0896 -0.1740 0.0364 +v -0.0312 -0.1651 0.0467 +v 0.0273 -0.1562 0.0570 +v 0.0857 -0.1474 0.0673 +v 0.1442 -0.1385 0.0776 +v 0.2026 -0.1296 0.0879 +v 0.2610 -0.1207 0.0982 +v -0.2082 -0.1860 0.0181 +v -0.1516 -0.1707 0.0310 +v -0.0950 -0.1555 0.0439 +v -0.0384 -0.1402 0.0568 +v 0.0182 -0.1250 0.0697 +v 0.0747 -0.1098 0.0825 +v 0.1313 -0.0945 0.0954 +v 0.1879 -0.0793 0.1083 +v 0.2445 -0.0640 0.1212 +v -0.2114 -0.1783 0.0207 +v -0.1573 -0.1571 0.0356 +v -0.1032 -0.1360 0.0505 +v -0.0490 -0.1149 0.0654 +v 0.0051 -0.0938 0.0803 +v 0.0593 -0.0726 0.0952 +v 0.1134 -0.0515 0.1101 +v 0.1676 -0.0304 0.1250 +v 0.2217 -0.0092 0.1399 +v -0.2172 -0.1674 0.0233 +v -0.1658 -0.1412 0.0395 +v -0.1143 -0.1149 0.0557 +v -0.0628 -0.0887 0.0718 +v -0.0113 -0.0625 0.0880 +v 0.0402 -0.0363 0.1042 +v 0.0917 -0.0101 0.1203 +v 0.1432 0.0162 0.1365 +v 0.1947 0.0424 0.1527 +v -0.2264 -0.1523 0.0250 +v -0.1774 -0.1221 0.0417 +v -0.1284 -0.0918 0.0584 +v -0.0793 -0.0615 0.0751 +v -0.0303 -0.0312 0.0918 +v 0.0188 -0.0010 0.1084 +v 0.0678 0.0293 0.1251 +v 0.1168 0.0596 0.1418 +v 0.1659 0.0898 0.1585 +v -0.2395 -0.1325 0.0243 +v -0.1923 -0.0994 0.0409 +v -0.1452 -0.0663 0.0576 +v -0.0980 -0.0331 0.0743 +v -0.0508 0.0000 0.0909 +v -0.0037 0.0331 0.1076 +v 0.0435 0.0663 0.1242 +v 0.0906 0.0994 0.1409 +v 0.1378 0.1325 0.1575 +v -0.2562 -0.1076 0.0194 +v -0.2101 -0.0729 0.0358 +v -0.1640 -0.0382 0.0522 +v -0.1179 -0.0035 0.0686 +v -0.0718 0.0312 0.0851 +v -0.0257 0.0660 0.1015 +v 0.0204 0.1007 0.1179 +v 0.0665 0.1354 0.1343 +v 0.1126 0.1701 0.1507 +v -0.2755 -0.0775 0.0086 +v -0.2296 -0.0425 0.0250 +v -0.1837 -0.0075 0.0414 +v -0.1378 0.0275 0.0577 +v -0.0919 0.0625 0.0741 +v -0.0460 0.0975 0.0904 +v -0.0001 0.1325 0.1068 +v 0.0458 0.1675 0.1232 +v 0.0917 0.2025 0.1395 +v -0.2957 -0.0424 -0.0094 +v -0.2492 -0.0083 0.0075 +v -0.2028 0.0257 0.0244 +v -0.1564 0.0597 0.0413 +v -0.1099 0.0938 0.0582 +v -0.0635 0.1278 0.0751 +v -0.0171 0.1618 0.0920 +v 0.0294 0.1958 0.1089 +v 0.0758 0.2299 0.1258 +v -0.3142 -0.0025 -0.0354 +v -0.2668 0.0294 -0.0171 +v -0.2194 0.0613 0.0013 +v -0.1720 0.0931 0.0196 +v -0.1246 0.1250 0.0380 +v -0.0772 0.1569 0.0563 +v -0.0298 0.1887 0.0747 +v 0.0176 0.2206 0.0930 +v 0.0650 0.2525 0.1113 +v -0.3286 0.0417 -0.0692 +v -0.2802 0.0703 -0.0483 +v -0.2318 0.0990 -0.0275 +v -0.1833 0.1276 -0.0067 +v -0.1349 0.1562 0.0142 +v -0.0865 0.1849 0.0350 +v -0.0380 0.2135 0.0558 +v 0.0104 0.2422 0.0766 +v 0.0588 0.2708 0.0975 +v -0.3363 0.0896 -0.1096 +v -0.2872 0.1140 -0.0852 +v -0.2381 0.1385 -0.0609 +v -0.1891 0.1630 -0.0365 +v -0.1400 0.1875 -0.0122 +v -0.0909 0.2120 0.0122 +v -0.0419 0.2365 0.0365 +v 0.0072 0.2610 0.0609 +v 0.0563 0.2854 0.0852 +v -0.3350 0.1405 -0.1546 +v -0.2861 0.1601 -0.1259 +v -0.2372 0.1796 -0.0972 +v -0.1883 0.1992 -0.0685 +v -0.1393 0.2188 -0.0398 +v -0.0904 0.2383 -0.0111 +v -0.0415 0.2579 0.0176 +v 0.0074 0.2774 0.0463 +v 0.0564 0.2970 0.0750 +v -0.3235 0.1939 -0.2015 +v -0.2758 0.2079 -0.1680 +v -0.2281 0.2219 -0.1344 +v -0.1804 0.2360 -0.1008 +v -0.1327 0.2500 -0.0673 +v -0.0850 0.2640 -0.0337 +v -0.0372 0.2781 -0.0001 +v 0.0105 0.2921 0.0334 +v 0.0582 0.3061 0.0670 +v -0.3012 0.2490 -0.2474 +v -0.2559 0.2571 -0.2088 +v -0.2106 0.2651 -0.1703 +v -0.1654 0.2732 -0.1318 +v -0.1201 0.2812 -0.0933 +v -0.0748 0.2893 -0.0547 +v -0.0295 0.2974 -0.0162 +v 0.0158 0.3054 0.0223 +v 0.0611 0.3135 0.0608 +v -0.2687 0.3051 -0.2890 +v -0.2270 0.3070 -0.2458 +v -0.1853 0.3088 -0.2027 +v -0.1436 0.3107 -0.1596 +v -0.1020 0.3125 -0.1165 +v -0.0603 0.3143 -0.0733 +v -0.0186 0.3162 -0.0302 +v 0.0231 0.3180 0.0129 +v 0.0647 0.3199 0.0560 +v -0.2273 0.3616 -0.3235 +v -0.1902 0.3571 -0.2765 +v -0.1532 0.3527 -0.2295 +v -0.1161 0.3482 -0.1826 +v -0.0791 0.3438 -0.1356 +v -0.0420 0.3393 -0.0886 +v -0.0049 0.3348 -0.0416 +v 0.0321 0.3304 0.0054 +v 0.0692 0.3259 0.0523 +v -0.1794 0.4177 -0.3488 +v -0.1476 0.4070 -0.2990 +v -0.1159 0.3963 -0.2492 +v -0.0841 0.3857 -0.1994 +v -0.0524 0.3750 -0.1496 +v -0.0206 0.3643 -0.0999 +v 0.0111 0.3537 -0.0501 +v 0.0429 0.3430 -0.0003 +v 0.0746 0.3323 0.0495 +v -0.1278 0.4728 -0.3633 +v -0.1016 0.4562 -0.3120 +v -0.0754 0.4395 -0.2606 +v -0.0493 0.4229 -0.2092 +v -0.0231 0.4062 -0.1579 +v 0.0031 0.3896 -0.1065 +v 0.0292 0.3730 -0.0551 +v 0.0554 0.3563 -0.0038 +v 0.0816 0.3397 0.0476 +v -0.0756 0.5263 -0.3668 +v -0.0549 0.5041 -0.3150 +v -0.0341 0.4819 -0.2633 +v -0.0134 0.4597 -0.2116 +v 0.0073 0.4375 -0.1598 +v 0.0281 0.4153 -0.1081 +v 0.0488 0.3931 -0.0563 +v 0.0696 0.3709 -0.0046 +v 0.0903 0.3487 0.0471 +v -0.0259 0.5777 -0.3595 +v -0.0100 0.5505 -0.3085 +v 0.0058 0.5232 -0.2574 +v 0.0217 0.4960 -0.2064 +v 0.0375 0.4688 -0.1554 +v 0.0534 0.4415 -0.1043 +v 0.0693 0.4143 -0.0533 +v 0.0851 0.3870 -0.0022 +v 0.1010 0.3598 0.0488 +v 0.0187 0.6265 -0.3431 +v 0.0305 0.5949 -0.2935 +v 0.0424 0.5632 -0.2439 +v 0.0542 0.5316 -0.1943 +v 0.0661 0.5000 -0.1447 +v 0.0779 0.4684 -0.0951 +v 0.0898 0.4368 -0.0455 +v 0.1017 0.4051 0.0041 +v 0.1135 0.3735 0.0537 +v 0.0560 0.6721 -0.3195 +v 0.0649 0.6369 -0.2717 +v 0.0738 0.6017 -0.2239 +v 0.0827 0.5665 -0.1762 +v 0.0916 0.5312 -0.1284 +v 0.1005 0.4960 -0.0807 +v 0.1094 0.4608 -0.0329 +v 0.1183 0.4256 0.0148 +v 0.1272 0.3904 0.0626 +v 0.0849 0.7142 -0.2912 +v 0.0920 0.6763 -0.2452 +v 0.0990 0.6384 -0.1993 +v 0.1060 0.6004 -0.1533 +v 0.1130 0.5625 -0.1074 +v 0.1200 0.5246 -0.0614 +v 0.1270 0.4866 -0.0154 +v 0.1340 0.4487 0.0305 +v 0.1410 0.4108 0.0765 +v 0.1050 0.7524 -0.2610 +v 0.1111 0.7128 -0.2164 +v 0.1171 0.6731 -0.1718 +v 0.1232 0.6334 -0.1272 +v 0.1292 0.5938 -0.0826 +v 0.1353 0.5541 -0.0380 +v 0.1413 0.5144 0.0066 +v 0.1474 0.4747 0.0512 +v 0.1534 0.4351 0.0958 +v 0.1167 0.7866 -0.2314 +v 0.1225 0.7462 -0.1874 +v 0.1282 0.7058 -0.1434 +v 0.1340 0.6654 -0.0994 +v 0.1398 0.6250 -0.0554 +v 0.1455 0.5846 -0.0114 +v 0.1513 0.5442 0.0326 +v 0.1570 0.5038 0.0766 +v 0.1628 0.4634 0.1206 +v 0.1212 0.8164 -0.2044 +v 0.1269 0.7764 -0.1601 +v 0.1327 0.7363 -0.1158 +v 0.1385 0.6963 -0.0715 +v 0.1442 0.6562 -0.0272 +v 0.1500 0.6162 0.0171 +v 0.1557 0.5762 0.0615 +v 0.1615 0.5361 0.1058 +v 0.1672 0.4961 0.1501 +v 0.1201 0.8420 -0.1815 +v 0.1257 0.8034 -0.1360 +v 0.1313 0.7647 -0.0904 +v 0.1370 0.7261 -0.0448 +v 0.1426 0.6875 0.0007 +v 0.1482 0.6489 0.0463 +v 0.1539 0.6103 0.0919 +v 0.1595 0.5716 0.1374 +v 0.1651 0.5330 0.1830 +v 0.1153 0.8633 -0.1636 +v 0.1203 0.8271 -0.1160 +v 0.1253 0.7910 -0.0684 +v 0.1303 0.7549 -0.0207 +v 0.1353 0.7188 0.0269 +v 0.1403 0.6826 0.0746 +v 0.1453 0.6465 0.1222 +v 0.1503 0.6104 0.1698 +v 0.1553 0.5742 0.2175 +v 0.1086 0.8805 -0.1507 +v 0.1122 0.8479 -0.1005 +v 0.1158 0.8152 -0.0503 +v 0.1194 0.7826 -0.0000 +v 0.1230 0.7500 0.0502 +v 0.1265 0.7174 0.1004 +v 0.1301 0.6848 0.1507 +v 0.1337 0.6521 0.2009 +v 0.1373 0.6195 0.2511 +v 0.1016 0.8940 -0.1423 +v 0.1028 0.8658 -0.0893 +v 0.1040 0.8376 -0.0364 +v 0.1052 0.8094 0.0166 +v 0.1064 0.7812 0.0696 +v 0.1077 0.7531 0.1225 +v 0.1089 0.7249 0.1755 +v 0.1101 0.6967 0.2284 +v 0.1113 0.6685 0.2814 +v 0.0952 0.9042 -0.1374 +v 0.0931 0.8813 -0.0820 +v 0.0911 0.8583 -0.0265 +v 0.0890 0.8354 0.0289 +v 0.0869 0.8125 0.0843 +v 0.0848 0.7896 0.1397 +v 0.0827 0.7667 0.1951 +v 0.0807 0.7437 0.2505 +v 0.0786 0.7208 0.3059 +v 0.0900 0.9118 -0.1349 +v 0.0839 0.8948 -0.0777 +v 0.0778 0.8778 -0.0205 +v 0.0717 0.8608 0.0367 +v 0.0655 0.8438 0.0939 +v 0.0594 0.8267 0.1511 +v 0.0533 0.8097 0.2083 +v 0.0472 0.7927 0.2655 +v 0.0411 0.7757 0.3227 +v 0.0858 0.9178 -0.1341 +v 0.0753 0.9071 -0.0760 +v 0.0648 0.8964 -0.0179 +v 0.0542 0.8857 0.0402 +v 0.0437 0.8750 0.0983 +v 0.0331 0.8643 0.1563 +v 0.0226 0.8536 0.2144 +v 0.0120 0.8429 0.2725 +v 0.0015 0.8322 0.3306 +v 0.0823 0.9230 -0.1342 +v 0.0674 0.9188 -0.0763 +v 0.0524 0.9146 -0.0183 +v 0.0375 0.9104 0.0396 +v 0.0225 0.9062 0.0976 +v 0.0076 0.9021 0.1555 +v -0.0074 0.8979 0.2135 +v -0.0223 0.8937 0.2715 +v -0.0373 0.8895 0.3294 +v 0.0789 0.9286 -0.1353 +v 0.0600 0.9308 -0.0783 +v 0.0411 0.9331 -0.0214 +v 0.0222 0.9353 0.0355 +v 0.0033 0.9375 0.0924 +v -0.0156 0.9397 0.1493 +v -0.0345 0.9419 0.2062 +v -0.0534 0.9442 0.2631 +v -0.0723 0.9464 0.3200 +v 0.0751 0.9359 -0.1375 +v 0.0531 0.9441 -0.0823 +v 0.0310 0.9523 -0.0271 +v 0.0090 0.9605 0.0281 +v -0.0131 0.9688 0.0833 +v -0.0351 0.9770 0.1385 +v -0.0572 0.9852 0.1937 +v -0.0792 0.9934 0.2489 +v -0.1013 1.0016 0.3041 +v 0.0711 0.9462 -0.1414 +v 0.0469 0.9597 -0.0882 +v 0.0226 0.9731 -0.0350 +v -0.0016 0.9866 0.0182 +v -0.0258 1.0000 0.0714 +v -0.0500 1.0134 0.1247 +v -0.0743 1.0269 0.1779 +v -0.0985 1.0403 0.2311 +v -0.1227 1.0538 0.2843 +v 0.0672 0.9608 -0.1478 +v 0.0418 0.9784 -0.0964 +v 0.0164 0.9960 -0.0450 +v -0.0091 1.0136 0.0064 +v -0.0345 1.0312 0.0578 +v -0.0599 1.0489 0.1092 +v -0.0853 1.0665 0.1606 +v -0.1108 1.0841 0.2120 +v -0.1362 1.1017 0.2634 +v 0.0646 0.9806 -0.1569 +v 0.0387 1.0011 -0.1068 +v 0.0129 1.0216 -0.0567 +v -0.0130 1.0420 -0.0066 +v -0.0389 1.0625 0.0435 +v -0.0648 1.0830 0.0936 +v -0.0907 1.1034 0.1438 +v -0.1166 1.1239 0.1939 +v -0.1424 1.1444 0.2440 +v 0.0646 1.0067 -0.1683 +v 0.0386 1.0285 -0.1188 +v 0.0127 1.0502 -0.0692 +v -0.0133 1.0720 -0.0197 +v -0.0392 1.0938 0.0298 +v -0.0652 1.1155 0.0794 +v -0.0911 1.1373 0.1289 +v -0.1171 1.1590 0.1784 +v -0.1430 1.1808 0.2280 +v 0.0687 1.0392 -0.1817 +v 0.0426 1.0607 -0.1318 +v 0.0165 1.0821 -0.0820 +v -0.0097 1.1036 -0.0321 +v -0.0358 1.1250 0.0177 +v -0.0620 1.1464 0.0676 +v -0.0881 1.1679 0.1174 +v -0.1142 1.1893 0.1673 +v -0.1404 1.2108 0.2171 +v 0.0787 1.0776 -0.1969 +v 0.0516 1.0973 -0.1457 +v 0.0246 1.1169 -0.0944 +v -0.0024 1.1366 -0.0432 +v -0.0294 1.1562 0.0081 +v -0.0564 1.1759 0.0593 +v -0.0835 1.1956 0.1106 +v -0.1105 1.2152 0.1618 +v -0.1375 1.2349 0.2131 +v 0.0972 1.1325 -0.2135 +v 0.0676 1.1462 -0.1597 +v 0.0381 1.1600 -0.1060 +v 0.0086 1.1737 -0.0522 +v -0.0209 1.1875 0.0016 +v -0.0504 1.2013 0.0554 +v -0.0799 1.2150 0.1092 +v -0.1094 1.2288 0.1630 +v -0.1389 1.2425 0.2167 +v 0.1147 1.1973 -0.2256 +v 0.0823 1.2027 -0.1692 +v 0.0499 1.2080 -0.1128 +v 0.0174 1.2134 -0.0564 +v -0.0150 1.2188 0.0000 +v -0.0474 1.2241 0.0564 +v -0.0799 1.2295 0.1128 +v -0.1123 1.2348 0.1692 +v -0.1447 1.2402 0.2256 +v 0.1240 1.2427 -0.2367 +v 0.0896 1.2445 -0.1775 +v 0.0553 1.2463 -0.1184 +v 0.0210 1.2482 -0.0592 +v -0.0133 1.2500 0.0000 +v -0.0477 1.2518 0.0592 +v -0.0820 1.2537 0.1184 +v -0.1163 1.2555 0.1775 +v -0.1506 1.2573 0.2367 +v 0.1334 1.2735 -0.2501 +v 0.0972 1.2754 -0.1876 +v 0.0609 1.2774 -0.1251 +v 0.0246 1.2793 -0.0625 +v -0.0117 1.2812 0.0000 +v -0.0479 1.2832 0.0625 +v -0.0842 1.2851 0.1251 +v -0.1205 1.2871 0.1876 +v -0.1568 1.2890 0.2501 +v 0.1444 1.3043 -0.2661 +v 0.1058 1.3063 -0.1996 +v 0.0672 1.3084 -0.1330 +v 0.0286 1.3104 -0.0665 +v -0.0100 1.3125 0.0000 +v -0.0486 1.3146 0.0665 +v -0.0872 1.3166 0.1330 +v -0.1258 1.3187 0.1996 +v -0.1644 1.3207 0.2661 +v 0.1567 1.3349 -0.2846 +v 0.1155 1.3371 -0.2134 +v 0.0742 1.3393 -0.1423 +v 0.0329 1.3415 -0.0711 +v -0.0083 1.3438 0.0000 +v -0.0496 1.3460 0.0711 +v -0.0909 1.3482 0.1423 +v -0.1321 1.3504 0.2134 +v -0.1734 1.3526 0.2846 +v 0.1706 1.3655 -0.3056 +v 0.1263 1.3679 -0.2292 +v 0.0820 1.3703 -0.1528 +v 0.0377 1.3726 -0.0764 +v -0.0067 1.3750 0.0000 +v -0.0510 1.3774 0.0764 +v -0.0953 1.3797 0.1528 +v -0.1396 1.3821 0.2292 +v -0.1839 1.3845 0.3056 +v 0.1859 1.3961 -0.3292 +v 0.1382 1.3986 -0.2469 +v 0.0905 1.4012 -0.1646 +v 0.0427 1.4037 -0.0823 +v -0.0050 1.4062 0.0000 +v -0.0527 1.4088 0.0823 +v -0.1005 1.4113 0.1646 +v -0.1482 1.4139 0.2469 +v -0.1959 1.4164 0.3292 +v 0.2027 1.4265 -0.3553 +v 0.1512 1.4293 -0.2665 +v 0.0997 1.4320 -0.1776 +v 0.0482 1.4348 -0.0888 +v -0.0033 1.4375 0.0000 +v -0.0549 1.4402 0.0888 +v -0.1064 1.4430 0.1776 +v -0.1579 1.4457 0.2665 +v -0.2094 1.4485 0.3553 +v 0.2210 1.4569 -0.3839 +v 0.1653 1.4598 -0.2879 +v 0.1097 1.4628 -0.1919 +v 0.0540 1.4658 -0.0960 +v -0.0017 1.4688 0.0000 +v -0.0573 1.4717 0.0960 +v -0.1130 1.4747 0.1919 +v -0.1687 1.4777 0.2879 +v -0.2244 1.4806 0.3839 +v 0.2408 1.4872 -0.4151 +v 0.1806 1.4904 -0.3113 +v 0.1204 1.4936 -0.2075 +v 0.0602 1.4968 -0.1038 +v 0.0000 1.5000 -0.0000 +v -0.0602 1.5032 0.1038 +v -0.1204 1.5064 0.2075 +v -0.1806 1.5096 0.3113 +v -0.2408 1.5128 0.4151 +v 0.0000 -0.5000 0.2400 +v 0.0000 -0.5000 0.1800 +v 0.0000 -0.5000 0.1200 +v 0.0000 -0.5000 0.0600 +v 0.0000 -0.5000 0.0000 +v 0.0000 -0.5000 -0.0600 +v 0.0000 -0.5000 -0.1200 +v 0.0000 -0.5000 -0.1800 +v 0.0000 -0.5000 -0.2400 +v 0.0000 -0.4688 0.2400 +v 0.0000 -0.4688 0.1800 +v 0.0000 -0.4688 0.1200 +v 0.0000 -0.4688 0.0600 +v 0.0000 -0.4688 0.0000 +v 0.0000 -0.4688 -0.0600 +v 0.0000 -0.4688 -0.1200 +v 0.0000 -0.4688 -0.1800 +v 0.0000 -0.4688 -0.2400 +v 0.0000 -0.4375 0.2400 +v 0.0000 -0.4375 0.1800 +v 0.0000 -0.4375 0.1200 +v 0.0000 -0.4375 0.0600 +v 0.0000 -0.4375 0.0000 +v 0.0000 -0.4375 -0.0600 +v 0.0000 -0.4375 -0.1200 +v 0.0000 -0.4375 -0.1800 +v 0.0000 -0.4375 -0.2400 +v 0.0000 -0.4062 0.2400 +v 0.0000 -0.4062 0.1800 +v 0.0000 -0.4062 0.1200 +v 0.0000 -0.4062 0.0600 +v 0.0000 -0.4062 0.0000 +v 0.0000 -0.4062 -0.0600 +v 0.0000 -0.4062 -0.1200 +v 0.0000 -0.4062 -0.1800 +v 0.0000 -0.4062 -0.2400 +v 0.0000 -0.3750 0.2400 +v 0.0000 -0.3750 0.1800 +v 0.0000 -0.3750 0.1200 +v 0.0000 -0.3750 0.0600 +v 0.0000 -0.3750 0.0000 +v 0.0000 -0.3750 -0.0600 +v 0.0000 -0.3750 -0.1200 +v 0.0000 -0.3750 -0.1800 +v 0.0000 -0.3750 -0.2400 +v -0.0013 -0.3540 0.2398 +v -0.0010 -0.3514 0.1798 +v -0.0007 -0.3489 0.1199 +v -0.0003 -0.3463 0.0599 +v 0.0000 -0.3438 0.0000 +v 0.0003 -0.3412 -0.0599 +v 0.0007 -0.3386 -0.1199 +v 0.0010 -0.3361 -0.1798 +v 0.0013 -0.3335 -0.2398 +v 0.0042 -0.3427 0.2405 +v 0.0072 -0.3352 0.1811 +v 0.0103 -0.3276 0.1217 +v 0.0133 -0.3201 0.0622 +v 0.0163 -0.3125 0.0028 +v 0.0193 -0.3049 -0.0567 +v 0.0223 -0.2974 -0.1161 +v 0.0253 -0.2898 -0.1756 +v 0.0283 -0.2823 -0.2350 +v 0.0057 -0.3362 0.2421 +v 0.0104 -0.3224 0.1838 +v 0.0151 -0.3087 0.1256 +v 0.0197 -0.2950 0.0674 +v 0.0244 -0.2812 0.0092 +v 0.0291 -0.2675 -0.0490 +v 0.0338 -0.2538 -0.1073 +v 0.0385 -0.2401 -0.1655 +v 0.0432 -0.2263 -0.2237 +v 0.0079 -0.3240 0.2458 +v 0.0135 -0.3055 0.1890 +v 0.0191 -0.2870 0.1322 +v 0.0247 -0.2685 0.0754 +v 0.0303 -0.2500 0.0186 +v 0.0359 -0.2315 -0.0382 +v 0.0416 -0.2130 -0.0950 +v 0.0472 -0.1945 -0.1518 +v 0.0528 -0.1760 -0.2086 +v 0.0093 -0.3065 0.2525 +v 0.0153 -0.2846 0.1970 +v 0.0212 -0.2626 0.1414 +v 0.0272 -0.2407 0.0859 +v 0.0332 -0.2188 0.0304 +v 0.0391 -0.1968 -0.0251 +v 0.0451 -0.1749 -0.0806 +v 0.0510 -0.1529 -0.1362 +v 0.0570 -0.1310 -0.1917 +v 0.0085 -0.2830 0.2625 +v 0.0144 -0.2591 0.2077 +v 0.0204 -0.2352 0.1530 +v 0.0263 -0.2114 0.0983 +v 0.0323 -0.1875 0.0435 +v 0.0382 -0.1636 -0.0112 +v 0.0442 -0.1398 -0.0659 +v 0.0501 -0.1159 -0.1206 +v 0.0561 -0.0920 -0.1754 +v 0.0034 -0.2529 0.2754 +v 0.0094 -0.2287 0.2208 +v 0.0154 -0.2046 0.1662 +v 0.0213 -0.1804 0.1116 +v 0.0273 -0.1562 0.0570 +v 0.0332 -0.1321 0.0024 +v 0.0392 -0.1079 -0.0522 +v 0.0452 -0.0838 -0.1068 +v 0.0511 -0.0596 -0.1614 +v -0.0074 -0.2163 0.2901 +v -0.0010 -0.1935 0.2350 +v 0.0054 -0.1707 0.1799 +v 0.0118 -0.1478 0.1248 +v 0.0182 -0.1250 0.0697 +v 0.0246 -0.1022 0.0145 +v 0.0309 -0.0793 -0.0406 +v 0.0373 -0.0565 -0.0957 +v 0.0437 -0.0337 -0.1508 +v -0.0253 -0.1739 0.3045 +v -0.0177 -0.1538 0.2485 +v -0.0101 -0.1338 0.1924 +v -0.0025 -0.1138 0.1364 +v 0.0051 -0.0938 0.0803 +v 0.0127 -0.0737 0.0243 +v 0.0203 -0.0537 -0.0317 +v 0.0279 -0.0337 -0.0878 +v 0.0356 -0.0136 -0.1438 +v -0.0504 -0.1263 0.3160 +v -0.0406 -0.1104 0.2590 +v -0.0308 -0.0944 0.2020 +v -0.0211 -0.0785 0.1450 +v -0.0113 -0.0625 0.0880 +v -0.0015 -0.0465 0.0310 +v 0.0083 -0.0306 -0.0260 +v 0.0181 -0.0146 -0.0830 +v 0.0278 0.0013 -0.1400 +v -0.0819 -0.0746 0.3221 +v -0.0690 -0.0638 0.2645 +v -0.0561 -0.0529 0.2069 +v -0.0432 -0.0421 0.1493 +v -0.0303 -0.0312 0.0918 +v -0.0174 -0.0204 0.0342 +v -0.0045 -0.0096 -0.0234 +v 0.0084 0.0013 -0.0810 +v 0.0213 0.0121 -0.1386 +v -0.1179 -0.0200 0.3205 +v -0.1011 -0.0150 0.2631 +v -0.0844 -0.0100 0.2057 +v -0.0676 -0.0050 0.1483 +v -0.0508 0.0000 0.0909 +v -0.0341 0.0050 0.0335 +v -0.0173 0.0100 -0.0239 +v -0.0006 0.0150 -0.0813 +v 0.0162 0.0200 -0.1387 +v -0.1558 0.0365 0.3098 +v -0.1348 0.0352 0.2536 +v -0.1138 0.0339 0.1974 +v -0.0928 0.0326 0.1412 +v -0.0718 0.0312 0.0851 +v -0.0508 0.0299 0.0289 +v -0.0298 0.0286 -0.0273 +v -0.0088 0.0273 -0.0835 +v 0.0122 0.0260 -0.1397 +v -0.1926 0.0937 0.2897 +v -0.1674 0.0859 0.2358 +v -0.1423 0.0781 0.1819 +v -0.1171 0.0703 0.1280 +v -0.0919 0.0625 0.0741 +v -0.0668 0.0547 0.0202 +v -0.0416 0.0469 -0.0337 +v -0.0164 0.0391 -0.0876 +v 0.0087 0.0313 -0.1415 +v -0.2253 0.1505 0.2608 +v -0.1965 0.1363 0.2102 +v -0.1676 0.1221 0.1595 +v -0.1388 0.1079 0.1089 +v -0.1099 0.0938 0.0582 +v -0.0811 0.0796 0.0076 +v -0.0522 0.0654 -0.0431 +v -0.0234 0.0512 -0.0938 +v 0.0055 0.0370 -0.1444 +v -0.2514 0.2061 0.2249 +v -0.2197 0.1858 0.1782 +v -0.1880 0.1655 0.1314 +v -0.1563 0.1453 0.0847 +v -0.1246 0.1250 0.0380 +v -0.0929 0.1047 -0.0088 +v -0.0612 0.0845 -0.0555 +v -0.0295 0.0642 -0.1022 +v 0.0022 0.0439 -0.1489 +v -0.2691 0.2596 0.1842 +v -0.2356 0.2337 0.1417 +v -0.2020 0.2079 0.0992 +v -0.1685 0.1821 0.0567 +v -0.1349 0.1562 0.0142 +v -0.1013 0.1304 -0.0284 +v -0.0678 0.1046 -0.0709 +v -0.0342 0.0788 -0.1134 +v -0.0007 0.0529 -0.1559 +v -0.2775 0.3103 0.1415 +v -0.2431 0.2796 0.1031 +v -0.2088 0.2489 0.0647 +v -0.1744 0.2182 0.0262 +v -0.1400 0.1875 -0.0122 +v -0.1056 0.1568 -0.0506 +v -0.0712 0.1261 -0.0890 +v -0.0369 0.0954 -0.1274 +v -0.0025 0.0647 -0.1658 +v -0.2767 0.3577 0.0996 +v -0.2423 0.3230 0.0648 +v -0.2080 0.2882 0.0299 +v -0.1737 0.2535 -0.0049 +v -0.1393 0.2188 -0.0398 +v -0.1050 0.1840 -0.0746 +v -0.0707 0.1493 -0.1095 +v -0.0363 0.1145 -0.1443 +v -0.0020 0.0798 -0.1791 +v -0.2675 0.4015 0.0611 +v -0.2338 0.3636 0.0290 +v -0.2001 0.3257 -0.0031 +v -0.1664 0.2879 -0.0352 +v -0.1327 0.2500 -0.0673 +v -0.0990 0.2121 -0.0993 +v -0.0653 0.1743 -0.1314 +v -0.0315 0.1364 -0.1635 +v 0.0022 0.0985 -0.1956 +v -0.2516 0.4413 0.0279 +v -0.2187 0.4013 -0.0024 +v -0.1858 0.3613 -0.0327 +v -0.1530 0.3213 -0.0630 +v -0.1201 0.2812 -0.0933 +v -0.0872 0.2412 -0.1236 +v -0.0543 0.2012 -0.1539 +v -0.0214 0.1612 -0.1841 +v 0.0115 0.1212 -0.2144 +v -0.2311 0.4770 0.0013 +v -0.1988 0.4359 -0.0281 +v -0.1665 0.3947 -0.0576 +v -0.1342 0.3536 -0.0870 +v -0.1020 0.3125 -0.1165 +v -0.0697 0.2714 -0.1459 +v -0.0374 0.2303 -0.1753 +v -0.0051 0.1891 -0.2048 +v 0.0272 0.1480 -0.2342 +v -0.2081 0.5085 -0.0182 +v -0.1759 0.4673 -0.0475 +v -0.1436 0.4261 -0.0769 +v -0.1113 0.3849 -0.1062 +v -0.0791 0.3438 -0.1356 +v -0.0468 0.3026 -0.1649 +v -0.0145 0.2614 -0.1943 +v 0.0178 0.2202 -0.2237 +v 0.0500 0.1790 -0.2530 +v -0.1848 0.5360 -0.0307 +v -0.1517 0.4957 -0.0604 +v -0.1186 0.4555 -0.0902 +v -0.0855 0.4152 -0.1199 +v -0.0524 0.3750 -0.1496 +v -0.0193 0.3348 -0.1794 +v 0.0139 0.2945 -0.2091 +v 0.0470 0.2543 -0.2389 +v 0.0801 0.2140 -0.2686 +v -0.1629 0.5594 -0.0371 +v -0.1279 0.5211 -0.0673 +v -0.0930 0.4828 -0.0975 +v -0.0581 0.4445 -0.1277 +v -0.0231 0.4062 -0.1579 +v 0.0118 0.3680 -0.1881 +v 0.0468 0.3297 -0.2183 +v 0.0817 0.2914 -0.2485 +v 0.1167 0.2531 -0.2787 +v -0.1437 0.5792 -0.0385 +v -0.1059 0.5438 -0.0688 +v -0.0682 0.5083 -0.0991 +v -0.0304 0.4729 -0.1295 +v 0.0073 0.4375 -0.1598 +v 0.0451 0.4021 -0.1902 +v 0.0828 0.3667 -0.2205 +v 0.1206 0.3312 -0.2508 +v 0.1584 0.2958 -0.2812 +v -0.1279 0.5955 -0.0363 +v -0.0865 0.5638 -0.0661 +v -0.0452 0.5321 -0.0958 +v -0.0038 0.5004 -0.1256 +v 0.0375 0.4688 -0.1554 +v 0.0789 0.4371 -0.1851 +v 0.1203 0.4054 -0.2149 +v 0.1616 0.3737 -0.2446 +v 0.2030 0.3420 -0.2744 +v -0.1157 0.6087 -0.0319 +v -0.0703 0.5815 -0.0601 +v -0.0248 0.5544 -0.0883 +v 0.0206 0.5272 -0.1165 +v 0.0661 0.5000 -0.1447 +v 0.1115 0.4728 -0.1729 +v 0.1570 0.4456 -0.2011 +v 0.2025 0.4185 -0.2293 +v 0.2479 0.3913 -0.2575 +v -0.1070 0.6193 -0.0265 +v -0.0573 0.5973 -0.0520 +v -0.0077 0.5753 -0.0775 +v 0.0420 0.5533 -0.1029 +v 0.0916 0.5312 -0.1284 +v 0.1413 0.5092 -0.1539 +v 0.1909 0.4872 -0.1794 +v 0.2406 0.4652 -0.2049 +v 0.2902 0.4432 -0.2304 +v -0.1011 0.6279 -0.0208 +v -0.0476 0.6115 -0.0424 +v 0.0059 0.5952 -0.0641 +v 0.0595 0.5788 -0.0857 +v 0.1130 0.5625 -0.1074 +v 0.1665 0.5462 -0.1290 +v 0.2200 0.5298 -0.1506 +v 0.2735 0.5135 -0.1723 +v 0.3271 0.4971 -0.1939 +v -0.0974 0.6349 -0.0152 +v -0.0408 0.6246 -0.0321 +v 0.0159 0.6143 -0.0489 +v 0.0726 0.6040 -0.0658 +v 0.1292 0.5938 -0.0826 +v 0.1859 0.5835 -0.0994 +v 0.2426 0.5732 -0.1163 +v 0.2992 0.5629 -0.1331 +v 0.3559 0.5526 -0.1499 +v -0.0954 0.6410 -0.0099 +v -0.0366 0.6370 -0.0213 +v 0.0222 0.6330 -0.0327 +v 0.0810 0.6290 -0.0440 +v 0.1398 0.6250 -0.0554 +v 0.1985 0.6210 -0.0668 +v 0.2573 0.6170 -0.0781 +v 0.3161 0.6130 -0.0895 +v 0.3749 0.6090 -0.1009 +v -0.0945 0.6469 -0.0046 +v -0.0349 0.6492 -0.0102 +v 0.0248 0.6516 -0.0159 +v 0.0845 0.6539 -0.0215 +v 0.1442 0.6562 -0.0272 +v 0.2039 0.6586 -0.0328 +v 0.2636 0.6609 -0.0384 +v 0.3233 0.6633 -0.0441 +v 0.3830 0.6656 -0.0497 +v -0.0949 0.6533 0.0011 +v -0.0356 0.6619 0.0010 +v 0.0238 0.6704 0.0009 +v 0.0832 0.6790 0.0008 +v 0.1426 0.6875 0.0007 +v 0.2020 0.6960 0.0006 +v 0.2614 0.7046 0.0005 +v 0.3208 0.7131 0.0004 +v 0.3802 0.7217 0.0003 +v -0.0968 0.6610 0.0076 +v -0.0388 0.6755 0.0124 +v 0.0192 0.6899 0.0172 +v 0.0773 0.7043 0.0221 +v 0.1353 0.7188 0.0269 +v 0.1934 0.7332 0.0318 +v 0.2514 0.7476 0.0366 +v 0.3094 0.7620 0.0414 +v 0.3675 0.7765 0.0463 +v -0.1008 0.6708 0.0148 +v -0.0449 0.6906 0.0236 +v 0.0111 0.7104 0.0325 +v 0.0670 0.7302 0.0413 +v 0.1230 0.7500 0.0502 +v 0.1789 0.7698 0.0591 +v 0.2348 0.7896 0.0679 +v 0.2908 0.8094 0.0768 +v 0.3467 0.8292 0.0856 +v -0.1076 0.6834 0.0225 +v -0.0541 0.7079 0.0342 +v -0.0006 0.7323 0.0460 +v 0.0529 0.7568 0.0578 +v 0.1064 0.7812 0.0696 +v 0.1600 0.8057 0.0813 +v 0.2135 0.8302 0.0931 +v 0.2670 0.8546 0.1049 +v 0.3205 0.8791 0.1167 +v -0.1178 0.6997 0.0299 +v -0.0666 0.7279 0.0435 +v -0.0155 0.7561 0.0571 +v 0.0357 0.7843 0.0707 +v 0.0869 0.8125 0.0843 +v 0.1381 0.8407 0.0979 +v 0.1893 0.8689 0.1115 +v 0.2404 0.8971 0.1250 +v 0.2916 0.9253 0.1386 +v -0.1319 0.7201 0.0360 +v -0.0825 0.7510 0.0505 +v -0.0332 0.7819 0.0649 +v 0.0162 0.8128 0.0794 +v 0.0655 0.8438 0.0939 +v 0.1149 0.8747 0.1084 +v 0.1642 0.9056 0.1228 +v 0.2136 0.9365 0.1373 +v 0.2630 0.9674 0.1518 +v -0.1496 0.7455 0.0393 +v -0.1013 0.7779 0.0541 +v -0.0530 0.8102 0.0688 +v -0.0047 0.8426 0.0835 +v 0.0437 0.8750 0.0983 +v 0.0920 0.9074 0.1130 +v 0.1403 0.9398 0.1277 +v 0.1886 0.9721 0.1424 +v 0.2369 1.0045 0.1572 +v -0.1703 0.7761 0.0385 +v -0.1221 0.8087 0.0532 +v -0.0739 0.8412 0.0680 +v -0.0257 0.8737 0.0828 +v 0.0225 0.9062 0.0976 +v 0.0707 0.9388 0.1124 +v 0.1189 0.9713 0.1271 +v 0.1671 1.0038 0.1419 +v 0.2153 1.0364 0.1567 +v -0.1924 0.8123 0.0322 +v -0.1435 0.8436 0.0473 +v -0.0946 0.8749 0.0623 +v -0.0456 0.9062 0.0773 +v 0.0033 0.9375 0.0924 +v 0.0522 0.9688 0.1074 +v 0.1012 1.0001 0.1224 +v 0.1501 1.0314 0.1375 +v 0.1990 1.0627 0.1525 +v -0.2141 0.8539 0.0201 +v -0.1638 0.8826 0.0359 +v -0.1136 0.9113 0.0517 +v -0.0633 0.9400 0.0675 +v -0.0131 0.9688 0.0833 +v 0.0372 0.9975 0.0991 +v 0.0874 1.0262 0.1150 +v 0.1377 1.0549 0.1308 +v 0.1880 1.0836 0.1466 +v -0.2330 0.9007 0.0022 +v -0.1812 0.9255 0.0195 +v -0.1294 0.9503 0.0368 +v -0.0776 0.9752 0.0541 +v -0.0258 1.0000 0.0714 +v 0.0260 1.0248 0.0887 +v 0.0778 1.0497 0.1061 +v 0.1296 1.0745 0.1234 +v 0.1814 1.0993 0.1407 +v -0.2471 0.9519 -0.0202 +v -0.1940 0.9717 -0.0007 +v -0.1408 0.9916 0.0188 +v -0.0877 1.0114 0.0383 +v -0.0345 1.0312 0.0578 +v 0.0187 1.0511 0.0773 +v 0.0718 1.0709 0.0968 +v 0.1250 1.0908 0.1163 +v 0.1782 1.1106 0.1358 +v -0.2548 1.0065 -0.0451 +v -0.2008 1.0205 -0.0229 +v -0.1469 1.0345 -0.0008 +v -0.0929 1.0485 0.0214 +v -0.0389 1.0625 0.0435 +v 0.0151 1.0765 0.0657 +v 0.0690 1.0905 0.0879 +v 0.1230 1.1045 0.1100 +v 0.1770 1.1185 0.1322 +v -0.2553 1.0632 -0.0700 +v -0.2013 1.0708 -0.0450 +v -0.1473 1.0785 -0.0201 +v -0.0932 1.0861 0.0049 +v -0.0392 1.0938 0.0298 +v 0.0148 1.1014 0.0548 +v 0.0688 1.1090 0.0797 +v 0.1229 1.1167 0.1047 +v 0.1769 1.1243 0.1296 +v -0.2500 1.1202 -0.0925 +v -0.1965 1.1214 -0.0650 +v -0.1429 1.1226 -0.0374 +v -0.0894 1.1238 -0.0099 +v -0.0358 1.1250 0.0177 +v 0.0177 1.1262 0.0453 +v 0.0713 1.1274 0.0728 +v 0.1248 1.1286 0.1004 +v 0.1784 1.1298 0.1279 +v -0.2420 1.1762 -0.1116 +v -0.1888 1.1712 -0.0817 +v -0.1357 1.1662 -0.0518 +v -0.0826 1.1612 -0.0219 +v -0.0294 1.1562 0.0081 +v 0.0237 1.1513 0.0380 +v 0.0768 1.1463 0.0679 +v 0.1300 1.1413 0.0978 +v 0.1831 1.1363 0.1278 +v -0.2357 1.2208 -0.1248 +v -0.1820 1.2124 -0.0932 +v -0.1283 1.2041 -0.0616 +v -0.0746 1.1958 -0.0300 +v -0.0209 1.1875 0.0016 +v 0.0328 1.1792 0.0332 +v 0.0865 1.1709 0.0648 +v 0.1403 1.1626 0.0964 +v 0.1940 1.1542 0.1280 +v -0.2395 1.2425 -0.1313 +v -0.1834 1.2366 -0.0985 +v -0.1272 1.2306 -0.0657 +v -0.0711 1.2247 -0.0328 +v -0.0150 1.2188 0.0000 +v 0.0411 1.2128 0.0328 +v 0.0972 1.2069 0.0657 +v 0.1534 1.2009 0.0985 +v 0.2095 1.1950 0.1313 +v -0.2497 1.2626 -0.1375 +v -0.1906 1.2595 -0.1031 +v -0.1315 1.2563 -0.0688 +v -0.0724 1.2532 -0.0344 +v -0.0133 1.2500 0.0000 +v 0.0458 1.2468 0.0344 +v 0.1049 1.2437 0.0688 +v 0.1639 1.2405 0.1031 +v 0.2230 1.2374 0.1375 +v -0.2614 1.2946 -0.1453 +v -0.1990 1.2912 -0.1090 +v -0.1366 1.2879 -0.0727 +v -0.0741 1.2846 -0.0363 +v -0.0117 1.2812 0.0000 +v 0.0508 1.2779 0.0363 +v 0.1132 1.2746 0.0727 +v 0.1757 1.2713 0.1090 +v 0.2381 1.2679 0.1453 +v -0.2757 1.3267 -0.1546 +v -0.2093 1.3231 -0.1159 +v -0.1429 1.3196 -0.0773 +v -0.0764 1.3160 -0.0386 +v -0.0100 1.3125 0.0000 +v 0.0564 1.3090 0.0386 +v 0.1229 1.3054 0.0773 +v 0.1893 1.3019 0.1159 +v 0.2557 1.2983 0.1546 +v -0.2925 1.3589 -0.1653 +v -0.2215 1.3551 -0.1240 +v -0.1504 1.3513 -0.0827 +v -0.0794 1.3475 -0.0413 +v -0.0083 1.3438 0.0000 +v 0.0627 1.3400 0.0413 +v 0.1338 1.3362 0.0827 +v 0.2048 1.3324 0.1240 +v 0.2759 1.3286 0.1653 +v -0.3118 1.3913 -0.1775 +v -0.2356 1.3872 -0.1331 +v -0.1593 1.3831 -0.0888 +v -0.0830 1.3791 -0.0444 +v -0.0067 1.3750 0.0000 +v 0.0696 1.3709 0.0444 +v 0.1459 1.3669 0.0888 +v 0.2222 1.3628 0.1331 +v 0.2985 1.3587 0.1775 +v -0.3337 1.4238 -0.1912 +v -0.2515 1.4194 -0.1434 +v -0.1694 1.4150 -0.0956 +v -0.0872 1.4106 -0.0478 +v -0.0050 1.4062 0.0000 +v 0.0772 1.4019 0.0478 +v 0.1594 1.3975 0.0956 +v 0.2415 1.3931 0.1434 +v 0.3237 1.3887 0.1912 +v -0.3581 1.4564 -0.2064 +v -0.2694 1.4517 -0.1548 +v -0.1807 1.4470 -0.1032 +v -0.0920 1.4422 -0.0516 +v -0.0033 1.4375 0.0000 +v 0.0854 1.4328 0.0516 +v 0.1740 1.4280 0.1032 +v 0.2627 1.4233 0.1548 +v 0.3514 1.4186 0.2064 +v -0.3850 1.4892 -0.2230 +v -0.2892 1.4841 -0.1673 +v -0.1933 1.4790 -0.1115 +v -0.0975 1.4739 -0.0558 +v -0.0017 1.4688 0.0000 +v 0.0942 1.4636 0.0558 +v 0.1900 1.4585 0.1115 +v 0.2858 1.4534 0.1673 +v 0.3817 1.4483 0.2230 +v -0.4145 1.5221 -0.2411 +v -0.3108 1.5166 -0.1808 +v -0.2072 1.5111 -0.1206 +v -0.1036 1.5055 -0.0603 +v 0.0000 1.5000 -0.0000 +v 0.1036 1.4945 0.0603 +v 0.2072 1.4889 0.1206 +v 0.3108 1.4834 0.1808 +v 0.4145 1.4779 0.2411 +vt 0.0000 0.0000 +vt 0.1250 0.0000 +vt 0.2500 0.0000 +vt 0.3750 0.0000 +vt 0.5000 0.0000 +vt 0.6250 0.0000 +vt 0.7500 0.0000 +vt 0.8750 0.0000 +vt 1.0000 0.0000 +vt 0.0000 0.0156 +vt 0.1250 0.0156 +vt 0.2500 0.0156 +vt 0.3750 0.0156 +vt 0.5000 0.0156 +vt 0.6250 0.0156 +vt 0.7500 0.0156 +vt 0.8750 0.0156 +vt 1.0000 0.0156 +vt 0.0000 0.0312 +vt 0.1250 0.0312 +vt 0.2500 0.0312 +vt 0.3750 0.0312 +vt 0.5000 0.0312 +vt 0.6250 0.0312 +vt 0.7500 0.0312 +vt 0.8750 0.0312 +vt 1.0000 0.0312 +vt 0.0000 0.0469 +vt 0.1250 0.0469 +vt 0.2500 0.0469 +vt 0.3750 0.0469 +vt 0.5000 0.0469 +vt 0.6250 0.0469 +vt 0.7500 0.0469 +vt 0.8750 0.0469 +vt 1.0000 0.0469 +vt 0.0000 0.0625 +vt 0.1250 0.0625 +vt 0.2500 0.0625 +vt 0.3750 0.0625 +vt 0.5000 0.0625 +vt 0.6250 0.0625 +vt 0.7500 0.0625 +vt 0.8750 0.0625 +vt 1.0000 0.0625 +vt 0.0000 0.0781 +vt 0.1250 0.0781 +vt 0.2500 0.0781 +vt 0.3750 0.0781 +vt 0.5000 0.0781 +vt 0.6250 0.0781 +vt 0.7500 0.0781 +vt 0.8750 0.0781 +vt 1.0000 0.0781 +vt 0.0000 0.0938 +vt 0.1250 0.0938 +vt 0.2500 0.0938 +vt 0.3750 0.0938 +vt 0.5000 0.0938 +vt 0.6250 0.0938 +vt 0.7500 0.0938 +vt 0.8750 0.0938 +vt 1.0000 0.0938 +vt 0.0000 0.1094 +vt 0.1250 0.1094 +vt 0.2500 0.1094 +vt 0.3750 0.1094 +vt 0.5000 0.1094 +vt 0.6250 0.1094 +vt 0.7500 0.1094 +vt 0.8750 0.1094 +vt 1.0000 0.1094 +vt 0.0000 0.1250 +vt 0.1250 0.1250 +vt 0.2500 0.1250 +vt 0.3750 0.1250 +vt 0.5000 0.1250 +vt 0.6250 0.1250 +vt 0.7500 0.1250 +vt 0.8750 0.1250 +vt 1.0000 0.1250 +vt 0.0000 0.1406 +vt 0.1250 0.1406 +vt 0.2500 0.1406 +vt 0.3750 0.1406 +vt 0.5000 0.1406 +vt 0.6250 0.1406 +vt 0.7500 0.1406 +vt 0.8750 0.1406 +vt 1.0000 0.1406 +vt 0.0000 0.1562 +vt 0.1250 0.1562 +vt 0.2500 0.1562 +vt 0.3750 0.1562 +vt 0.5000 0.1562 +vt 0.6250 0.1562 +vt 0.7500 0.1562 +vt 0.8750 0.1562 +vt 1.0000 0.1562 +vt 0.0000 0.1719 +vt 0.1250 0.1719 +vt 0.2500 0.1719 +vt 0.3750 0.1719 +vt 0.5000 0.1719 +vt 0.6250 0.1719 +vt 0.7500 0.1719 +vt 0.8750 0.1719 +vt 1.0000 0.1719 +vt 0.0000 0.1875 +vt 0.1250 0.1875 +vt 0.2500 0.1875 +vt 0.3750 0.1875 +vt 0.5000 0.1875 +vt 0.6250 0.1875 +vt 0.7500 0.1875 +vt 0.8750 0.1875 +vt 1.0000 0.1875 +vt 0.0000 0.2031 +vt 0.1250 0.2031 +vt 0.2500 0.2031 +vt 0.3750 0.2031 +vt 0.5000 0.2031 +vt 0.6250 0.2031 +vt 0.7500 0.2031 +vt 0.8750 0.2031 +vt 1.0000 0.2031 +vt 0.0000 0.2188 +vt 0.1250 0.2188 +vt 0.2500 0.2188 +vt 0.3750 0.2188 +vt 0.5000 0.2188 +vt 0.6250 0.2188 +vt 0.7500 0.2188 +vt 0.8750 0.2188 +vt 1.0000 0.2188 +vt 0.0000 0.2344 +vt 0.1250 0.2344 +vt 0.2500 0.2344 +vt 0.3750 0.2344 +vt 0.5000 0.2344 +vt 0.6250 0.2344 +vt 0.7500 0.2344 +vt 0.8750 0.2344 +vt 1.0000 0.2344 +vt 0.0000 0.2500 +vt 0.1250 0.2500 +vt 0.2500 0.2500 +vt 0.3750 0.2500 +vt 0.5000 0.2500 +vt 0.6250 0.2500 +vt 0.7500 0.2500 +vt 0.8750 0.2500 +vt 1.0000 0.2500 +vt 0.0000 0.2656 +vt 0.1250 0.2656 +vt 0.2500 0.2656 +vt 0.3750 0.2656 +vt 0.5000 0.2656 +vt 0.6250 0.2656 +vt 0.7500 0.2656 +vt 0.8750 0.2656 +vt 1.0000 0.2656 +vt 0.0000 0.2812 +vt 0.1250 0.2812 +vt 0.2500 0.2812 +vt 0.3750 0.2812 +vt 0.5000 0.2812 +vt 0.6250 0.2812 +vt 0.7500 0.2812 +vt 0.8750 0.2812 +vt 1.0000 0.2812 +vt 0.0000 0.2969 +vt 0.1250 0.2969 +vt 0.2500 0.2969 +vt 0.3750 0.2969 +vt 0.5000 0.2969 +vt 0.6250 0.2969 +vt 0.7500 0.2969 +vt 0.8750 0.2969 +vt 1.0000 0.2969 +vt 0.0000 0.3125 +vt 0.1250 0.3125 +vt 0.2500 0.3125 +vt 0.3750 0.3125 +vt 0.5000 0.3125 +vt 0.6250 0.3125 +vt 0.7500 0.3125 +vt 0.8750 0.3125 +vt 1.0000 0.3125 +vt 0.0000 0.3281 +vt 0.1250 0.3281 +vt 0.2500 0.3281 +vt 0.3750 0.3281 +vt 0.5000 0.3281 +vt 0.6250 0.3281 +vt 0.7500 0.3281 +vt 0.8750 0.3281 +vt 1.0000 0.3281 +vt 0.0000 0.3438 +vt 0.1250 0.3438 +vt 0.2500 0.3438 +vt 0.3750 0.3438 +vt 0.5000 0.3438 +vt 0.6250 0.3438 +vt 0.7500 0.3438 +vt 0.8750 0.3438 +vt 1.0000 0.3438 +vt 0.0000 0.3594 +vt 0.1250 0.3594 +vt 0.2500 0.3594 +vt 0.3750 0.3594 +vt 0.5000 0.3594 +vt 0.6250 0.3594 +vt 0.7500 0.3594 +vt 0.8750 0.3594 +vt 1.0000 0.3594 +vt 0.0000 0.3750 +vt 0.1250 0.3750 +vt 0.2500 0.3750 +vt 0.3750 0.3750 +vt 0.5000 0.3750 +vt 0.6250 0.3750 +vt 0.7500 0.3750 +vt 0.8750 0.3750 +vt 1.0000 0.3750 +vt 0.0000 0.3906 +vt 0.1250 0.3906 +vt 0.2500 0.3906 +vt 0.3750 0.3906 +vt 0.5000 0.3906 +vt 0.6250 0.3906 +vt 0.7500 0.3906 +vt 0.8750 0.3906 +vt 1.0000 0.3906 +vt 0.0000 0.4062 +vt 0.1250 0.4062 +vt 0.2500 0.4062 +vt 0.3750 0.4062 +vt 0.5000 0.4062 +vt 0.6250 0.4062 +vt 0.7500 0.4062 +vt 0.8750 0.4062 +vt 1.0000 0.4062 +vt 0.0000 0.4219 +vt 0.1250 0.4219 +vt 0.2500 0.4219 +vt 0.3750 0.4219 +vt 0.5000 0.4219 +vt 0.6250 0.4219 +vt 0.7500 0.4219 +vt 0.8750 0.4219 +vt 1.0000 0.4219 +vt 0.0000 0.4375 +vt 0.1250 0.4375 +vt 0.2500 0.4375 +vt 0.3750 0.4375 +vt 0.5000 0.4375 +vt 0.6250 0.4375 +vt 0.7500 0.4375 +vt 0.8750 0.4375 +vt 1.0000 0.4375 +vt 0.0000 0.4531 +vt 0.1250 0.4531 +vt 0.2500 0.4531 +vt 0.3750 0.4531 +vt 0.5000 0.4531 +vt 0.6250 0.4531 +vt 0.7500 0.4531 +vt 0.8750 0.4531 +vt 1.0000 0.4531 +vt 0.0000 0.4688 +vt 0.1250 0.4688 +vt 0.2500 0.4688 +vt 0.3750 0.4688 +vt 0.5000 0.4688 +vt 0.6250 0.4688 +vt 0.7500 0.4688 +vt 0.8750 0.4688 +vt 1.0000 0.4688 +vt 0.0000 0.4844 +vt 0.1250 0.4844 +vt 0.2500 0.4844 +vt 0.3750 0.4844 +vt 0.5000 0.4844 +vt 0.6250 0.4844 +vt 0.7500 0.4844 +vt 0.8750 0.4844 +vt 1.0000 0.4844 +vt 0.0000 0.5000 +vt 0.1250 0.5000 +vt 0.2500 0.5000 +vt 0.3750 0.5000 +vt 0.5000 0.5000 +vt 0.6250 0.5000 +vt 0.7500 0.5000 +vt 0.8750 0.5000 +vt 1.0000 0.5000 +vt 0.0000 0.5156 +vt 0.1250 0.5156 +vt 0.2500 0.5156 +vt 0.3750 0.5156 +vt 0.5000 0.5156 +vt 0.6250 0.5156 +vt 0.7500 0.5156 +vt 0.8750 0.5156 +vt 1.0000 0.5156 +vt 0.0000 0.5312 +vt 0.1250 0.5312 +vt 0.2500 0.5312 +vt 0.3750 0.5312 +vt 0.5000 0.5312 +vt 0.6250 0.5312 +vt 0.7500 0.5312 +vt 0.8750 0.5312 +vt 1.0000 0.5312 +vt 0.0000 0.5469 +vt 0.1250 0.5469 +vt 0.2500 0.5469 +vt 0.3750 0.5469 +vt 0.5000 0.5469 +vt 0.6250 0.5469 +vt 0.7500 0.5469 +vt 0.8750 0.5469 +vt 1.0000 0.5469 +vt 0.0000 0.5625 +vt 0.1250 0.5625 +vt 0.2500 0.5625 +vt 0.3750 0.5625 +vt 0.5000 0.5625 +vt 0.6250 0.5625 +vt 0.7500 0.5625 +vt 0.8750 0.5625 +vt 1.0000 0.5625 +vt 0.0000 0.5781 +vt 0.1250 0.5781 +vt 0.2500 0.5781 +vt 0.3750 0.5781 +vt 0.5000 0.5781 +vt 0.6250 0.5781 +vt 0.7500 0.5781 +vt 0.8750 0.5781 +vt 1.0000 0.5781 +vt 0.0000 0.5938 +vt 0.1250 0.5938 +vt 0.2500 0.5938 +vt 0.3750 0.5938 +vt 0.5000 0.5938 +vt 0.6250 0.5938 +vt 0.7500 0.5938 +vt 0.8750 0.5938 +vt 1.0000 0.5938 +vt 0.0000 0.6094 +vt 0.1250 0.6094 +vt 0.2500 0.6094 +vt 0.3750 0.6094 +vt 0.5000 0.6094 +vt 0.6250 0.6094 +vt 0.7500 0.6094 +vt 0.8750 0.6094 +vt 1.0000 0.6094 +vt 0.0000 0.6250 +vt 0.1250 0.6250 +vt 0.2500 0.6250 +vt 0.3750 0.6250 +vt 0.5000 0.6250 +vt 0.6250 0.6250 +vt 0.7500 0.6250 +vt 0.8750 0.6250 +vt 1.0000 0.6250 +vt 0.0000 0.6406 +vt 0.1250 0.6406 +vt 0.2500 0.6406 +vt 0.3750 0.6406 +vt 0.5000 0.6406 +vt 0.6250 0.6406 +vt 0.7500 0.6406 +vt 0.8750 0.6406 +vt 1.0000 0.6406 +vt 0.0000 0.6562 +vt 0.1250 0.6562 +vt 0.2500 0.6562 +vt 0.3750 0.6562 +vt 0.5000 0.6562 +vt 0.6250 0.6562 +vt 0.7500 0.6562 +vt 0.8750 0.6562 +vt 1.0000 0.6562 +vt 0.0000 0.6719 +vt 0.1250 0.6719 +vt 0.2500 0.6719 +vt 0.3750 0.6719 +vt 0.5000 0.6719 +vt 0.6250 0.6719 +vt 0.7500 0.6719 +vt 0.8750 0.6719 +vt 1.0000 0.6719 +vt 0.0000 0.6875 +vt 0.1250 0.6875 +vt 0.2500 0.6875 +vt 0.3750 0.6875 +vt 0.5000 0.6875 +vt 0.6250 0.6875 +vt 0.7500 0.6875 +vt 0.8750 0.6875 +vt 1.0000 0.6875 +vt 0.0000 0.7031 +vt 0.1250 0.7031 +vt 0.2500 0.7031 +vt 0.3750 0.7031 +vt 0.5000 0.7031 +vt 0.6250 0.7031 +vt 0.7500 0.7031 +vt 0.8750 0.7031 +vt 1.0000 0.7031 +vt 0.0000 0.7188 +vt 0.1250 0.7188 +vt 0.2500 0.7188 +vt 0.3750 0.7188 +vt 0.5000 0.7188 +vt 0.6250 0.7188 +vt 0.7500 0.7188 +vt 0.8750 0.7188 +vt 1.0000 0.7188 +vt 0.0000 0.7344 +vt 0.1250 0.7344 +vt 0.2500 0.7344 +vt 0.3750 0.7344 +vt 0.5000 0.7344 +vt 0.6250 0.7344 +vt 0.7500 0.7344 +vt 0.8750 0.7344 +vt 1.0000 0.7344 +vt 0.0000 0.7500 +vt 0.1250 0.7500 +vt 0.2500 0.7500 +vt 0.3750 0.7500 +vt 0.5000 0.7500 +vt 0.6250 0.7500 +vt 0.7500 0.7500 +vt 0.8750 0.7500 +vt 1.0000 0.7500 +vt 0.0000 0.7656 +vt 0.1250 0.7656 +vt 0.2500 0.7656 +vt 0.3750 0.7656 +vt 0.5000 0.7656 +vt 0.6250 0.7656 +vt 0.7500 0.7656 +vt 0.8750 0.7656 +vt 1.0000 0.7656 +vt 0.0000 0.7812 +vt 0.1250 0.7812 +vt 0.2500 0.7812 +vt 0.3750 0.7812 +vt 0.5000 0.7812 +vt 0.6250 0.7812 +vt 0.7500 0.7812 +vt 0.8750 0.7812 +vt 1.0000 0.7812 +vt 0.0000 0.7969 +vt 0.1250 0.7969 +vt 0.2500 0.7969 +vt 0.3750 0.7969 +vt 0.5000 0.7969 +vt 0.6250 0.7969 +vt 0.7500 0.7969 +vt 0.8750 0.7969 +vt 1.0000 0.7969 +vt 0.0000 0.8125 +vt 0.1250 0.8125 +vt 0.2500 0.8125 +vt 0.3750 0.8125 +vt 0.5000 0.8125 +vt 0.6250 0.8125 +vt 0.7500 0.8125 +vt 0.8750 0.8125 +vt 1.0000 0.8125 +vt 0.0000 0.8281 +vt 0.1250 0.8281 +vt 0.2500 0.8281 +vt 0.3750 0.8281 +vt 0.5000 0.8281 +vt 0.6250 0.8281 +vt 0.7500 0.8281 +vt 0.8750 0.8281 +vt 1.0000 0.8281 +vt 0.0000 0.8438 +vt 0.1250 0.8438 +vt 0.2500 0.8438 +vt 0.3750 0.8438 +vt 0.5000 0.8438 +vt 0.6250 0.8438 +vt 0.7500 0.8438 +vt 0.8750 0.8438 +vt 1.0000 0.8438 +vt 0.0000 0.8594 +vt 0.1250 0.8594 +vt 0.2500 0.8594 +vt 0.3750 0.8594 +vt 0.5000 0.8594 +vt 0.6250 0.8594 +vt 0.7500 0.8594 +vt 0.8750 0.8594 +vt 1.0000 0.8594 +vt 0.0000 0.8750 +vt 0.1250 0.8750 +vt 0.2500 0.8750 +vt 0.3750 0.8750 +vt 0.5000 0.8750 +vt 0.6250 0.8750 +vt 0.7500 0.8750 +vt 0.8750 0.8750 +vt 1.0000 0.8750 +vt 0.0000 0.8906 +vt 0.1250 0.8906 +vt 0.2500 0.8906 +vt 0.3750 0.8906 +vt 0.5000 0.8906 +vt 0.6250 0.8906 +vt 0.7500 0.8906 +vt 0.8750 0.8906 +vt 1.0000 0.8906 +vt 0.0000 0.9062 +vt 0.1250 0.9062 +vt 0.2500 0.9062 +vt 0.3750 0.9062 +vt 0.5000 0.9062 +vt 0.6250 0.9062 +vt 0.7500 0.9062 +vt 0.8750 0.9062 +vt 1.0000 0.9062 +vt 0.0000 0.9219 +vt 0.1250 0.9219 +vt 0.2500 0.9219 +vt 0.3750 0.9219 +vt 0.5000 0.9219 +vt 0.6250 0.9219 +vt 0.7500 0.9219 +vt 0.8750 0.9219 +vt 1.0000 0.9219 +vt 0.0000 0.9375 +vt 0.1250 0.9375 +vt 0.2500 0.9375 +vt 0.3750 0.9375 +vt 0.5000 0.9375 +vt 0.6250 0.9375 +vt 0.7500 0.9375 +vt 0.8750 0.9375 +vt 1.0000 0.9375 +vt 0.0000 0.9531 +vt 0.1250 0.9531 +vt 0.2500 0.9531 +vt 0.3750 0.9531 +vt 0.5000 0.9531 +vt 0.6250 0.9531 +vt 0.7500 0.9531 +vt 0.8750 0.9531 +vt 1.0000 0.9531 +vt 0.0000 0.9688 +vt 0.1250 0.9688 +vt 0.2500 0.9688 +vt 0.3750 0.9688 +vt 0.5000 0.9688 +vt 0.6250 0.9688 +vt 0.7500 0.9688 +vt 0.8750 0.9688 +vt 1.0000 0.9688 +vt 0.0000 0.9844 +vt 0.1250 0.9844 +vt 0.2500 0.9844 +vt 0.3750 0.9844 +vt 0.5000 0.9844 +vt 0.6250 0.9844 +vt 0.7500 0.9844 +vt 0.8750 0.9844 +vt 1.0000 0.9844 +vt 0.0000 1.0000 +vt 0.1250 1.0000 +vt 0.2500 1.0000 +vt 0.3750 1.0000 +vt 0.5000 1.0000 +vt 0.6250 1.0000 +vt 0.7500 1.0000 +vt 0.8750 1.0000 +vt 1.0000 1.0000 +vt 0.0000 0.0000 +vt 0.1250 0.0000 +vt 0.2500 0.0000 +vt 0.3750 0.0000 +vt 0.5000 0.0000 +vt 0.6250 0.0000 +vt 0.7500 0.0000 +vt 0.8750 0.0000 +vt 1.0000 0.0000 +vt 0.0000 0.0156 +vt 0.1250 0.0156 +vt 0.2500 0.0156 +vt 0.3750 0.0156 +vt 0.5000 0.0156 +vt 0.6250 0.0156 +vt 0.7500 0.0156 +vt 0.8750 0.0156 +vt 1.0000 0.0156 +vt 0.0000 0.0312 +vt 0.1250 0.0312 +vt 0.2500 0.0312 +vt 0.3750 0.0312 +vt 0.5000 0.0312 +vt 0.6250 0.0312 +vt 0.7500 0.0312 +vt 0.8750 0.0312 +vt 1.0000 0.0312 +vt 0.0000 0.0469 +vt 0.1250 0.0469 +vt 0.2500 0.0469 +vt 0.3750 0.0469 +vt 0.5000 0.0469 +vt 0.6250 0.0469 +vt 0.7500 0.0469 +vt 0.8750 0.0469 +vt 1.0000 0.0469 +vt 0.0000 0.0625 +vt 0.1250 0.0625 +vt 0.2500 0.0625 +vt 0.3750 0.0625 +vt 0.5000 0.0625 +vt 0.6250 0.0625 +vt 0.7500 0.0625 +vt 0.8750 0.0625 +vt 1.0000 0.0625 +vt 0.0000 0.0781 +vt 0.1250 0.0781 +vt 0.2500 0.0781 +vt 0.3750 0.0781 +vt 0.5000 0.0781 +vt 0.6250 0.0781 +vt 0.7500 0.0781 +vt 0.8750 0.0781 +vt 1.0000 0.0781 +vt 0.0000 0.0938 +vt 0.1250 0.0938 +vt 0.2500 0.0938 +vt 0.3750 0.0938 +vt 0.5000 0.0938 +vt 0.6250 0.0938 +vt 0.7500 0.0938 +vt 0.8750 0.0938 +vt 1.0000 0.0938 +vt 0.0000 0.1094 +vt 0.1250 0.1094 +vt 0.2500 0.1094 +vt 0.3750 0.1094 +vt 0.5000 0.1094 +vt 0.6250 0.1094 +vt 0.7500 0.1094 +vt 0.8750 0.1094 +vt 1.0000 0.1094 +vt 0.0000 0.1250 +vt 0.1250 0.1250 +vt 0.2500 0.1250 +vt 0.3750 0.1250 +vt 0.5000 0.1250 +vt 0.6250 0.1250 +vt 0.7500 0.1250 +vt 0.8750 0.1250 +vt 1.0000 0.1250 +vt 0.0000 0.1406 +vt 0.1250 0.1406 +vt 0.2500 0.1406 +vt 0.3750 0.1406 +vt 0.5000 0.1406 +vt 0.6250 0.1406 +vt 0.7500 0.1406 +vt 0.8750 0.1406 +vt 1.0000 0.1406 +vt 0.0000 0.1562 +vt 0.1250 0.1562 +vt 0.2500 0.1562 +vt 0.3750 0.1562 +vt 0.5000 0.1562 +vt 0.6250 0.1562 +vt 0.7500 0.1562 +vt 0.8750 0.1562 +vt 1.0000 0.1562 +vt 0.0000 0.1719 +vt 0.1250 0.1719 +vt 0.2500 0.1719 +vt 0.3750 0.1719 +vt 0.5000 0.1719 +vt 0.6250 0.1719 +vt 0.7500 0.1719 +vt 0.8750 0.1719 +vt 1.0000 0.1719 +vt 0.0000 0.1875 +vt 0.1250 0.1875 +vt 0.2500 0.1875 +vt 0.3750 0.1875 +vt 0.5000 0.1875 +vt 0.6250 0.1875 +vt 0.7500 0.1875 +vt 0.8750 0.1875 +vt 1.0000 0.1875 +vt 0.0000 0.2031 +vt 0.1250 0.2031 +vt 0.2500 0.2031 +vt 0.3750 0.2031 +vt 0.5000 0.2031 +vt 0.6250 0.2031 +vt 0.7500 0.2031 +vt 0.8750 0.2031 +vt 1.0000 0.2031 +vt 0.0000 0.2188 +vt 0.1250 0.2188 +vt 0.2500 0.2188 +vt 0.3750 0.2188 +vt 0.5000 0.2188 +vt 0.6250 0.2188 +vt 0.7500 0.2188 +vt 0.8750 0.2188 +vt 1.0000 0.2188 +vt 0.0000 0.2344 +vt 0.1250 0.2344 +vt 0.2500 0.2344 +vt 0.3750 0.2344 +vt 0.5000 0.2344 +vt 0.6250 0.2344 +vt 0.7500 0.2344 +vt 0.8750 0.2344 +vt 1.0000 0.2344 +vt 0.0000 0.2500 +vt 0.1250 0.2500 +vt 0.2500 0.2500 +vt 0.3750 0.2500 +vt 0.5000 0.2500 +vt 0.6250 0.2500 +vt 0.7500 0.2500 +vt 0.8750 0.2500 +vt 1.0000 0.2500 +vt 0.0000 0.2656 +vt 0.1250 0.2656 +vt 0.2500 0.2656 +vt 0.3750 0.2656 +vt 0.5000 0.2656 +vt 0.6250 0.2656 +vt 0.7500 0.2656 +vt 0.8750 0.2656 +vt 1.0000 0.2656 +vt 0.0000 0.2812 +vt 0.1250 0.2812 +vt 0.2500 0.2812 +vt 0.3750 0.2812 +vt 0.5000 0.2812 +vt 0.6250 0.2812 +vt 0.7500 0.2812 +vt 0.8750 0.2812 +vt 1.0000 0.2812 +vt 0.0000 0.2969 +vt 0.1250 0.2969 +vt 0.2500 0.2969 +vt 0.3750 0.2969 +vt 0.5000 0.2969 +vt 0.6250 0.2969 +vt 0.7500 0.2969 +vt 0.8750 0.2969 +vt 1.0000 0.2969 +vt 0.0000 0.3125 +vt 0.1250 0.3125 +vt 0.2500 0.3125 +vt 0.3750 0.3125 +vt 0.5000 0.3125 +vt 0.6250 0.3125 +vt 0.7500 0.3125 +vt 0.8750 0.3125 +vt 1.0000 0.3125 +vt 0.0000 0.3281 +vt 0.1250 0.3281 +vt 0.2500 0.3281 +vt 0.3750 0.3281 +vt 0.5000 0.3281 +vt 0.6250 0.3281 +vt 0.7500 0.3281 +vt 0.8750 0.3281 +vt 1.0000 0.3281 +vt 0.0000 0.3438 +vt 0.1250 0.3438 +vt 0.2500 0.3438 +vt 0.3750 0.3438 +vt 0.5000 0.3438 +vt 0.6250 0.3438 +vt 0.7500 0.3438 +vt 0.8750 0.3438 +vt 1.0000 0.3438 +vt 0.0000 0.3594 +vt 0.1250 0.3594 +vt 0.2500 0.3594 +vt 0.3750 0.3594 +vt 0.5000 0.3594 +vt 0.6250 0.3594 +vt 0.7500 0.3594 +vt 0.8750 0.3594 +vt 1.0000 0.3594 +vt 0.0000 0.3750 +vt 0.1250 0.3750 +vt 0.2500 0.3750 +vt 0.3750 0.3750 +vt 0.5000 0.3750 +vt 0.6250 0.3750 +vt 0.7500 0.3750 +vt 0.8750 0.3750 +vt 1.0000 0.3750 +vt 0.0000 0.3906 +vt 0.1250 0.3906 +vt 0.2500 0.3906 +vt 0.3750 0.3906 +vt 0.5000 0.3906 +vt 0.6250 0.3906 +vt 0.7500 0.3906 +vt 0.8750 0.3906 +vt 1.0000 0.3906 +vt 0.0000 0.4062 +vt 0.1250 0.4062 +vt 0.2500 0.4062 +vt 0.3750 0.4062 +vt 0.5000 0.4062 +vt 0.6250 0.4062 +vt 0.7500 0.4062 +vt 0.8750 0.4062 +vt 1.0000 0.4062 +vt 0.0000 0.4219 +vt 0.1250 0.4219 +vt 0.2500 0.4219 +vt 0.3750 0.4219 +vt 0.5000 0.4219 +vt 0.6250 0.4219 +vt 0.7500 0.4219 +vt 0.8750 0.4219 +vt 1.0000 0.4219 +vt 0.0000 0.4375 +vt 0.1250 0.4375 +vt 0.2500 0.4375 +vt 0.3750 0.4375 +vt 0.5000 0.4375 +vt 0.6250 0.4375 +vt 0.7500 0.4375 +vt 0.8750 0.4375 +vt 1.0000 0.4375 +vt 0.0000 0.4531 +vt 0.1250 0.4531 +vt 0.2500 0.4531 +vt 0.3750 0.4531 +vt 0.5000 0.4531 +vt 0.6250 0.4531 +vt 0.7500 0.4531 +vt 0.8750 0.4531 +vt 1.0000 0.4531 +vt 0.0000 0.4688 +vt 0.1250 0.4688 +vt 0.2500 0.4688 +vt 0.3750 0.4688 +vt 0.5000 0.4688 +vt 0.6250 0.4688 +vt 0.7500 0.4688 +vt 0.8750 0.4688 +vt 1.0000 0.4688 +vt 0.0000 0.4844 +vt 0.1250 0.4844 +vt 0.2500 0.4844 +vt 0.3750 0.4844 +vt 0.5000 0.4844 +vt 0.6250 0.4844 +vt 0.7500 0.4844 +vt 0.8750 0.4844 +vt 1.0000 0.4844 +vt 0.0000 0.5000 +vt 0.1250 0.5000 +vt 0.2500 0.5000 +vt 0.3750 0.5000 +vt 0.5000 0.5000 +vt 0.6250 0.5000 +vt 0.7500 0.5000 +vt 0.8750 0.5000 +vt 1.0000 0.5000 +vt 0.0000 0.5156 +vt 0.1250 0.5156 +vt 0.2500 0.5156 +vt 0.3750 0.5156 +vt 0.5000 0.5156 +vt 0.6250 0.5156 +vt 0.7500 0.5156 +vt 0.8750 0.5156 +vt 1.0000 0.5156 +vt 0.0000 0.5312 +vt 0.1250 0.5312 +vt 0.2500 0.5312 +vt 0.3750 0.5312 +vt 0.5000 0.5312 +vt 0.6250 0.5312 +vt 0.7500 0.5312 +vt 0.8750 0.5312 +vt 1.0000 0.5312 +vt 0.0000 0.5469 +vt 0.1250 0.5469 +vt 0.2500 0.5469 +vt 0.3750 0.5469 +vt 0.5000 0.5469 +vt 0.6250 0.5469 +vt 0.7500 0.5469 +vt 0.8750 0.5469 +vt 1.0000 0.5469 +vt 0.0000 0.5625 +vt 0.1250 0.5625 +vt 0.2500 0.5625 +vt 0.3750 0.5625 +vt 0.5000 0.5625 +vt 0.6250 0.5625 +vt 0.7500 0.5625 +vt 0.8750 0.5625 +vt 1.0000 0.5625 +vt 0.0000 0.5781 +vt 0.1250 0.5781 +vt 0.2500 0.5781 +vt 0.3750 0.5781 +vt 0.5000 0.5781 +vt 0.6250 0.5781 +vt 0.7500 0.5781 +vt 0.8750 0.5781 +vt 1.0000 0.5781 +vt 0.0000 0.5938 +vt 0.1250 0.5938 +vt 0.2500 0.5938 +vt 0.3750 0.5938 +vt 0.5000 0.5938 +vt 0.6250 0.5938 +vt 0.7500 0.5938 +vt 0.8750 0.5938 +vt 1.0000 0.5938 +vt 0.0000 0.6094 +vt 0.1250 0.6094 +vt 0.2500 0.6094 +vt 0.3750 0.6094 +vt 0.5000 0.6094 +vt 0.6250 0.6094 +vt 0.7500 0.6094 +vt 0.8750 0.6094 +vt 1.0000 0.6094 +vt 0.0000 0.6250 +vt 0.1250 0.6250 +vt 0.2500 0.6250 +vt 0.3750 0.6250 +vt 0.5000 0.6250 +vt 0.6250 0.6250 +vt 0.7500 0.6250 +vt 0.8750 0.6250 +vt 1.0000 0.6250 +vt 0.0000 0.6406 +vt 0.1250 0.6406 +vt 0.2500 0.6406 +vt 0.3750 0.6406 +vt 0.5000 0.6406 +vt 0.6250 0.6406 +vt 0.7500 0.6406 +vt 0.8750 0.6406 +vt 1.0000 0.6406 +vt 0.0000 0.6562 +vt 0.1250 0.6562 +vt 0.2500 0.6562 +vt 0.3750 0.6562 +vt 0.5000 0.6562 +vt 0.6250 0.6562 +vt 0.7500 0.6562 +vt 0.8750 0.6562 +vt 1.0000 0.6562 +vt 0.0000 0.6719 +vt 0.1250 0.6719 +vt 0.2500 0.6719 +vt 0.3750 0.6719 +vt 0.5000 0.6719 +vt 0.6250 0.6719 +vt 0.7500 0.6719 +vt 0.8750 0.6719 +vt 1.0000 0.6719 +vt 0.0000 0.6875 +vt 0.1250 0.6875 +vt 0.2500 0.6875 +vt 0.3750 0.6875 +vt 0.5000 0.6875 +vt 0.6250 0.6875 +vt 0.7500 0.6875 +vt 0.8750 0.6875 +vt 1.0000 0.6875 +vt 0.0000 0.7031 +vt 0.1250 0.7031 +vt 0.2500 0.7031 +vt 0.3750 0.7031 +vt 0.5000 0.7031 +vt 0.6250 0.7031 +vt 0.7500 0.7031 +vt 0.8750 0.7031 +vt 1.0000 0.7031 +vt 0.0000 0.7188 +vt 0.1250 0.7188 +vt 0.2500 0.7188 +vt 0.3750 0.7188 +vt 0.5000 0.7188 +vt 0.6250 0.7188 +vt 0.7500 0.7188 +vt 0.8750 0.7188 +vt 1.0000 0.7188 +vt 0.0000 0.7344 +vt 0.1250 0.7344 +vt 0.2500 0.7344 +vt 0.3750 0.7344 +vt 0.5000 0.7344 +vt 0.6250 0.7344 +vt 0.7500 0.7344 +vt 0.8750 0.7344 +vt 1.0000 0.7344 +vt 0.0000 0.7500 +vt 0.1250 0.7500 +vt 0.2500 0.7500 +vt 0.3750 0.7500 +vt 0.5000 0.7500 +vt 0.6250 0.7500 +vt 0.7500 0.7500 +vt 0.8750 0.7500 +vt 1.0000 0.7500 +vt 0.0000 0.7656 +vt 0.1250 0.7656 +vt 0.2500 0.7656 +vt 0.3750 0.7656 +vt 0.5000 0.7656 +vt 0.6250 0.7656 +vt 0.7500 0.7656 +vt 0.8750 0.7656 +vt 1.0000 0.7656 +vt 0.0000 0.7812 +vt 0.1250 0.7812 +vt 0.2500 0.7812 +vt 0.3750 0.7812 +vt 0.5000 0.7812 +vt 0.6250 0.7812 +vt 0.7500 0.7812 +vt 0.8750 0.7812 +vt 1.0000 0.7812 +vt 0.0000 0.7969 +vt 0.1250 0.7969 +vt 0.2500 0.7969 +vt 0.3750 0.7969 +vt 0.5000 0.7969 +vt 0.6250 0.7969 +vt 0.7500 0.7969 +vt 0.8750 0.7969 +vt 1.0000 0.7969 +vt 0.0000 0.8125 +vt 0.1250 0.8125 +vt 0.2500 0.8125 +vt 0.3750 0.8125 +vt 0.5000 0.8125 +vt 0.6250 0.8125 +vt 0.7500 0.8125 +vt 0.8750 0.8125 +vt 1.0000 0.8125 +vt 0.0000 0.8281 +vt 0.1250 0.8281 +vt 0.2500 0.8281 +vt 0.3750 0.8281 +vt 0.5000 0.8281 +vt 0.6250 0.8281 +vt 0.7500 0.8281 +vt 0.8750 0.8281 +vt 1.0000 0.8281 +vt 0.0000 0.8438 +vt 0.1250 0.8438 +vt 0.2500 0.8438 +vt 0.3750 0.8438 +vt 0.5000 0.8438 +vt 0.6250 0.8438 +vt 0.7500 0.8438 +vt 0.8750 0.8438 +vt 1.0000 0.8438 +vt 0.0000 0.8594 +vt 0.1250 0.8594 +vt 0.2500 0.8594 +vt 0.3750 0.8594 +vt 0.5000 0.8594 +vt 0.6250 0.8594 +vt 0.7500 0.8594 +vt 0.8750 0.8594 +vt 1.0000 0.8594 +vt 0.0000 0.8750 +vt 0.1250 0.8750 +vt 0.2500 0.8750 +vt 0.3750 0.8750 +vt 0.5000 0.8750 +vt 0.6250 0.8750 +vt 0.7500 0.8750 +vt 0.8750 0.8750 +vt 1.0000 0.8750 +vt 0.0000 0.8906 +vt 0.1250 0.8906 +vt 0.2500 0.8906 +vt 0.3750 0.8906 +vt 0.5000 0.8906 +vt 0.6250 0.8906 +vt 0.7500 0.8906 +vt 0.8750 0.8906 +vt 1.0000 0.8906 +vt 0.0000 0.9062 +vt 0.1250 0.9062 +vt 0.2500 0.9062 +vt 0.3750 0.9062 +vt 0.5000 0.9062 +vt 0.6250 0.9062 +vt 0.7500 0.9062 +vt 0.8750 0.9062 +vt 1.0000 0.9062 +vt 0.0000 0.9219 +vt 0.1250 0.9219 +vt 0.2500 0.9219 +vt 0.3750 0.9219 +vt 0.5000 0.9219 +vt 0.6250 0.9219 +vt 0.7500 0.9219 +vt 0.8750 0.9219 +vt 1.0000 0.9219 +vt 0.0000 0.9375 +vt 0.1250 0.9375 +vt 0.2500 0.9375 +vt 0.3750 0.9375 +vt 0.5000 0.9375 +vt 0.6250 0.9375 +vt 0.7500 0.9375 +vt 0.8750 0.9375 +vt 1.0000 0.9375 +vt 0.0000 0.9531 +vt 0.1250 0.9531 +vt 0.2500 0.9531 +vt 0.3750 0.9531 +vt 0.5000 0.9531 +vt 0.6250 0.9531 +vt 0.7500 0.9531 +vt 0.8750 0.9531 +vt 1.0000 0.9531 +vt 0.0000 0.9688 +vt 0.1250 0.9688 +vt 0.2500 0.9688 +vt 0.3750 0.9688 +vt 0.5000 0.9688 +vt 0.6250 0.9688 +vt 0.7500 0.9688 +vt 0.8750 0.9688 +vt 1.0000 0.9688 +vt 0.0000 0.9844 +vt 0.1250 0.9844 +vt 0.2500 0.9844 +vt 0.3750 0.9844 +vt 0.5000 0.9844 +vt 0.6250 0.9844 +vt 0.7500 0.9844 +vt 0.8750 0.9844 +vt 1.0000 0.9844 +vt 0.0000 1.0000 +vt 0.1250 1.0000 +vt 0.2500 1.0000 +vt 0.3750 1.0000 +vt 0.5000 1.0000 +vt 0.6250 1.0000 +vt 0.7500 1.0000 +vt 0.8750 1.0000 +vt 1.0000 1.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +s off +f 1/1/1 2/2/1 11/11/1 10/10/1 +f 2/2/1 3/3/1 12/12/1 11/11/1 +f 3/3/1 4/4/1 13/13/1 12/12/1 +f 4/4/1 5/5/1 14/14/1 13/13/1 +f 5/5/1 6/6/1 15/15/1 14/14/1 +f 6/6/1 7/7/1 16/16/1 15/15/1 +f 7/7/1 8/8/1 17/17/1 16/16/1 +f 8/8/1 9/9/1 18/18/1 17/17/1 +f 10/10/1 11/11/1 20/20/1 19/19/1 +f 11/11/1 12/12/1 21/21/1 20/20/1 +f 12/12/1 13/13/1 22/22/1 21/21/1 +f 13/13/1 14/14/1 23/23/1 22/22/1 +f 14/14/1 15/15/1 24/24/1 23/23/1 +f 15/15/1 16/16/1 25/25/1 24/24/1 +f 16/16/1 17/17/1 26/26/1 25/25/1 +f 17/17/1 18/18/1 27/27/1 26/26/1 +f 19/19/1 20/20/1 29/29/1 28/28/1 +f 20/20/1 21/21/1 30/30/1 29/29/1 +f 21/21/1 22/22/1 31/31/1 30/30/1 +f 22/22/1 23/23/1 32/32/1 31/31/1 +f 23/23/1 24/24/1 33/33/1 32/32/1 +f 24/24/1 25/25/1 34/34/1 33/33/1 +f 25/25/1 26/26/1 35/35/1 34/34/1 +f 26/26/1 27/27/1 36/36/1 35/35/1 +f 28/28/1 29/29/1 38/38/1 37/37/1 +f 29/29/1 30/30/1 39/39/1 38/38/1 +f 30/30/1 31/31/1 40/40/1 39/39/1 +f 31/31/1 32/32/1 41/41/1 40/40/1 +f 32/32/1 33/33/1 42/42/1 41/41/1 +f 33/33/1 34/34/1 43/43/1 42/42/1 +f 34/34/1 35/35/1 44/44/1 43/43/1 +f 35/35/1 36/36/1 45/45/1 44/44/1 +f 37/37/1 38/38/1 47/47/1 46/46/1 +f 38/38/1 39/39/1 48/48/1 47/47/1 +f 39/39/1 40/40/1 49/49/1 48/48/1 +f 40/40/1 41/41/1 50/50/1 49/49/1 +f 41/41/1 42/42/1 51/51/1 50/50/1 +f 42/42/1 43/43/1 52/52/1 51/51/1 +f 43/43/1 44/44/1 53/53/1 52/52/1 +f 44/44/1 45/45/1 54/54/1 53/53/1 +f 46/46/1 47/47/1 56/56/1 55/55/1 +f 47/47/1 48/48/1 57/57/1 56/56/1 +f 48/48/1 49/49/1 58/58/1 57/57/1 +f 49/49/1 50/50/1 59/59/1 58/58/1 +f 50/50/1 51/51/1 60/60/1 59/59/1 +f 51/51/1 52/52/1 61/61/1 60/60/1 +f 52/52/1 53/53/1 62/62/1 61/61/1 +f 53/53/1 54/54/1 63/63/1 62/62/1 +f 55/55/1 56/56/1 65/65/1 64/64/1 +f 56/56/1 57/57/1 66/66/1 65/65/1 +f 57/57/1 58/58/1 67/67/1 66/66/1 +f 58/58/1 59/59/1 68/68/1 67/67/1 +f 59/59/1 60/60/1 69/69/1 68/68/1 +f 60/60/1 61/61/1 70/70/1 69/69/1 +f 61/61/1 62/62/1 71/71/1 70/70/1 +f 62/62/1 63/63/1 72/72/1 71/71/1 +f 64/64/1 65/65/1 74/74/1 73/73/1 +f 65/65/1 66/66/1 75/75/1 74/74/1 +f 66/66/1 67/67/1 76/76/1 75/75/1 +f 67/67/1 68/68/1 77/77/1 76/76/1 +f 68/68/1 69/69/1 78/78/1 77/77/1 +f 69/69/1 70/70/1 79/79/1 78/78/1 +f 70/70/1 71/71/1 80/80/1 79/79/1 +f 71/71/1 72/72/1 81/81/1 80/80/1 +f 73/73/1 74/74/1 83/83/1 82/82/1 +f 74/74/1 75/75/1 84/84/1 83/83/1 +f 75/75/1 76/76/1 85/85/1 84/84/1 +f 76/76/1 77/77/1 86/86/1 85/85/1 +f 77/77/1 78/78/1 87/87/1 86/86/1 +f 78/78/1 79/79/1 88/88/1 87/87/1 +f 79/79/1 80/80/1 89/89/1 88/88/1 +f 80/80/1 81/81/1 90/90/1 89/89/1 +f 82/82/1 83/83/1 92/92/1 91/91/1 +f 83/83/1 84/84/1 93/93/1 92/92/1 +f 84/84/1 85/85/1 94/94/1 93/93/1 +f 85/85/1 86/86/1 95/95/1 94/94/1 +f 86/86/1 87/87/1 96/96/1 95/95/1 +f 87/87/1 88/88/1 97/97/1 96/96/1 +f 88/88/1 89/89/1 98/98/1 97/97/1 +f 89/89/1 90/90/1 99/99/1 98/98/1 +f 91/91/1 92/92/1 101/101/1 100/100/1 +f 92/92/1 93/93/1 102/102/1 101/101/1 +f 93/93/1 94/94/1 103/103/1 102/102/1 +f 94/94/1 95/95/1 104/104/1 103/103/1 +f 95/95/1 96/96/1 105/105/1 104/104/1 +f 96/96/1 97/97/1 106/106/1 105/105/1 +f 97/97/1 98/98/1 107/107/1 106/106/1 +f 98/98/1 99/99/1 108/108/1 107/107/1 +f 100/100/1 101/101/1 110/110/1 109/109/1 +f 101/101/1 102/102/1 111/111/1 110/110/1 +f 102/102/1 103/103/1 112/112/1 111/111/1 +f 103/103/1 104/104/1 113/113/1 112/112/1 +f 104/104/1 105/105/1 114/114/1 113/113/1 +f 105/105/1 106/106/1 115/115/1 114/114/1 +f 106/106/1 107/107/1 116/116/1 115/115/1 +f 107/107/1 108/108/1 117/117/1 116/116/1 +f 109/109/1 110/110/1 119/119/1 118/118/1 +f 110/110/1 111/111/1 120/120/1 119/119/1 +f 111/111/1 112/112/1 121/121/1 120/120/1 +f 112/112/1 113/113/1 122/122/1 121/121/1 +f 113/113/1 114/114/1 123/123/1 122/122/1 +f 114/114/1 115/115/1 124/124/1 123/123/1 +f 115/115/1 116/116/1 125/125/1 124/124/1 +f 116/116/1 117/117/1 126/126/1 125/125/1 +f 118/118/1 119/119/1 128/128/1 127/127/1 +f 119/119/1 120/120/1 129/129/1 128/128/1 +f 120/120/1 121/121/1 130/130/1 129/129/1 +f 121/121/1 122/122/1 131/131/1 130/130/1 +f 122/122/1 123/123/1 132/132/1 131/131/1 +f 123/123/1 124/124/1 133/133/1 132/132/1 +f 124/124/1 125/125/1 134/134/1 133/133/1 +f 125/125/1 126/126/1 135/135/1 134/134/1 +f 127/127/1 128/128/1 137/137/1 136/136/1 +f 128/128/1 129/129/1 138/138/1 137/137/1 +f 129/129/1 130/130/1 139/139/1 138/138/1 +f 130/130/1 131/131/1 140/140/1 139/139/1 +f 131/131/1 132/132/1 141/141/1 140/140/1 +f 132/132/1 133/133/1 142/142/1 141/141/1 +f 133/133/1 134/134/1 143/143/1 142/142/1 +f 134/134/1 135/135/1 144/144/1 143/143/1 +f 136/136/1 137/137/1 146/146/1 145/145/1 +f 137/137/1 138/138/1 147/147/1 146/146/1 +f 138/138/1 139/139/1 148/148/1 147/147/1 +f 139/139/1 140/140/1 149/149/1 148/148/1 +f 140/140/1 141/141/1 150/150/1 149/149/1 +f 141/141/1 142/142/1 151/151/1 150/150/1 +f 142/142/1 143/143/1 152/152/1 151/151/1 +f 143/143/1 144/144/1 153/153/1 152/152/1 +f 145/145/1 146/146/1 155/155/1 154/154/1 +f 146/146/1 147/147/1 156/156/1 155/155/1 +f 147/147/1 148/148/1 157/157/1 156/156/1 +f 148/148/1 149/149/1 158/158/1 157/157/1 +f 149/149/1 150/150/1 159/159/1 158/158/1 +f 150/150/1 151/151/1 160/160/1 159/159/1 +f 151/151/1 152/152/1 161/161/1 160/160/1 +f 152/152/1 153/153/1 162/162/1 161/161/1 +f 154/154/1 155/155/1 164/164/1 163/163/1 +f 155/155/1 156/156/1 165/165/1 164/164/1 +f 156/156/1 157/157/1 166/166/1 165/165/1 +f 157/157/1 158/158/1 167/167/1 166/166/1 +f 158/158/1 159/159/1 168/168/1 167/167/1 +f 159/159/1 160/160/1 169/169/1 168/168/1 +f 160/160/1 161/161/1 170/170/1 169/169/1 +f 161/161/1 162/162/1 171/171/1 170/170/1 +f 163/163/1 164/164/1 173/173/1 172/172/1 +f 164/164/1 165/165/1 174/174/1 173/173/1 +f 165/165/1 166/166/1 175/175/1 174/174/1 +f 166/166/1 167/167/1 176/176/1 175/175/1 +f 167/167/1 168/168/1 177/177/1 176/176/1 +f 168/168/1 169/169/1 178/178/1 177/177/1 +f 169/169/1 170/170/1 179/179/1 178/178/1 +f 170/170/1 171/171/1 180/180/1 179/179/1 +f 172/172/1 173/173/1 182/182/1 181/181/1 +f 173/173/1 174/174/1 183/183/1 182/182/1 +f 174/174/1 175/175/1 184/184/1 183/183/1 +f 175/175/1 176/176/1 185/185/1 184/184/1 +f 176/176/1 177/177/1 186/186/1 185/185/1 +f 177/177/1 178/178/1 187/187/1 186/186/1 +f 178/178/1 179/179/1 188/188/1 187/187/1 +f 179/179/1 180/180/1 189/189/1 188/188/1 +f 181/181/1 182/182/1 191/191/1 190/190/1 +f 182/182/1 183/183/1 192/192/1 191/191/1 +f 183/183/1 184/184/1 193/193/1 192/192/1 +f 184/184/1 185/185/1 194/194/1 193/193/1 +f 185/185/1 186/186/1 195/195/1 194/194/1 +f 186/186/1 187/187/1 196/196/1 195/195/1 +f 187/187/1 188/188/1 197/197/1 196/196/1 +f 188/188/1 189/189/1 198/198/1 197/197/1 +f 190/190/1 191/191/1 200/200/1 199/199/1 +f 191/191/1 192/192/1 201/201/1 200/200/1 +f 192/192/1 193/193/1 202/202/1 201/201/1 +f 193/193/1 194/194/1 203/203/1 202/202/1 +f 194/194/1 195/195/1 204/204/1 203/203/1 +f 195/195/1 196/196/1 205/205/1 204/204/1 +f 196/196/1 197/197/1 206/206/1 205/205/1 +f 197/197/1 198/198/1 207/207/1 206/206/1 +f 199/199/1 200/200/1 209/209/1 208/208/1 +f 200/200/1 201/201/1 210/210/1 209/209/1 +f 201/201/1 202/202/1 211/211/1 210/210/1 +f 202/202/1 203/203/1 212/212/1 211/211/1 +f 203/203/1 204/204/1 213/213/1 212/212/1 +f 204/204/1 205/205/1 214/214/1 213/213/1 +f 205/205/1 206/206/1 215/215/1 214/214/1 +f 206/206/1 207/207/1 216/216/1 215/215/1 +f 208/208/1 209/209/1 218/218/1 217/217/1 +f 209/209/1 210/210/1 219/219/1 218/218/1 +f 210/210/1 211/211/1 220/220/1 219/219/1 +f 211/211/1 212/212/1 221/221/1 220/220/1 +f 212/212/1 213/213/1 222/222/1 221/221/1 +f 213/213/1 214/214/1 223/223/1 222/222/1 +f 214/214/1 215/215/1 224/224/1 223/223/1 +f 215/215/1 216/216/1 225/225/1 224/224/1 +f 217/217/1 218/218/1 227/227/1 226/226/1 +f 218/218/1 219/219/1 228/228/1 227/227/1 +f 219/219/1 220/220/1 229/229/1 228/228/1 +f 220/220/1 221/221/1 230/230/1 229/229/1 +f 221/221/1 222/222/1 231/231/1 230/230/1 +f 222/222/1 223/223/1 232/232/1 231/231/1 +f 223/223/1 224/224/1 233/233/1 232/232/1 +f 224/224/1 225/225/1 234/234/1 233/233/1 +f 226/226/1 227/227/1 236/236/1 235/235/1 +f 227/227/1 228/228/1 237/237/1 236/236/1 +f 228/228/1 229/229/1 238/238/1 237/237/1 +f 229/229/1 230/230/1 239/239/1 238/238/1 +f 230/230/1 231/231/1 240/240/1 239/239/1 +f 231/231/1 232/232/1 241/241/1 240/240/1 +f 232/232/1 233/233/1 242/242/1 241/241/1 +f 233/233/1 234/234/1 243/243/1 242/242/1 +f 235/235/1 236/236/1 245/245/1 244/244/1 +f 236/236/1 237/237/1 246/246/1 245/245/1 +f 237/237/1 238/238/1 247/247/1 246/246/1 +f 238/238/1 239/239/1 248/248/1 247/247/1 +f 239/239/1 240/240/1 249/249/1 248/248/1 +f 240/240/1 241/241/1 250/250/1 249/249/1 +f 241/241/1 242/242/1 251/251/1 250/250/1 +f 242/242/1 243/243/1 252/252/1 251/251/1 +f 244/244/1 245/245/1 254/254/1 253/253/1 +f 245/245/1 246/246/1 255/255/1 254/254/1 +f 246/246/1 247/247/1 256/256/1 255/255/1 +f 247/247/1 248/248/1 257/257/1 256/256/1 +f 248/248/1 249/249/1 258/258/1 257/257/1 +f 249/249/1 250/250/1 259/259/1 258/258/1 +f 250/250/1 251/251/1 260/260/1 259/259/1 +f 251/251/1 252/252/1 261/261/1 260/260/1 +f 253/253/1 254/254/1 263/263/1 262/262/1 +f 254/254/1 255/255/1 264/264/1 263/263/1 +f 255/255/1 256/256/1 265/265/1 264/264/1 +f 256/256/1 257/257/1 266/266/1 265/265/1 +f 257/257/1 258/258/1 267/267/1 266/266/1 +f 258/258/1 259/259/1 268/268/1 267/267/1 +f 259/259/1 260/260/1 269/269/1 268/268/1 +f 260/260/1 261/261/1 270/270/1 269/269/1 +f 262/262/1 263/263/1 272/272/1 271/271/1 +f 263/263/1 264/264/1 273/273/1 272/272/1 +f 264/264/1 265/265/1 274/274/1 273/273/1 +f 265/265/1 266/266/1 275/275/1 274/274/1 +f 266/266/1 267/267/1 276/276/1 275/275/1 +f 267/267/1 268/268/1 277/277/1 276/276/1 +f 268/268/1 269/269/1 278/278/1 277/277/1 +f 269/269/1 270/270/1 279/279/1 278/278/1 +f 271/271/1 272/272/1 281/281/1 280/280/1 +f 272/272/1 273/273/1 282/282/1 281/281/1 +f 273/273/1 274/274/1 283/283/1 282/282/1 +f 274/274/1 275/275/1 284/284/1 283/283/1 +f 275/275/1 276/276/1 285/285/1 284/284/1 +f 276/276/1 277/277/1 286/286/1 285/285/1 +f 277/277/1 278/278/1 287/287/1 286/286/1 +f 278/278/1 279/279/1 288/288/1 287/287/1 +f 280/280/1 281/281/1 290/290/1 289/289/1 +f 281/281/1 282/282/1 291/291/1 290/290/1 +f 282/282/1 283/283/1 292/292/1 291/291/1 +f 283/283/1 284/284/1 293/293/1 292/292/1 +f 284/284/1 285/285/1 294/294/1 293/293/1 +f 285/285/1 286/286/1 295/295/1 294/294/1 +f 286/286/1 287/287/1 296/296/1 295/295/1 +f 287/287/1 288/288/1 297/297/1 296/296/1 +f 289/289/1 290/290/1 299/299/1 298/298/1 +f 290/290/1 291/291/1 300/300/1 299/299/1 +f 291/291/1 292/292/1 301/301/1 300/300/1 +f 292/292/1 293/293/1 302/302/1 301/301/1 +f 293/293/1 294/294/1 303/303/1 302/302/1 +f 294/294/1 295/295/1 304/304/1 303/303/1 +f 295/295/1 296/296/1 305/305/1 304/304/1 +f 296/296/1 297/297/1 306/306/1 305/305/1 +f 298/298/1 299/299/1 308/308/1 307/307/1 +f 299/299/1 300/300/1 309/309/1 308/308/1 +f 300/300/1 301/301/1 310/310/1 309/309/1 +f 301/301/1 302/302/1 311/311/1 310/310/1 +f 302/302/1 303/303/1 312/312/1 311/311/1 +f 303/303/1 304/304/1 313/313/1 312/312/1 +f 304/304/1 305/305/1 314/314/1 313/313/1 +f 305/305/1 306/306/1 315/315/1 314/314/1 +f 307/307/1 308/308/1 317/317/1 316/316/1 +f 308/308/1 309/309/1 318/318/1 317/317/1 +f 309/309/1 310/310/1 319/319/1 318/318/1 +f 310/310/1 311/311/1 320/320/1 319/319/1 +f 311/311/1 312/312/1 321/321/1 320/320/1 +f 312/312/1 313/313/1 322/322/1 321/321/1 +f 313/313/1 314/314/1 323/323/1 322/322/1 +f 314/314/1 315/315/1 324/324/1 323/323/1 +f 316/316/1 317/317/1 326/326/1 325/325/1 +f 317/317/1 318/318/1 327/327/1 326/326/1 +f 318/318/1 319/319/1 328/328/1 327/327/1 +f 319/319/1 320/320/1 329/329/1 328/328/1 +f 320/320/1 321/321/1 330/330/1 329/329/1 +f 321/321/1 322/322/1 331/331/1 330/330/1 +f 322/322/1 323/323/1 332/332/1 331/331/1 +f 323/323/1 324/324/1 333/333/1 332/332/1 +f 325/325/1 326/326/1 335/335/1 334/334/1 +f 326/326/1 327/327/1 336/336/1 335/335/1 +f 327/327/1 328/328/1 337/337/1 336/336/1 +f 328/328/1 329/329/1 338/338/1 337/337/1 +f 329/329/1 330/330/1 339/339/1 338/338/1 +f 330/330/1 331/331/1 340/340/1 339/339/1 +f 331/331/1 332/332/1 341/341/1 340/340/1 +f 332/332/1 333/333/1 342/342/1 341/341/1 +f 334/334/1 335/335/1 344/344/1 343/343/1 +f 335/335/1 336/336/1 345/345/1 344/344/1 +f 336/336/1 337/337/1 346/346/1 345/345/1 +f 337/337/1 338/338/1 347/347/1 346/346/1 +f 338/338/1 339/339/1 348/348/1 347/347/1 +f 339/339/1 340/340/1 349/349/1 348/348/1 +f 340/340/1 341/341/1 350/350/1 349/349/1 +f 341/341/1 342/342/1 351/351/1 350/350/1 +f 343/343/1 344/344/1 353/353/1 352/352/1 +f 344/344/1 345/345/1 354/354/1 353/353/1 +f 345/345/1 346/346/1 355/355/1 354/354/1 +f 346/346/1 347/347/1 356/356/1 355/355/1 +f 347/347/1 348/348/1 357/357/1 356/356/1 +f 348/348/1 349/349/1 358/358/1 357/357/1 +f 349/349/1 350/350/1 359/359/1 358/358/1 +f 350/350/1 351/351/1 360/360/1 359/359/1 +f 352/352/1 353/353/1 362/362/1 361/361/1 +f 353/353/1 354/354/1 363/363/1 362/362/1 +f 354/354/1 355/355/1 364/364/1 363/363/1 +f 355/355/1 356/356/1 365/365/1 364/364/1 +f 356/356/1 357/357/1 366/366/1 365/365/1 +f 357/357/1 358/358/1 367/367/1 366/366/1 +f 358/358/1 359/359/1 368/368/1 367/367/1 +f 359/359/1 360/360/1 369/369/1 368/368/1 +f 361/361/1 362/362/1 371/371/1 370/370/1 +f 362/362/1 363/363/1 372/372/1 371/371/1 +f 363/363/1 364/364/1 373/373/1 372/372/1 +f 364/364/1 365/365/1 374/374/1 373/373/1 +f 365/365/1 366/366/1 375/375/1 374/374/1 +f 366/366/1 367/367/1 376/376/1 375/375/1 +f 367/367/1 368/368/1 377/377/1 376/376/1 +f 368/368/1 369/369/1 378/378/1 377/377/1 +f 370/370/1 371/371/1 380/380/1 379/379/1 +f 371/371/1 372/372/1 381/381/1 380/380/1 +f 372/372/1 373/373/1 382/382/1 381/381/1 +f 373/373/1 374/374/1 383/383/1 382/382/1 +f 374/374/1 375/375/1 384/384/1 383/383/1 +f 375/375/1 376/376/1 385/385/1 384/384/1 +f 376/376/1 377/377/1 386/386/1 385/385/1 +f 377/377/1 378/378/1 387/387/1 386/386/1 +f 379/379/1 380/380/1 389/389/1 388/388/1 +f 380/380/1 381/381/1 390/390/1 389/389/1 +f 381/381/1 382/382/1 391/391/1 390/390/1 +f 382/382/1 383/383/1 392/392/1 391/391/1 +f 383/383/1 384/384/1 393/393/1 392/392/1 +f 384/384/1 385/385/1 394/394/1 393/393/1 +f 385/385/1 386/386/1 395/395/1 394/394/1 +f 386/386/1 387/387/1 396/396/1 395/395/1 +f 388/388/1 389/389/1 398/398/1 397/397/1 +f 389/389/1 390/390/1 399/399/1 398/398/1 +f 390/390/1 391/391/1 400/400/1 399/399/1 +f 391/391/1 392/392/1 401/401/1 400/400/1 +f 392/392/1 393/393/1 402/402/1 401/401/1 +f 393/393/1 394/394/1 403/403/1 402/402/1 +f 394/394/1 395/395/1 404/404/1 403/403/1 +f 395/395/1 396/396/1 405/405/1 404/404/1 +f 397/397/1 398/398/1 407/407/1 406/406/1 +f 398/398/1 399/399/1 408/408/1 407/407/1 +f 399/399/1 400/400/1 409/409/1 408/408/1 +f 400/400/1 401/401/1 410/410/1 409/409/1 +f 401/401/1 402/402/1 411/411/1 410/410/1 +f 402/402/1 403/403/1 412/412/1 411/411/1 +f 403/403/1 404/404/1 413/413/1 412/412/1 +f 404/404/1 405/405/1 414/414/1 413/413/1 +f 406/406/1 407/407/1 416/416/1 415/415/1 +f 407/407/1 408/408/1 417/417/1 416/416/1 +f 408/408/1 409/409/1 418/418/1 417/417/1 +f 409/409/1 410/410/1 419/419/1 418/418/1 +f 410/410/1 411/411/1 420/420/1 419/419/1 +f 411/411/1 412/412/1 421/421/1 420/420/1 +f 412/412/1 413/413/1 422/422/1 421/421/1 +f 413/413/1 414/414/1 423/423/1 422/422/1 +f 415/415/1 416/416/1 425/425/1 424/424/1 +f 416/416/1 417/417/1 426/426/1 425/425/1 +f 417/417/1 418/418/1 427/427/1 426/426/1 +f 418/418/1 419/419/1 428/428/1 427/427/1 +f 419/419/1 420/420/1 429/429/1 428/428/1 +f 420/420/1 421/421/1 430/430/1 429/429/1 +f 421/421/1 422/422/1 431/431/1 430/430/1 +f 422/422/1 423/423/1 432/432/1 431/431/1 +f 424/424/1 425/425/1 434/434/1 433/433/1 +f 425/425/1 426/426/1 435/435/1 434/434/1 +f 426/426/1 427/427/1 436/436/1 435/435/1 +f 427/427/1 428/428/1 437/437/1 436/436/1 +f 428/428/1 429/429/1 438/438/1 437/437/1 +f 429/429/1 430/430/1 439/439/1 438/438/1 +f 430/430/1 431/431/1 440/440/1 439/439/1 +f 431/431/1 432/432/1 441/441/1 440/440/1 +f 433/433/1 434/434/1 443/443/1 442/442/1 +f 434/434/1 435/435/1 444/444/1 443/443/1 +f 435/435/1 436/436/1 445/445/1 444/444/1 +f 436/436/1 437/437/1 446/446/1 445/445/1 +f 437/437/1 438/438/1 447/447/1 446/446/1 +f 438/438/1 439/439/1 448/448/1 447/447/1 +f 439/439/1 440/440/1 449/449/1 448/448/1 +f 440/440/1 441/441/1 450/450/1 449/449/1 +f 442/442/1 443/443/1 452/452/1 451/451/1 +f 443/443/1 444/444/1 453/453/1 452/452/1 +f 444/444/1 445/445/1 454/454/1 453/453/1 +f 445/445/1 446/446/1 455/455/1 454/454/1 +f 446/446/1 447/447/1 456/456/1 455/455/1 +f 447/447/1 448/448/1 457/457/1 456/456/1 +f 448/448/1 449/449/1 458/458/1 457/457/1 +f 449/449/1 450/450/1 459/459/1 458/458/1 +f 451/451/1 452/452/1 461/461/1 460/460/1 +f 452/452/1 453/453/1 462/462/1 461/461/1 +f 453/453/1 454/454/1 463/463/1 462/462/1 +f 454/454/1 455/455/1 464/464/1 463/463/1 +f 455/455/1 456/456/1 465/465/1 464/464/1 +f 456/456/1 457/457/1 466/466/1 465/465/1 +f 457/457/1 458/458/1 467/467/1 466/466/1 +f 458/458/1 459/459/1 468/468/1 467/467/1 +f 460/460/1 461/461/1 470/470/1 469/469/1 +f 461/461/1 462/462/1 471/471/1 470/470/1 +f 462/462/1 463/463/1 472/472/1 471/471/1 +f 463/463/1 464/464/1 473/473/1 472/472/1 +f 464/464/1 465/465/1 474/474/1 473/473/1 +f 465/465/1 466/466/1 475/475/1 474/474/1 +f 466/466/1 467/467/1 476/476/1 475/475/1 +f 467/467/1 468/468/1 477/477/1 476/476/1 +f 469/469/1 470/470/1 479/479/1 478/478/1 +f 470/470/1 471/471/1 480/480/1 479/479/1 +f 471/471/1 472/472/1 481/481/1 480/480/1 +f 472/472/1 473/473/1 482/482/1 481/481/1 +f 473/473/1 474/474/1 483/483/1 482/482/1 +f 474/474/1 475/475/1 484/484/1 483/483/1 +f 475/475/1 476/476/1 485/485/1 484/484/1 +f 476/476/1 477/477/1 486/486/1 485/485/1 +f 478/478/1 479/479/1 488/488/1 487/487/1 +f 479/479/1 480/480/1 489/489/1 488/488/1 +f 480/480/1 481/481/1 490/490/1 489/489/1 +f 481/481/1 482/482/1 491/491/1 490/490/1 +f 482/482/1 483/483/1 492/492/1 491/491/1 +f 483/483/1 484/484/1 493/493/1 492/492/1 +f 484/484/1 485/485/1 494/494/1 493/493/1 +f 485/485/1 486/486/1 495/495/1 494/494/1 +f 487/487/1 488/488/1 497/497/1 496/496/1 +f 488/488/1 489/489/1 498/498/1 497/497/1 +f 489/489/1 490/490/1 499/499/1 498/498/1 +f 490/490/1 491/491/1 500/500/1 499/499/1 +f 491/491/1 492/492/1 501/501/1 500/500/1 +f 492/492/1 493/493/1 502/502/1 501/501/1 +f 493/493/1 494/494/1 503/503/1 502/502/1 +f 494/494/1 495/495/1 504/504/1 503/503/1 +f 496/496/1 497/497/1 506/506/1 505/505/1 +f 497/497/1 498/498/1 507/507/1 506/506/1 +f 498/498/1 499/499/1 508/508/1 507/507/1 +f 499/499/1 500/500/1 509/509/1 508/508/1 +f 500/500/1 501/501/1 510/510/1 509/509/1 +f 501/501/1 502/502/1 511/511/1 510/510/1 +f 502/502/1 503/503/1 512/512/1 511/511/1 +f 503/503/1 504/504/1 513/513/1 512/512/1 +f 505/505/1 506/506/1 515/515/1 514/514/1 +f 506/506/1 507/507/1 516/516/1 515/515/1 +f 507/507/1 508/508/1 517/517/1 516/516/1 +f 508/508/1 509/509/1 518/518/1 517/517/1 +f 509/509/1 510/510/1 519/519/1 518/518/1 +f 510/510/1 511/511/1 520/520/1 519/519/1 +f 511/511/1 512/512/1 521/521/1 520/520/1 +f 512/512/1 513/513/1 522/522/1 521/521/1 +f 514/514/1 515/515/1 524/524/1 523/523/1 +f 515/515/1 516/516/1 525/525/1 524/524/1 +f 516/516/1 517/517/1 526/526/1 525/525/1 +f 517/517/1 518/518/1 527/527/1 526/526/1 +f 518/518/1 519/519/1 528/528/1 527/527/1 +f 519/519/1 520/520/1 529/529/1 528/528/1 +f 520/520/1 521/521/1 530/530/1 529/529/1 +f 521/521/1 522/522/1 531/531/1 530/530/1 +f 523/523/1 524/524/1 533/533/1 532/532/1 +f 524/524/1 525/525/1 534/534/1 533/533/1 +f 525/525/1 526/526/1 535/535/1 534/534/1 +f 526/526/1 527/527/1 536/536/1 535/535/1 +f 527/527/1 528/528/1 537/537/1 536/536/1 +f 528/528/1 529/529/1 538/538/1 537/537/1 +f 529/529/1 530/530/1 539/539/1 538/538/1 +f 530/530/1 531/531/1 540/540/1 539/539/1 +f 532/532/1 533/533/1 542/542/1 541/541/1 +f 533/533/1 534/534/1 543/543/1 542/542/1 +f 534/534/1 535/535/1 544/544/1 543/543/1 +f 535/535/1 536/536/1 545/545/1 544/544/1 +f 536/536/1 537/537/1 546/546/1 545/545/1 +f 537/537/1 538/538/1 547/547/1 546/546/1 +f 538/538/1 539/539/1 548/548/1 547/547/1 +f 539/539/1 540/540/1 549/549/1 548/548/1 +f 541/541/1 542/542/1 551/551/1 550/550/1 +f 542/542/1 543/543/1 552/552/1 551/551/1 +f 543/543/1 544/544/1 553/553/1 552/552/1 +f 544/544/1 545/545/1 554/554/1 553/553/1 +f 545/545/1 546/546/1 555/555/1 554/554/1 +f 546/546/1 547/547/1 556/556/1 555/555/1 +f 547/547/1 548/548/1 557/557/1 556/556/1 +f 548/548/1 549/549/1 558/558/1 557/557/1 +f 550/550/1 551/551/1 560/560/1 559/559/1 +f 551/551/1 552/552/1 561/561/1 560/560/1 +f 552/552/1 553/553/1 562/562/1 561/561/1 +f 553/553/1 554/554/1 563/563/1 562/562/1 +f 554/554/1 555/555/1 564/564/1 563/563/1 +f 555/555/1 556/556/1 565/565/1 564/564/1 +f 556/556/1 557/557/1 566/566/1 565/565/1 +f 557/557/1 558/558/1 567/567/1 566/566/1 +f 559/559/1 560/560/1 569/569/1 568/568/1 +f 560/560/1 561/561/1 570/570/1 569/569/1 +f 561/561/1 562/562/1 571/571/1 570/570/1 +f 562/562/1 563/563/1 572/572/1 571/571/1 +f 563/563/1 564/564/1 573/573/1 572/572/1 +f 564/564/1 565/565/1 574/574/1 573/573/1 +f 565/565/1 566/566/1 575/575/1 574/574/1 +f 566/566/1 567/567/1 576/576/1 575/575/1 +f 568/568/1 569/569/1 578/578/1 577/577/1 +f 569/569/1 570/570/1 579/579/1 578/578/1 +f 570/570/1 571/571/1 580/580/1 579/579/1 +f 571/571/1 572/572/1 581/581/1 580/580/1 +f 572/572/1 573/573/1 582/582/1 581/581/1 +f 573/573/1 574/574/1 583/583/1 582/582/1 +f 574/574/1 575/575/1 584/584/1 583/583/1 +f 575/575/1 576/576/1 585/585/1 584/584/1 +f 586/586/2 587/587/2 596/596/2 595/595/2 +f 587/587/2 588/588/2 597/597/2 596/596/2 +f 588/588/2 589/589/2 598/598/2 597/597/2 +f 589/589/2 590/590/2 599/599/2 598/598/2 +f 590/590/2 591/591/2 600/600/2 599/599/2 +f 591/591/2 592/592/2 601/601/2 600/600/2 +f 592/592/2 593/593/2 602/602/2 601/601/2 +f 593/593/2 594/594/2 603/603/2 602/602/2 +f 595/595/2 596/596/2 605/605/2 604/604/2 +f 596/596/2 597/597/2 606/606/2 605/605/2 +f 597/597/2 598/598/2 607/607/2 606/606/2 +f 598/598/2 599/599/2 608/608/2 607/607/2 +f 599/599/2 600/600/2 609/609/2 608/608/2 +f 600/600/2 601/601/2 610/610/2 609/609/2 +f 601/601/2 602/602/2 611/611/2 610/610/2 +f 602/602/2 603/603/2 612/612/2 611/611/2 +f 604/604/2 605/605/2 614/614/2 613/613/2 +f 605/605/2 606/606/2 615/615/2 614/614/2 +f 606/606/2 607/607/2 616/616/2 615/615/2 +f 607/607/2 608/608/2 617/617/2 616/616/2 +f 608/608/2 609/609/2 618/618/2 617/617/2 +f 609/609/2 610/610/2 619/619/2 618/618/2 +f 610/610/2 611/611/2 620/620/2 619/619/2 +f 611/611/2 612/612/2 621/621/2 620/620/2 +f 613/613/2 614/614/2 623/623/2 622/622/2 +f 614/614/2 615/615/2 624/624/2 623/623/2 +f 615/615/2 616/616/2 625/625/2 624/624/2 +f 616/616/2 617/617/2 626/626/2 625/625/2 +f 617/617/2 618/618/2 627/627/2 626/626/2 +f 618/618/2 619/619/2 628/628/2 627/627/2 +f 619/619/2 620/620/2 629/629/2 628/628/2 +f 620/620/2 621/621/2 630/630/2 629/629/2 +f 622/622/2 623/623/2 632/632/2 631/631/2 +f 623/623/2 624/624/2 633/633/2 632/632/2 +f 624/624/2 625/625/2 634/634/2 633/633/2 +f 625/625/2 626/626/2 635/635/2 634/634/2 +f 626/626/2 627/627/2 636/636/2 635/635/2 +f 627/627/2 628/628/2 637/637/2 636/636/2 +f 628/628/2 629/629/2 638/638/2 637/637/2 +f 629/629/2 630/630/2 639/639/2 638/638/2 +f 631/631/2 632/632/2 641/641/2 640/640/2 +f 632/632/2 633/633/2 642/642/2 641/641/2 +f 633/633/2 634/634/2 643/643/2 642/642/2 +f 634/634/2 635/635/2 644/644/2 643/643/2 +f 635/635/2 636/636/2 645/645/2 644/644/2 +f 636/636/2 637/637/2 646/646/2 645/645/2 +f 637/637/2 638/638/2 647/647/2 646/646/2 +f 638/638/2 639/639/2 648/648/2 647/647/2 +f 640/640/2 641/641/2 650/650/2 649/649/2 +f 641/641/2 642/642/2 651/651/2 650/650/2 +f 642/642/2 643/643/2 652/652/2 651/651/2 +f 643/643/2 644/644/2 653/653/2 652/652/2 +f 644/644/2 645/645/2 654/654/2 653/653/2 +f 645/645/2 646/646/2 655/655/2 654/654/2 +f 646/646/2 647/647/2 656/656/2 655/655/2 +f 647/647/2 648/648/2 657/657/2 656/656/2 +f 649/649/2 650/650/2 659/659/2 658/658/2 +f 650/650/2 651/651/2 660/660/2 659/659/2 +f 651/651/2 652/652/2 661/661/2 660/660/2 +f 652/652/2 653/653/2 662/662/2 661/661/2 +f 653/653/2 654/654/2 663/663/2 662/662/2 +f 654/654/2 655/655/2 664/664/2 663/663/2 +f 655/655/2 656/656/2 665/665/2 664/664/2 +f 656/656/2 657/657/2 666/666/2 665/665/2 +f 658/658/2 659/659/2 668/668/2 667/667/2 +f 659/659/2 660/660/2 669/669/2 668/668/2 +f 660/660/2 661/661/2 670/670/2 669/669/2 +f 661/661/2 662/662/2 671/671/2 670/670/2 +f 662/662/2 663/663/2 672/672/2 671/671/2 +f 663/663/2 664/664/2 673/673/2 672/672/2 +f 664/664/2 665/665/2 674/674/2 673/673/2 +f 665/665/2 666/666/2 675/675/2 674/674/2 +f 667/667/2 668/668/2 677/677/2 676/676/2 +f 668/668/2 669/669/2 678/678/2 677/677/2 +f 669/669/2 670/670/2 679/679/2 678/678/2 +f 670/670/2 671/671/2 680/680/2 679/679/2 +f 671/671/2 672/672/2 681/681/2 680/680/2 +f 672/672/2 673/673/2 682/682/2 681/681/2 +f 673/673/2 674/674/2 683/683/2 682/682/2 +f 674/674/2 675/675/2 684/684/2 683/683/2 +f 676/676/2 677/677/2 686/686/2 685/685/2 +f 677/677/2 678/678/2 687/687/2 686/686/2 +f 678/678/2 679/679/2 688/688/2 687/687/2 +f 679/679/2 680/680/2 689/689/2 688/688/2 +f 680/680/2 681/681/2 690/690/2 689/689/2 +f 681/681/2 682/682/2 691/691/2 690/690/2 +f 682/682/2 683/683/2 692/692/2 691/691/2 +f 683/683/2 684/684/2 693/693/2 692/692/2 +f 685/685/2 686/686/2 695/695/2 694/694/2 +f 686/686/2 687/687/2 696/696/2 695/695/2 +f 687/687/2 688/688/2 697/697/2 696/696/2 +f 688/688/2 689/689/2 698/698/2 697/697/2 +f 689/689/2 690/690/2 699/699/2 698/698/2 +f 690/690/2 691/691/2 700/700/2 699/699/2 +f 691/691/2 692/692/2 701/701/2 700/700/2 +f 692/692/2 693/693/2 702/702/2 701/701/2 +f 694/694/2 695/695/2 704/704/2 703/703/2 +f 695/695/2 696/696/2 705/705/2 704/704/2 +f 696/696/2 697/697/2 706/706/2 705/705/2 +f 697/697/2 698/698/2 707/707/2 706/706/2 +f 698/698/2 699/699/2 708/708/2 707/707/2 +f 699/699/2 700/700/2 709/709/2 708/708/2 +f 700/700/2 701/701/2 710/710/2 709/709/2 +f 701/701/2 702/702/2 711/711/2 710/710/2 +f 703/703/2 704/704/2 713/713/2 712/712/2 +f 704/704/2 705/705/2 714/714/2 713/713/2 +f 705/705/2 706/706/2 715/715/2 714/714/2 +f 706/706/2 707/707/2 716/716/2 715/715/2 +f 707/707/2 708/708/2 717/717/2 716/716/2 +f 708/708/2 709/709/2 718/718/2 717/717/2 +f 709/709/2 710/710/2 719/719/2 718/718/2 +f 710/710/2 711/711/2 720/720/2 719/719/2 +f 712/712/2 713/713/2 722/722/2 721/721/2 +f 713/713/2 714/714/2 723/723/2 722/722/2 +f 714/714/2 715/715/2 724/724/2 723/723/2 +f 715/715/2 716/716/2 725/725/2 724/724/2 +f 716/716/2 717/717/2 726/726/2 725/725/2 +f 717/717/2 718/718/2 727/727/2 726/726/2 +f 718/718/2 719/719/2 728/728/2 727/727/2 +f 719/719/2 720/720/2 729/729/2 728/728/2 +f 721/721/2 722/722/2 731/731/2 730/730/2 +f 722/722/2 723/723/2 732/732/2 731/731/2 +f 723/723/2 724/724/2 733/733/2 732/732/2 +f 724/724/2 725/725/2 734/734/2 733/733/2 +f 725/725/2 726/726/2 735/735/2 734/734/2 +f 726/726/2 727/727/2 736/736/2 735/735/2 +f 727/727/2 728/728/2 737/737/2 736/736/2 +f 728/728/2 729/729/2 738/738/2 737/737/2 +f 730/730/2 731/731/2 740/740/2 739/739/2 +f 731/731/2 732/732/2 741/741/2 740/740/2 +f 732/732/2 733/733/2 742/742/2 741/741/2 +f 733/733/2 734/734/2 743/743/2 742/742/2 +f 734/734/2 735/735/2 744/744/2 743/743/2 +f 735/735/2 736/736/2 745/745/2 744/744/2 +f 736/736/2 737/737/2 746/746/2 745/745/2 +f 737/737/2 738/738/2 747/747/2 746/746/2 +f 739/739/2 740/740/2 749/749/2 748/748/2 +f 740/740/2 741/741/2 750/750/2 749/749/2 +f 741/741/2 742/742/2 751/751/2 750/750/2 +f 742/742/2 743/743/2 752/752/2 751/751/2 +f 743/743/2 744/744/2 753/753/2 752/752/2 +f 744/744/2 745/745/2 754/754/2 753/753/2 +f 745/745/2 746/746/2 755/755/2 754/754/2 +f 746/746/2 747/747/2 756/756/2 755/755/2 +f 748/748/2 749/749/2 758/758/2 757/757/2 +f 749/749/2 750/750/2 759/759/2 758/758/2 +f 750/750/2 751/751/2 760/760/2 759/759/2 +f 751/751/2 752/752/2 761/761/2 760/760/2 +f 752/752/2 753/753/2 762/762/2 761/761/2 +f 753/753/2 754/754/2 763/763/2 762/762/2 +f 754/754/2 755/755/2 764/764/2 763/763/2 +f 755/755/2 756/756/2 765/765/2 764/764/2 +f 757/757/2 758/758/2 767/767/2 766/766/2 +f 758/758/2 759/759/2 768/768/2 767/767/2 +f 759/759/2 760/760/2 769/769/2 768/768/2 +f 760/760/2 761/761/2 770/770/2 769/769/2 +f 761/761/2 762/762/2 771/771/2 770/770/2 +f 762/762/2 763/763/2 772/772/2 771/771/2 +f 763/763/2 764/764/2 773/773/2 772/772/2 +f 764/764/2 765/765/2 774/774/2 773/773/2 +f 766/766/2 767/767/2 776/776/2 775/775/2 +f 767/767/2 768/768/2 777/777/2 776/776/2 +f 768/768/2 769/769/2 778/778/2 777/777/2 +f 769/769/2 770/770/2 779/779/2 778/778/2 +f 770/770/2 771/771/2 780/780/2 779/779/2 +f 771/771/2 772/772/2 781/781/2 780/780/2 +f 772/772/2 773/773/2 782/782/2 781/781/2 +f 773/773/2 774/774/2 783/783/2 782/782/2 +f 775/775/2 776/776/2 785/785/2 784/784/2 +f 776/776/2 777/777/2 786/786/2 785/785/2 +f 777/777/2 778/778/2 787/787/2 786/786/2 +f 778/778/2 779/779/2 788/788/2 787/787/2 +f 779/779/2 780/780/2 789/789/2 788/788/2 +f 780/780/2 781/781/2 790/790/2 789/789/2 +f 781/781/2 782/782/2 791/791/2 790/790/2 +f 782/782/2 783/783/2 792/792/2 791/791/2 +f 784/784/2 785/785/2 794/794/2 793/793/2 +f 785/785/2 786/786/2 795/795/2 794/794/2 +f 786/786/2 787/787/2 796/796/2 795/795/2 +f 787/787/2 788/788/2 797/797/2 796/796/2 +f 788/788/2 789/789/2 798/798/2 797/797/2 +f 789/789/2 790/790/2 799/799/2 798/798/2 +f 790/790/2 791/791/2 800/800/2 799/799/2 +f 791/791/2 792/792/2 801/801/2 800/800/2 +f 793/793/2 794/794/2 803/803/2 802/802/2 +f 794/794/2 795/795/2 804/804/2 803/803/2 +f 795/795/2 796/796/2 805/805/2 804/804/2 +f 796/796/2 797/797/2 806/806/2 805/805/2 +f 797/797/2 798/798/2 807/807/2 806/806/2 +f 798/798/2 799/799/2 808/808/2 807/807/2 +f 799/799/2 800/800/2 809/809/2 808/808/2 +f 800/800/2 801/801/2 810/810/2 809/809/2 +f 802/802/2 803/803/2 812/812/2 811/811/2 +f 803/803/2 804/804/2 813/813/2 812/812/2 +f 804/804/2 805/805/2 814/814/2 813/813/2 +f 805/805/2 806/806/2 815/815/2 814/814/2 +f 806/806/2 807/807/2 816/816/2 815/815/2 +f 807/807/2 808/808/2 817/817/2 816/816/2 +f 808/808/2 809/809/2 818/818/2 817/817/2 +f 809/809/2 810/810/2 819/819/2 818/818/2 +f 811/811/2 812/812/2 821/821/2 820/820/2 +f 812/812/2 813/813/2 822/822/2 821/821/2 +f 813/813/2 814/814/2 823/823/2 822/822/2 +f 814/814/2 815/815/2 824/824/2 823/823/2 +f 815/815/2 816/816/2 825/825/2 824/824/2 +f 816/816/2 817/817/2 826/826/2 825/825/2 +f 817/817/2 818/818/2 827/827/2 826/826/2 +f 818/818/2 819/819/2 828/828/2 827/827/2 +f 820/820/2 821/821/2 830/830/2 829/829/2 +f 821/821/2 822/822/2 831/831/2 830/830/2 +f 822/822/2 823/823/2 832/832/2 831/831/2 +f 823/823/2 824/824/2 833/833/2 832/832/2 +f 824/824/2 825/825/2 834/834/2 833/833/2 +f 825/825/2 826/826/2 835/835/2 834/834/2 +f 826/826/2 827/827/2 836/836/2 835/835/2 +f 827/827/2 828/828/2 837/837/2 836/836/2 +f 829/829/2 830/830/2 839/839/2 838/838/2 +f 830/830/2 831/831/2 840/840/2 839/839/2 +f 831/831/2 832/832/2 841/841/2 840/840/2 +f 832/832/2 833/833/2 842/842/2 841/841/2 +f 833/833/2 834/834/2 843/843/2 842/842/2 +f 834/834/2 835/835/2 844/844/2 843/843/2 +f 835/835/2 836/836/2 845/845/2 844/844/2 +f 836/836/2 837/837/2 846/846/2 845/845/2 +f 838/838/2 839/839/2 848/848/2 847/847/2 +f 839/839/2 840/840/2 849/849/2 848/848/2 +f 840/840/2 841/841/2 850/850/2 849/849/2 +f 841/841/2 842/842/2 851/851/2 850/850/2 +f 842/842/2 843/843/2 852/852/2 851/851/2 +f 843/843/2 844/844/2 853/853/2 852/852/2 +f 844/844/2 845/845/2 854/854/2 853/853/2 +f 845/845/2 846/846/2 855/855/2 854/854/2 +f 847/847/2 848/848/2 857/857/2 856/856/2 +f 848/848/2 849/849/2 858/858/2 857/857/2 +f 849/849/2 850/850/2 859/859/2 858/858/2 +f 850/850/2 851/851/2 860/860/2 859/859/2 +f 851/851/2 852/852/2 861/861/2 860/860/2 +f 852/852/2 853/853/2 862/862/2 861/861/2 +f 853/853/2 854/854/2 863/863/2 862/862/2 +f 854/854/2 855/855/2 864/864/2 863/863/2 +f 856/856/2 857/857/2 866/866/2 865/865/2 +f 857/857/2 858/858/2 867/867/2 866/866/2 +f 858/858/2 859/859/2 868/868/2 867/867/2 +f 859/859/2 860/860/2 869/869/2 868/868/2 +f 860/860/2 861/861/2 870/870/2 869/869/2 +f 861/861/2 862/862/2 871/871/2 870/870/2 +f 862/862/2 863/863/2 872/872/2 871/871/2 +f 863/863/2 864/864/2 873/873/2 872/872/2 +f 865/865/2 866/866/2 875/875/2 874/874/2 +f 866/866/2 867/867/2 876/876/2 875/875/2 +f 867/867/2 868/868/2 877/877/2 876/876/2 +f 868/868/2 869/869/2 878/878/2 877/877/2 +f 869/869/2 870/870/2 879/879/2 878/878/2 +f 870/870/2 871/871/2 880/880/2 879/879/2 +f 871/871/2 872/872/2 881/881/2 880/880/2 +f 872/872/2 873/873/2 882/882/2 881/881/2 +f 874/874/2 875/875/2 884/884/2 883/883/2 +f 875/875/2 876/876/2 885/885/2 884/884/2 +f 876/876/2 877/877/2 886/886/2 885/885/2 +f 877/877/2 878/878/2 887/887/2 886/886/2 +f 878/878/2 879/879/2 888/888/2 887/887/2 +f 879/879/2 880/880/2 889/889/2 888/888/2 +f 880/880/2 881/881/2 890/890/2 889/889/2 +f 881/881/2 882/882/2 891/891/2 890/890/2 +f 883/883/2 884/884/2 893/893/2 892/892/2 +f 884/884/2 885/885/2 894/894/2 893/893/2 +f 885/885/2 886/886/2 895/895/2 894/894/2 +f 886/886/2 887/887/2 896/896/2 895/895/2 +f 887/887/2 888/888/2 897/897/2 896/896/2 +f 888/888/2 889/889/2 898/898/2 897/897/2 +f 889/889/2 890/890/2 899/899/2 898/898/2 +f 890/890/2 891/891/2 900/900/2 899/899/2 +f 892/892/2 893/893/2 902/902/2 901/901/2 +f 893/893/2 894/894/2 903/903/2 902/902/2 +f 894/894/2 895/895/2 904/904/2 903/903/2 +f 895/895/2 896/896/2 905/905/2 904/904/2 +f 896/896/2 897/897/2 906/906/2 905/905/2 +f 897/897/2 898/898/2 907/907/2 906/906/2 +f 898/898/2 899/899/2 908/908/2 907/907/2 +f 899/899/2 900/900/2 909/909/2 908/908/2 +f 901/901/2 902/902/2 911/911/2 910/910/2 +f 902/902/2 903/903/2 912/912/2 911/911/2 +f 903/903/2 904/904/2 913/913/2 912/912/2 +f 904/904/2 905/905/2 914/914/2 913/913/2 +f 905/905/2 906/906/2 915/915/2 914/914/2 +f 906/906/2 907/907/2 916/916/2 915/915/2 +f 907/907/2 908/908/2 917/917/2 916/916/2 +f 908/908/2 909/909/2 918/918/2 917/917/2 +f 910/910/2 911/911/2 920/920/2 919/919/2 +f 911/911/2 912/912/2 921/921/2 920/920/2 +f 912/912/2 913/913/2 922/922/2 921/921/2 +f 913/913/2 914/914/2 923/923/2 922/922/2 +f 914/914/2 915/915/2 924/924/2 923/923/2 +f 915/915/2 916/916/2 925/925/2 924/924/2 +f 916/916/2 917/917/2 926/926/2 925/925/2 +f 917/917/2 918/918/2 927/927/2 926/926/2 +f 919/919/2 920/920/2 929/929/2 928/928/2 +f 920/920/2 921/921/2 930/930/2 929/929/2 +f 921/921/2 922/922/2 931/931/2 930/930/2 +f 922/922/2 923/923/2 932/932/2 931/931/2 +f 923/923/2 924/924/2 933/933/2 932/932/2 +f 924/924/2 925/925/2 934/934/2 933/933/2 +f 925/925/2 926/926/2 935/935/2 934/934/2 +f 926/926/2 927/927/2 936/936/2 935/935/2 +f 928/928/2 929/929/2 938/938/2 937/937/2 +f 929/929/2 930/930/2 939/939/2 938/938/2 +f 930/930/2 931/931/2 940/940/2 939/939/2 +f 931/931/2 932/932/2 941/941/2 940/940/2 +f 932/932/2 933/933/2 942/942/2 941/941/2 +f 933/933/2 934/934/2 943/943/2 942/942/2 +f 934/934/2 935/935/2 944/944/2 943/943/2 +f 935/935/2 936/936/2 945/945/2 944/944/2 +f 937/937/2 938/938/2 947/947/2 946/946/2 +f 938/938/2 939/939/2 948/948/2 947/947/2 +f 939/939/2 940/940/2 949/949/2 948/948/2 +f 940/940/2 941/941/2 950/950/2 949/949/2 +f 941/941/2 942/942/2 951/951/2 950/950/2 +f 942/942/2 943/943/2 952/952/2 951/951/2 +f 943/943/2 944/944/2 953/953/2 952/952/2 +f 944/944/2 945/945/2 954/954/2 953/953/2 +f 946/946/2 947/947/2 956/956/2 955/955/2 +f 947/947/2 948/948/2 957/957/2 956/956/2 +f 948/948/2 949/949/2 958/958/2 957/957/2 +f 949/949/2 950/950/2 959/959/2 958/958/2 +f 950/950/2 951/951/2 960/960/2 959/959/2 +f 951/951/2 952/952/2 961/961/2 960/960/2 +f 952/952/2 953/953/2 962/962/2 961/961/2 +f 953/953/2 954/954/2 963/963/2 962/962/2 +f 955/955/2 956/956/2 965/965/2 964/964/2 +f 956/956/2 957/957/2 966/966/2 965/965/2 +f 957/957/2 958/958/2 967/967/2 966/966/2 +f 958/958/2 959/959/2 968/968/2 967/967/2 +f 959/959/2 960/960/2 969/969/2 968/968/2 +f 960/960/2 961/961/2 970/970/2 969/969/2 +f 961/961/2 962/962/2 971/971/2 970/970/2 +f 962/962/2 963/963/2 972/972/2 971/971/2 +f 964/964/2 965/965/2 974/974/2 973/973/2 +f 965/965/2 966/966/2 975/975/2 974/974/2 +f 966/966/2 967/967/2 976/976/2 975/975/2 +f 967/967/2 968/968/2 977/977/2 976/976/2 +f 968/968/2 969/969/2 978/978/2 977/977/2 +f 969/969/2 970/970/2 979/979/2 978/978/2 +f 970/970/2 971/971/2 980/980/2 979/979/2 +f 971/971/2 972/972/2 981/981/2 980/980/2 +f 973/973/2 974/974/2 983/983/2 982/982/2 +f 974/974/2 975/975/2 984/984/2 983/983/2 +f 975/975/2 976/976/2 985/985/2 984/984/2 +f 976/976/2 977/977/2 986/986/2 985/985/2 +f 977/977/2 978/978/2 987/987/2 986/986/2 +f 978/978/2 979/979/2 988/988/2 987/987/2 +f 979/979/2 980/980/2 989/989/2 988/988/2 +f 980/980/2 981/981/2 990/990/2 989/989/2 +f 982/982/2 983/983/2 992/992/2 991/991/2 +f 983/983/2 984/984/2 993/993/2 992/992/2 +f 984/984/2 985/985/2 994/994/2 993/993/2 +f 985/985/2 986/986/2 995/995/2 994/994/2 +f 986/986/2 987/987/2 996/996/2 995/995/2 +f 987/987/2 988/988/2 997/997/2 996/996/2 +f 988/988/2 989/989/2 998/998/2 997/997/2 +f 989/989/2 990/990/2 999/999/2 998/998/2 +f 991/991/2 992/992/2 1001/1001/2 1000/1000/2 +f 992/992/2 993/993/2 1002/1002/2 1001/1001/2 +f 993/993/2 994/994/2 1003/1003/2 1002/1002/2 +f 994/994/2 995/995/2 1004/1004/2 1003/1003/2 +f 995/995/2 996/996/2 1005/1005/2 1004/1004/2 +f 996/996/2 997/997/2 1006/1006/2 1005/1005/2 +f 997/997/2 998/998/2 1007/1007/2 1006/1006/2 +f 998/998/2 999/999/2 1008/1008/2 1007/1007/2 +f 1000/1000/2 1001/1001/2 1010/1010/2 1009/1009/2 +f 1001/1001/2 1002/1002/2 1011/1011/2 1010/1010/2 +f 1002/1002/2 1003/1003/2 1012/1012/2 1011/1011/2 +f 1003/1003/2 1004/1004/2 1013/1013/2 1012/1012/2 +f 1004/1004/2 1005/1005/2 1014/1014/2 1013/1013/2 +f 1005/1005/2 1006/1006/2 1015/1015/2 1014/1014/2 +f 1006/1006/2 1007/1007/2 1016/1016/2 1015/1015/2 +f 1007/1007/2 1008/1008/2 1017/1017/2 1016/1016/2 +f 1009/1009/2 1010/1010/2 1019/1019/2 1018/1018/2 +f 1010/1010/2 1011/1011/2 1020/1020/2 1019/1019/2 +f 1011/1011/2 1012/1012/2 1021/1021/2 1020/1020/2 +f 1012/1012/2 1013/1013/2 1022/1022/2 1021/1021/2 +f 1013/1013/2 1014/1014/2 1023/1023/2 1022/1022/2 +f 1014/1014/2 1015/1015/2 1024/1024/2 1023/1023/2 +f 1015/1015/2 1016/1016/2 1025/1025/2 1024/1024/2 +f 1016/1016/2 1017/1017/2 1026/1026/2 1025/1025/2 +f 1018/1018/2 1019/1019/2 1028/1028/2 1027/1027/2 +f 1019/1019/2 1020/1020/2 1029/1029/2 1028/1028/2 +f 1020/1020/2 1021/1021/2 1030/1030/2 1029/1029/2 +f 1021/1021/2 1022/1022/2 1031/1031/2 1030/1030/2 +f 1022/1022/2 1023/1023/2 1032/1032/2 1031/1031/2 +f 1023/1023/2 1024/1024/2 1033/1033/2 1032/1032/2 +f 1024/1024/2 1025/1025/2 1034/1034/2 1033/1033/2 +f 1025/1025/2 1026/1026/2 1035/1035/2 1034/1034/2 +f 1027/1027/2 1028/1028/2 1037/1037/2 1036/1036/2 +f 1028/1028/2 1029/1029/2 1038/1038/2 1037/1037/2 +f 1029/1029/2 1030/1030/2 1039/1039/2 1038/1038/2 +f 1030/1030/2 1031/1031/2 1040/1040/2 1039/1039/2 +f 1031/1031/2 1032/1032/2 1041/1041/2 1040/1040/2 +f 1032/1032/2 1033/1033/2 1042/1042/2 1041/1041/2 +f 1033/1033/2 1034/1034/2 1043/1043/2 1042/1042/2 +f 1034/1034/2 1035/1035/2 1044/1044/2 1043/1043/2 +f 1036/1036/2 1037/1037/2 1046/1046/2 1045/1045/2 +f 1037/1037/2 1038/1038/2 1047/1047/2 1046/1046/2 +f 1038/1038/2 1039/1039/2 1048/1048/2 1047/1047/2 +f 1039/1039/2 1040/1040/2 1049/1049/2 1048/1048/2 +f 1040/1040/2 1041/1041/2 1050/1050/2 1049/1049/2 +f 1041/1041/2 1042/1042/2 1051/1051/2 1050/1050/2 +f 1042/1042/2 1043/1043/2 1052/1052/2 1051/1051/2 +f 1043/1043/2 1044/1044/2 1053/1053/2 1052/1052/2 +f 1045/1045/2 1046/1046/2 1055/1055/2 1054/1054/2 +f 1046/1046/2 1047/1047/2 1056/1056/2 1055/1055/2 +f 1047/1047/2 1048/1048/2 1057/1057/2 1056/1056/2 +f 1048/1048/2 1049/1049/2 1058/1058/2 1057/1057/2 +f 1049/1049/2 1050/1050/2 1059/1059/2 1058/1058/2 +f 1050/1050/2 1051/1051/2 1060/1060/2 1059/1059/2 +f 1051/1051/2 1052/1052/2 1061/1061/2 1060/1060/2 +f 1052/1052/2 1053/1053/2 1062/1062/2 1061/1061/2 +f 1054/1054/2 1055/1055/2 1064/1064/2 1063/1063/2 +f 1055/1055/2 1056/1056/2 1065/1065/2 1064/1064/2 +f 1056/1056/2 1057/1057/2 1066/1066/2 1065/1065/2 +f 1057/1057/2 1058/1058/2 1067/1067/2 1066/1066/2 +f 1058/1058/2 1059/1059/2 1068/1068/2 1067/1067/2 +f 1059/1059/2 1060/1060/2 1069/1069/2 1068/1068/2 +f 1060/1060/2 1061/1061/2 1070/1070/2 1069/1069/2 +f 1061/1061/2 1062/1062/2 1071/1071/2 1070/1070/2 +f 1063/1063/2 1064/1064/2 1073/1073/2 1072/1072/2 +f 1064/1064/2 1065/1065/2 1074/1074/2 1073/1073/2 +f 1065/1065/2 1066/1066/2 1075/1075/2 1074/1074/2 +f 1066/1066/2 1067/1067/2 1076/1076/2 1075/1075/2 +f 1067/1067/2 1068/1068/2 1077/1077/2 1076/1076/2 +f 1068/1068/2 1069/1069/2 1078/1078/2 1077/1077/2 +f 1069/1069/2 1070/1070/2 1079/1079/2 1078/1078/2 +f 1070/1070/2 1071/1071/2 1080/1080/2 1079/1079/2 +f 1072/1072/2 1073/1073/2 1082/1082/2 1081/1081/2 +f 1073/1073/2 1074/1074/2 1083/1083/2 1082/1082/2 +f 1074/1074/2 1075/1075/2 1084/1084/2 1083/1083/2 +f 1075/1075/2 1076/1076/2 1085/1085/2 1084/1084/2 +f 1076/1076/2 1077/1077/2 1086/1086/2 1085/1085/2 +f 1077/1077/2 1078/1078/2 1087/1087/2 1086/1086/2 +f 1078/1078/2 1079/1079/2 1088/1088/2 1087/1087/2 +f 1079/1079/2 1080/1080/2 1089/1089/2 1088/1088/2 +f 1081/1081/2 1082/1082/2 1091/1091/2 1090/1090/2 +f 1082/1082/2 1083/1083/2 1092/1092/2 1091/1091/2 +f 1083/1083/2 1084/1084/2 1093/1093/2 1092/1092/2 +f 1084/1084/2 1085/1085/2 1094/1094/2 1093/1093/2 +f 1085/1085/2 1086/1086/2 1095/1095/2 1094/1094/2 +f 1086/1086/2 1087/1087/2 1096/1096/2 1095/1095/2 +f 1087/1087/2 1088/1088/2 1097/1097/2 1096/1096/2 +f 1088/1088/2 1089/1089/2 1098/1098/2 1097/1097/2 +f 1090/1090/2 1091/1091/2 1100/1100/2 1099/1099/2 +f 1091/1091/2 1092/1092/2 1101/1101/2 1100/1100/2 +f 1092/1092/2 1093/1093/2 1102/1102/2 1101/1101/2 +f 1093/1093/2 1094/1094/2 1103/1103/2 1102/1102/2 +f 1094/1094/2 1095/1095/2 1104/1104/2 1103/1103/2 +f 1095/1095/2 1096/1096/2 1105/1105/2 1104/1104/2 +f 1096/1096/2 1097/1097/2 1106/1106/2 1105/1105/2 +f 1097/1097/2 1098/1098/2 1107/1107/2 1106/1106/2 +f 1099/1099/2 1100/1100/2 1109/1109/2 1108/1108/2 +f 1100/1100/2 1101/1101/2 1110/1110/2 1109/1109/2 +f 1101/1101/2 1102/1102/2 1111/1111/2 1110/1110/2 +f 1102/1102/2 1103/1103/2 1112/1112/2 1111/1111/2 +f 1103/1103/2 1104/1104/2 1113/1113/2 1112/1112/2 +f 1104/1104/2 1105/1105/2 1114/1114/2 1113/1113/2 +f 1105/1105/2 1106/1106/2 1115/1115/2 1114/1114/2 +f 1106/1106/2 1107/1107/2 1116/1116/2 1115/1115/2 +f 1108/1108/2 1109/1109/2 1118/1118/2 1117/1117/2 +f 1109/1109/2 1110/1110/2 1119/1119/2 1118/1118/2 +f 1110/1110/2 1111/1111/2 1120/1120/2 1119/1119/2 +f 1111/1111/2 1112/1112/2 1121/1121/2 1120/1120/2 +f 1112/1112/2 1113/1113/2 1122/1122/2 1121/1121/2 +f 1113/1113/2 1114/1114/2 1123/1123/2 1122/1122/2 +f 1114/1114/2 1115/1115/2 1124/1124/2 1123/1123/2 +f 1115/1115/2 1116/1116/2 1125/1125/2 1124/1124/2 +f 1117/1117/2 1118/1118/2 1127/1127/2 1126/1126/2 +f 1118/1118/2 1119/1119/2 1128/1128/2 1127/1127/2 +f 1119/1119/2 1120/1120/2 1129/1129/2 1128/1128/2 +f 1120/1120/2 1121/1121/2 1130/1130/2 1129/1129/2 +f 1121/1121/2 1122/1122/2 1131/1131/2 1130/1130/2 +f 1122/1122/2 1123/1123/2 1132/1132/2 1131/1131/2 +f 1123/1123/2 1124/1124/2 1133/1133/2 1132/1132/2 +f 1124/1124/2 1125/1125/2 1134/1134/2 1133/1133/2 +f 1126/1126/2 1127/1127/2 1136/1136/2 1135/1135/2 +f 1127/1127/2 1128/1128/2 1137/1137/2 1136/1136/2 +f 1128/1128/2 1129/1129/2 1138/1138/2 1137/1137/2 +f 1129/1129/2 1130/1130/2 1139/1139/2 1138/1138/2 +f 1130/1130/2 1131/1131/2 1140/1140/2 1139/1139/2 +f 1131/1131/2 1132/1132/2 1141/1141/2 1140/1140/2 +f 1132/1132/2 1133/1133/2 1142/1142/2 1141/1141/2 +f 1133/1133/2 1134/1134/2 1143/1143/2 1142/1142/2 +f 1135/1135/2 1136/1136/2 1145/1145/2 1144/1144/2 +f 1136/1136/2 1137/1137/2 1146/1146/2 1145/1145/2 +f 1137/1137/2 1138/1138/2 1147/1147/2 1146/1146/2 +f 1138/1138/2 1139/1139/2 1148/1148/2 1147/1147/2 +f 1139/1139/2 1140/1140/2 1149/1149/2 1148/1148/2 +f 1140/1140/2 1141/1141/2 1150/1150/2 1149/1149/2 +f 1141/1141/2 1142/1142/2 1151/1151/2 1150/1150/2 +f 1142/1142/2 1143/1143/2 1152/1152/2 1151/1151/2 +f 1144/1144/2 1145/1145/2 1154/1154/2 1153/1153/2 +f 1145/1145/2 1146/1146/2 1155/1155/2 1154/1154/2 +f 1146/1146/2 1147/1147/2 1156/1156/2 1155/1155/2 +f 1147/1147/2 1148/1148/2 1157/1157/2 1156/1156/2 +f 1148/1148/2 1149/1149/2 1158/1158/2 1157/1157/2 +f 1149/1149/2 1150/1150/2 1159/1159/2 1158/1158/2 +f 1150/1150/2 1151/1151/2 1160/1160/2 1159/1159/2 +f 1151/1151/2 1152/1152/2 1161/1161/2 1160/1160/2 +f 1153/1153/2 1154/1154/2 1163/1163/2 1162/1162/2 +f 1154/1154/2 1155/1155/2 1164/1164/2 1163/1163/2 +f 1155/1155/2 1156/1156/2 1165/1165/2 1164/1164/2 +f 1156/1156/2 1157/1157/2 1166/1166/2 1165/1165/2 +f 1157/1157/2 1158/1158/2 1167/1167/2 1166/1166/2 +f 1158/1158/2 1159/1159/2 1168/1168/2 1167/1167/2 +f 1159/1159/2 1160/1160/2 1169/1169/2 1168/1168/2 +f 1160/1160/2 1161/1161/2 1170/1170/2 1169/1169/2 diff --git a/mods/everness/models/everness_venus_trap.obj b/mods/everness/models/everness_venus_trap.obj new file mode 100644 index 0000000..0701327 --- /dev/null +++ b/mods/everness/models/everness_venus_trap.obj @@ -0,0 +1,149 @@ +# Blender v2.83.20 OBJ File: 'everness_venus_trap.blend' +# www.blender.org +mtllib everness_venus_trap.mtl +o Plane +v -0.625000 -0.499000 0.625000 +v 0.625000 -0.499000 0.625000 +v -0.625000 -0.499000 -0.625000 +v 0.625000 -0.499000 -0.625000 +v 0.000000 -0.499000 0.000000 +v -0.625000 -0.405250 0.000000 +v 0.000000 -0.405250 0.625000 +v 0.625000 -0.405250 0.000000 +v 0.000000 -0.405250 -0.625000 +vt 0.875000 0.125000 +vt 0.875000 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.125000 +vt 0.875000 0.500000 +vt 0.687500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.312500 +vt 0.500000 0.125000 +vn -0.1467 0.9782 0.1467 +vn 0.1467 0.9782 -0.1467 +vn -0.1467 0.9782 -0.1467 +vn 0.1467 0.9782 0.1467 +usemtl flower +s off +f 2/1/1 8/2/1 5/3/1 +f 7/4/2 2/1/2 5/3/2 +f 8/2/3 4/5/3 5/3/3 +f 9/6/1 3/7/1 5/3/1 +f 6/8/4 1/9/4 5/3/4 +f 3/7/2 6/8/2 5/3/2 +f 4/5/4 9/6/4 5/3/4 +f 1/9/3 7/4/3 5/3/3 +o Cube_Cube.001 +v 0.071372 -0.499000 0.442448 +v -0.214282 0.200707 0.728103 +v -0.442448 -0.499000 -0.071372 +v -0.728103 0.200707 0.214282 +v -0.674071 0.244824 0.160250 +v -0.542565 0.352199 0.028744 +v -0.160250 0.244824 0.674071 +v -0.028744 0.352199 0.542565 +v 0.125404 -0.454883 0.388416 +v -0.388416 -0.454883 -0.125404 +v -0.071372 -0.499000 -0.442448 +v 0.214282 0.200707 -0.728103 +v 0.442448 -0.499000 0.071372 +v 0.728103 0.200707 -0.214282 +v 0.674071 0.244824 -0.160250 +v 0.542565 0.352199 -0.028744 +v -0.256910 -0.347509 -0.256910 +v 0.388416 -0.454883 0.125404 +v 0.028744 0.352199 -0.542565 +v 0.256910 -0.347509 0.256910 +v 0.160250 0.244824 -0.674070 +v -0.125404 -0.454883 -0.388416 +vt 0.265625 0.187500 +vt 0.265625 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.187500 +vt 0.375000 0.687500 +vt 0.375000 1.000000 +vt 0.281250 1.000000 +vt 0.281250 0.687500 +vt 0.000000 0.890625 +vt 0.000000 0.968750 +vt 0.250000 0.968750 +vt 0.250000 0.890625 +vt 0.250000 1.000000 +vt 0.250000 0.687500 +vt 0.000000 1.000000 +vt 0.281250 1.000000 +vt 0.281250 0.687500 +vt 0.375000 0.687500 +vt 0.375000 1.000000 +vt 0.765625 0.687500 +vt 0.765625 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.687500 +vt 0.000000 0.890625 +vt 0.000000 0.859375 +vt 0.250000 0.859375 +vt 0.250000 0.890625 +vt 0.250000 1.000000 +vt 0.250000 0.687500 +vt 0.000000 0.781250 +vt 0.250000 0.781250 +vt -0.000000 0.500000 +vt -0.000000 0.187500 +vt 0.265625 0.187500 +vt 0.265625 0.500000 +vt 0.375000 0.687500 +vt 0.281250 0.687500 +vt 0.281250 1.000000 +vt 0.250000 0.890625 +vt 0.250000 0.968750 +vt 0.000000 0.968750 +vt 0.000000 0.890625 +vt 0.250000 0.687500 +vt 0.250000 1.000000 +vt 0.250000 1.000000 +vt 0.000000 1.000000 +vt 0.281250 0.687500 +vt 0.281250 1.000000 +vt 0.375000 1.000000 +vt 0.765625 0.687500 +vt 0.765625 1.000000 +vt 0.500000 1.000000 +vt 0.500000 0.687500 +vt 0.000000 0.890625 +vt 0.000000 0.859375 +vt 0.250000 0.859375 +vt 0.250000 0.890625 +vt 0.250000 0.687500 +vt 0.000000 0.781250 +vt 0.250000 0.781250 +vn -0.6124 -0.5000 0.6124 +vn 0.7071 0.0000 0.7071 +vn -0.3536 0.8660 0.3536 +vn -0.7071 0.0000 -0.7071 +vn 0.3536 -0.8660 -0.3536 +vn 0.6124 -0.5000 -0.6124 +vn 0.3536 0.8660 -0.3536 +vn -0.3536 -0.8660 0.3536 +usemtl flower +s off +f 10/10/5 11/11/5 13/12/5 12/13/5 +f 29/14/6 17/15/6 16/16/6 18/17/6 +f 15/18/7 14/19/7 16/20/7 17/21/7 +f 18/17/6 16/16/6 11/22/6 10/23/6 +f 14/19/7 13/24/7 11/22/7 16/20/7 +f 19/25/8 14/26/8 15/27/8 26/28/8 +f 18/29/5 16/30/5 14/31/5 19/32/5 +f 12/33/9 19/34/9 18/35/9 10/36/9 +f 12/37/8 13/38/8 14/26/8 19/25/8 +f 19/34/9 26/39/9 29/40/9 18/35/9 +f 20/41/10 21/42/10 23/43/10 22/44/10 +f 26/28/8 28/45/8 30/46/8 31/47/8 +f 25/48/11 24/49/11 30/50/11 28/51/11 +f 31/47/8 30/46/8 21/52/8 20/53/8 +f 24/49/11 23/54/11 21/55/11 30/50/11 +f 27/56/6 24/57/6 25/58/6 29/14/6 +f 31/59/10 30/60/10 24/61/10 27/62/10 +f 22/63/12 27/64/12 31/65/12 20/66/12 +f 22/67/6 23/54/6 24/57/6 27/56/6 +f 27/64/12 29/68/12 26/69/12 31/65/12 diff --git a/mods/everness/models/everness_vine_wall.obj b/mods/everness/models/everness_vine_wall.obj new file mode 100644 index 0000000..a099a6a --- /dev/null +++ b/mods/everness/models/everness_vine_wall.obj @@ -0,0 +1,109 @@ +# Blender v2.83.20 OBJ File: 'everness_better_vine_1.blend' +# www.blender.org +mtllib everness_vine_wall.mtl +o Plane +v 0.470000 -0.490000 -0.470000 +v -0.470000 -0.490000 -0.470000 +v 0.470000 -0.490000 0.470000 +v -0.470000 -0.490000 0.470000 +v -0.752156 -0.490000 0.461451 +v 0.751842 -0.492615 0.461221 +v -0.751842 -0.272978 0.044555 +v 0.752156 -0.275593 0.044326 +v 0.752156 -0.275593 -0.073174 +v -0.751842 -0.272978 -0.072945 +v 0.751842 -0.492615 0.343721 +v -0.752156 -0.490000 0.343951 +v -0.752156 -0.490000 0.226451 +v 0.751842 -0.492615 0.226221 +v -0.751842 -0.272978 -0.190445 +v 0.752156 -0.275593 -0.190674 +v 0.752156 -0.275593 -0.308174 +v -0.751842 -0.272978 -0.307945 +v 0.751842 -0.492615 0.108721 +v -0.752156 -0.490000 0.108951 +v -0.752156 -0.490000 -0.008549 +v 0.751842 -0.492615 -0.008779 +v -0.751842 -0.272978 -0.425445 +v 0.752156 -0.275593 -0.425674 +v 0.752156 -0.275593 -0.543174 +v -0.751842 -0.272978 -0.542945 +v 0.751842 -0.492615 -0.126279 +v -0.752156 -0.490000 -0.126049 +v -0.752156 -0.490000 -0.243549 +v 0.751842 -0.492615 -0.243779 +v -0.751842 -0.272978 -0.660445 +v 0.752156 -0.275593 -0.660674 +v 0.752156 -0.275593 -0.778174 +v -0.751842 -0.272978 -0.777945 +v 0.751842 -0.492615 -0.361279 +v -0.752156 -0.490000 -0.361050 +v 0.752149 -0.315254 -0.905760 +v -0.751849 -0.312629 -0.905760 +v 0.751848 -0.487510 -0.468464 +v -0.752149 -0.484885 -0.468463 +vt -0.000000 0.727273 +vt 1.000000 0.818182 +vt -0.000000 0.818182 +vt 1.000000 0.636364 +vt 0.000000 0.727273 +vt 0.000000 0.636364 +vt 1.000000 0.545455 +vt 0.000000 0.636364 +vt 0.000000 0.545455 +vt 1.000000 0.454546 +vt 0.000000 0.545455 +vt 0.000000 0.454546 +vt 0.000000 0.363636 +vt 1.000000 0.454546 +vt 0.000000 0.454546 +vt 0.000000 0.272727 +vt 1.000000 0.363636 +vt 0.000000 0.363636 +vt 1.000000 0.181818 +vt 0.000000 0.272727 +vt 0.000000 0.181818 +vt 1.000000 0.090909 +vt 0.000000 0.181818 +vt 0.000000 0.090909 +vt 0.000000 -0.000000 +vt 1.000000 0.090909 +vt 0.000000 0.090909 +vt 0.166667 0.818182 +vt 0.833333 1.000000 +vt 0.833333 0.818182 +vt 1.000000 0.727273 +vt 1.000000 0.727273 +vt 1.000000 0.636364 +vt 1.000000 0.545455 +vt 1.000000 0.363636 +vt 1.000000 0.272727 +vt 1.000000 0.272727 +vt 1.000000 0.181818 +vt 1.000000 0.000000 +vt 0.166667 1.000000 +vn 0.0016 0.8870 0.4617 +vn 0.0016 0.9304 0.3665 +vn 0.0000 1.0000 -0.0000 +usemtl leaves +s off +f 8/1/1 5/2/1 6/3/1 +f 10/4/1 11/5/1 9/6/1 +f 15/7/1 14/8/1 16/9/1 +f 18/10/1 19/11/1 17/12/1 +f 24/13/1 21/14/1 22/15/1 +f 25/16/1 28/17/1 27/18/1 +f 31/19/1 30/20/1 32/21/1 +f 34/22/1 35/23/1 33/24/1 +f 37/25/2 40/26/2 39/27/2 +f 3/28/3 2/29/3 4/30/3 +f 8/1/1 7/31/1 5/2/1 +f 10/4/1 12/32/1 11/5/1 +f 15/7/1 13/33/1 14/8/1 +f 18/10/1 20/34/1 19/11/1 +f 24/13/1 23/35/1 21/14/1 +f 25/16/1 26/36/1 28/17/1 +f 31/19/1 29/37/1 30/20/1 +f 34/22/1 36/38/1 35/23/1 +f 37/25/2 38/39/2 40/26/2 +f 3/28/3 1/40/3 2/29/3 diff --git a/mods/everness/models/everness_water_geyser.obj b/mods/everness/models/everness_water_geyser.obj new file mode 100644 index 0000000..e927d59 --- /dev/null +++ b/mods/everness/models/everness_water_geyser.obj @@ -0,0 +1,4924 @@ +# Blender v2.83.20 OBJ File: 'everness_water_geyser.blend' +# www.blender.org +mtllib everness_water_geyser.mtl +o everness_water_geyser.vox +v -0.062500 -0.499000 0.500000 +v 0.375000 -0.436500 0.437500 +v 0.312500 -0.436500 0.062500 +v -0.500000 -0.499000 0.000000 +v 0.250000 -0.499000 -0.187500 +v 0.312500 -0.436500 -0.312500 +v 0.437500 -0.436500 0.437500 +v -0.125000 -0.436500 0.312500 +v -0.125000 -0.436500 0.250000 +v 0.375000 -0.436500 0.250000 +v -0.187500 -0.436500 0.250000 +v -0.187500 -0.436500 0.187500 +v -0.437500 -0.374000 0.187500 +v 0.437500 -0.374000 0.187500 +v -0.312500 -0.374000 0.125000 +v -0.437500 -0.436500 0.000000 +v -0.312500 -0.374000 0.000000 +v 0.437500 -0.436500 -0.187500 +v -0.312500 -0.436500 -0.250000 +v -0.250000 -0.436500 -0.312500 +v 0.437500 -0.436500 -0.250000 +v -0.437500 -0.311500 0.500000 +v 0.187500 -0.311500 0.437500 +v -0.500000 -0.311500 0.375000 +v 0.187500 -0.374000 0.312500 +v 0.437500 -0.374000 0.375000 +v -0.125000 -0.374000 0.312500 +v 0.312500 -0.311500 0.187500 +v -0.437500 -0.311500 0.187500 +v -0.250000 -0.311500 0.125000 +v 0.250000 -0.311500 0.062500 +v 0.375000 -0.311500 -0.187500 +v 0.312500 -0.311500 -0.312500 +v 0.312500 -0.311500 -0.375000 +v -0.062500 -0.249000 0.500000 +v 0.062500 -0.311500 0.375000 +v -0.062500 -0.249000 0.312500 +v 0.125000 -0.249000 0.312500 +v 0.375000 -0.311500 0.312500 +v -0.187500 -0.311500 0.187500 +v 0.250000 -0.249000 0.187500 +v -0.312500 -0.311500 0.125000 +v -0.312500 -0.311500 0.000000 +v -0.500000 -0.249000 0.000000 +v -0.250000 -0.249000 0.000000 +v -0.312500 -0.249000 -0.187500 +v -0.437500 -0.311500 -0.312500 +v 0.250000 -0.249000 -0.312500 +v -0.062500 -0.311500 -0.375000 +v -0.125000 -0.186500 0.375000 +v 0.375000 -0.186500 0.312500 +v 0.062500 -0.249000 0.187500 +v 0.312500 -0.249000 0.187500 +v 0.312500 -0.186500 0.062500 +v -0.187500 -0.249000 0.000000 +v 0.312500 -0.249000 0.062500 +v -0.375000 -0.249000 -0.062500 +v 0.312500 -0.249000 -0.062500 +v -0.437500 -0.249000 -0.187500 +v -0.437500 -0.249000 -0.250000 +v -0.062500 -0.249000 -0.187500 +v -0.250000 -0.186500 -0.375000 +v 0.125000 -0.249000 -0.375000 +v -0.187500 -0.124000 0.187500 +v -0.187500 -0.186500 0.125000 +v 0.187500 -0.124000 0.062500 +v -0.375000 -0.124000 0.000000 +v -0.375000 -0.124000 -0.187500 +v -0.375000 -0.186500 -0.187500 +v -0.437500 -0.124000 -0.187500 +v -0.250000 -0.124000 -0.437500 +v 0.125000 -0.124000 -0.375000 +v -0.125000 -0.061500 0.437500 +v -0.125000 -0.061500 0.375000 +v -0.125000 -0.061500 0.250000 +v -0.125000 -0.061500 0.187500 +v -0.375000 -0.061500 0.125000 +v -0.125000 -0.124000 0.125000 +v 0.250000 -0.061500 0.187500 +v 0.125000 -0.124000 0.062500 +v -0.312500 -0.124000 0.000000 +v 0.250000 -0.061500 -0.125000 +v 0.125000 -0.061500 -0.187500 +v 0.312500 -0.124000 -0.250000 +v -0.062500 -0.124000 -0.312500 +v 0.125000 -0.061500 -0.312500 +v 0.062500 -0.061500 0.250000 +v -0.125000 -0.061500 -0.062500 +v -0.062500 -0.061500 -0.187500 +v 0.125000 0.001000 -0.187500 +v -0.312500 0.001000 -0.312500 +v 0.125000 0.001000 0.250000 +v -0.125000 0.063500 0.125000 +v -0.062500 0.063500 0.062500 +v -0.187500 0.001000 0.000000 +v 0.187500 0.063500 0.062500 +v -0.187500 0.063500 0.000000 +v -0.250000 0.001000 -0.062500 +v 0.000000 0.001000 -0.125000 +v -0.250000 0.001000 -0.187500 +v -0.250000 0.063500 -0.250000 +v -0.250000 0.001000 -0.250000 +v -0.062500 0.126000 0.375000 +v -0.062500 0.126000 0.312500 +v -0.062500 0.063500 0.312500 +v -0.250000 0.126000 0.312500 +v 0.125000 0.126000 0.187500 +v 0.062500 0.063500 0.000000 +v 0.000000 0.063500 -0.187500 +v -0.187500 0.126000 0.250000 +v 0.062500 0.188500 0.187500 +v -0.062500 0.188500 0.062500 +v 0.000000 0.188500 -0.062500 +v 0.187500 0.188500 -0.125000 +v 0.000000 0.251000 0.125000 +v -0.187500 0.251000 0.062500 +v -0.125000 0.188500 0.000000 +v 0.125000 0.188500 0.062500 +v 0.125000 0.251000 0.000000 +v 0.187500 0.251000 0.000000 +v 0.187500 0.251000 -0.062500 +v 0.187500 0.188500 -0.062500 +v 0.125000 0.188500 -0.062500 +v 0.125000 0.251000 -0.062500 +v -0.062500 0.251000 0.062500 +v 0.062500 0.251000 0.062500 +v 0.000000 0.251000 -0.062500 +v 0.062500 0.376000 0.000000 +v 0.062500 0.376000 -0.062500 +v 0.000000 0.376000 -0.062500 +v 0.000000 0.376000 -0.187500 +v 0.187500 -0.436500 0.437500 +v 0.437500 -0.436500 0.312500 +v -0.125000 -0.499000 0.125000 +v 0.500000 -0.499000 -0.187500 +v 0.125000 -0.499000 -0.250000 +v 0.125000 -0.436500 -0.312500 +v 0.500000 -0.499000 -0.250000 +v -0.062500 -0.436500 0.375000 +v -0.062500 -0.374000 0.375000 +v -0.437500 -0.374000 0.375000 +v -0.375000 -0.436500 0.187500 +v -0.375000 -0.436500 0.000000 +v 0.312500 -0.436500 -0.125000 +v 0.375000 -0.436500 -0.250000 +v -0.437500 -0.436500 -0.312500 +v 0.312500 -0.374000 -0.375000 +v 0.312500 -0.374000 -0.312500 +v -0.437500 -0.436500 -0.437500 +v -0.125000 -0.436500 -0.437500 +v -0.375000 -0.374000 0.375000 +v 0.250000 -0.374000 0.375000 +v 0.250000 -0.374000 0.312500 +v -0.375000 -0.374000 0.125000 +v 0.500000 -0.311500 0.062500 +v -0.250000 -0.311500 0.000000 +v -0.437500 -0.311500 -0.187500 +v 0.375000 -0.311500 -0.125000 +v 0.500000 -0.311500 -0.250000 +v -0.312500 -0.374000 -0.437500 +v 0.187500 -0.249000 0.375000 +v 0.000000 -0.311500 0.312500 +v 0.187500 -0.249000 0.312500 +v 0.250000 -0.311500 0.250000 +v -0.125000 -0.311500 0.125000 +v 0.250000 -0.249000 0.062500 +v 0.250000 -0.249000 -0.125000 +v -0.375000 -0.311500 -0.312500 +v 0.375000 -0.311500 -0.250000 +v -0.125000 -0.249000 -0.437500 +v 0.125000 -0.311500 -0.437500 +v 0.125000 -0.249000 -0.500000 +v 0.250000 -0.186500 0.000000 +v 0.375000 -0.249000 0.000000 +v -0.312500 -0.249000 -0.062500 +v -0.312500 -0.186500 -0.125000 +v -0.375000 -0.249000 -0.187500 +v -0.375000 -0.249000 -0.250000 +v -0.125000 -0.186500 0.312500 +v 0.187500 -0.186500 0.250000 +v 0.187500 -0.124000 0.250000 +v 0.250000 -0.124000 0.187500 +v 0.375000 -0.186500 0.187500 +v 0.250000 -0.186500 0.062500 +v 0.375000 -0.124000 0.000000 +v -0.062500 -0.186500 -0.062500 +v 0.312500 -0.124000 0.000000 +v 0.250000 -0.124000 -0.125000 +v -0.250000 -0.124000 -0.187500 +v -0.062500 -0.186500 -0.187500 +v -0.062500 -0.124000 -0.125000 +v 0.187500 -0.124000 -0.125000 +v -0.062500 -0.124000 -0.250000 +v -0.062500 -0.124000 -0.437500 +v 0.312500 -0.124000 -0.437500 +v 0.062500 -0.061500 0.375000 +v 0.062500 -0.061500 0.437500 +v -0.250000 -0.061500 0.312500 +v -0.250000 -0.061500 0.187500 +v 0.187500 -0.124000 0.187500 +v 0.250000 -0.124000 0.000000 +v -0.062500 -0.124000 -0.062500 +v -0.062500 -0.061500 -0.125000 +v 0.375000 -0.061500 -0.312500 +v -0.187500 -0.061500 0.187500 +v -0.062500 -0.061500 0.187500 +v 0.187500 -0.061500 0.187500 +v -0.187500 0.001000 -0.062500 +v -0.062500 0.001000 -0.125000 +v 0.125000 -0.061500 -0.125000 +v -0.062500 -0.061500 -0.250000 +v -0.062500 0.001000 -0.187500 +v 0.250000 0.063500 0.000000 +v -0.125000 0.063500 -0.062500 +v -0.187500 0.063500 -0.062500 +v 0.125000 0.001000 -0.125000 +v -0.187500 0.001000 -0.125000 +v -0.187500 0.001000 -0.187500 +v -0.187500 0.063500 -0.187500 +v 0.062500 0.001000 -0.125000 +v 0.187500 0.063500 0.000000 +v 0.125000 0.063500 0.000000 +v 0.125000 0.126000 -0.062500 +v 0.312500 0.126000 -0.062500 +v 0.062500 0.126000 -0.187500 +v 0.062500 0.126000 -0.125000 +v -0.125000 0.188500 0.125000 +v 0.062500 0.126000 0.125000 +v 0.062500 0.188500 0.125000 +v 0.187500 0.188500 0.062500 +v 0.000000 0.188500 -0.125000 +v 0.000000 0.251000 0.187500 +v 0.000000 0.251000 0.250000 +v -0.125000 0.188500 -0.062500 +v 0.062500 0.251000 -0.125000 +v 0.000000 0.251000 -0.187500 +v 0.062500 0.251000 0.125000 +v 0.125000 0.251000 -0.125000 +v 0.062500 0.376000 0.187500 +v 0.000000 0.376000 0.062500 +v 0.187500 0.376000 -0.062500 +v -0.437500 -0.499000 0.500000 +v -0.250000 -0.499000 0.500000 +v -0.062500 -0.499000 0.437500 +v -0.062500 -0.436500 0.437500 +v 0.187500 -0.499000 0.437500 +v -0.437500 -0.499000 0.375000 +v -0.500000 -0.499000 -0.312500 +v -0.250000 -0.436500 0.437500 +v 0.437500 -0.436500 0.250000 +v -0.375000 -0.374000 0.187500 +v -0.375000 -0.436500 -0.250000 +v -0.312500 -0.436500 -0.375000 +v -0.125000 -0.436500 -0.375000 +v 0.437500 -0.436500 -0.375000 +v -0.312500 -0.436500 -0.437500 +v 0.375000 -0.311500 0.500000 +v -0.062500 -0.311500 0.437500 +v -0.062500 -0.374000 0.312500 +v 0.437500 -0.311500 0.312500 +v 0.500000 -0.311500 0.250000 +v -0.250000 -0.311500 0.187500 +v 0.375000 -0.374000 0.187500 +v 0.437500 -0.311500 0.187500 +v 0.312500 -0.311500 -0.125000 +v 0.437500 -0.311500 -0.250000 +v -0.312500 -0.374000 -0.375000 +v -0.062500 -0.311500 -0.437500 +v 0.312500 -0.311500 -0.437500 +v 0.312500 -0.249000 0.250000 +v 0.250000 -0.249000 0.250000 +v 0.187500 -0.311500 0.187500 +v 0.187500 -0.249000 0.187500 +v -0.187500 -0.249000 0.125000 +v 0.375000 -0.311500 0.062500 +v 0.500000 -0.249000 0.062500 +v -0.375000 -0.249000 0.000000 +v 0.312500 -0.249000 -0.187500 +v -0.062500 -0.249000 -0.250000 +v 0.125000 -0.311500 -0.250000 +v 0.125000 -0.311500 -0.375000 +v -0.125000 -0.249000 0.437500 +v -0.062500 -0.249000 0.437500 +v 0.000000 -0.249000 0.437500 +v -0.125000 -0.249000 0.375000 +v 0.062500 -0.249000 0.375000 +v 0.250000 -0.249000 0.375000 +v -0.062500 -0.186500 0.312500 +v 0.312500 -0.186500 0.187500 +v -0.250000 -0.249000 0.125000 +v -0.250000 -0.186500 0.000000 +v 0.125000 -0.249000 -0.187500 +v -0.312500 -0.186500 -0.312500 +v -0.375000 -0.186500 -0.312500 +v 0.312500 -0.249000 -0.312500 +v 0.250000 -0.186500 -0.312500 +v -0.125000 -0.249000 -0.375000 +v 0.125000 -0.186500 -0.375000 +v 0.250000 -0.186500 -0.375000 +v 0.437500 -0.124000 0.375000 +v 0.062500 -0.124000 0.250000 +v 0.250000 -0.186500 0.187500 +v -0.250000 -0.186500 0.125000 +v -0.125000 -0.186500 0.125000 +v -0.062500 -0.186500 0.125000 +v -0.250000 -0.186500 -0.062500 +v 0.250000 -0.124000 -0.062500 +v -0.062500 -0.186500 -0.125000 +v -0.250000 -0.186500 -0.312500 +v 0.000000 -0.124000 -0.312500 +v 0.125000 -0.186500 -0.312500 +v -0.062500 -0.061500 0.250000 +v 0.125000 -0.061500 0.250000 +v 0.250000 -0.124000 0.250000 +v 0.187500 -0.061500 0.062500 +v -0.187500 -0.061500 -0.062500 +v 0.312500 -0.061500 -0.062500 +v 0.187500 -0.061500 -0.125000 +v -0.187500 -0.124000 -0.250000 +v 0.062500 0.001000 0.250000 +v 0.125000 0.001000 0.062500 +v 0.062500 0.001000 0.062500 +v -0.187500 -0.061500 -0.125000 +v -0.250000 0.001000 -0.125000 +v 0.062500 -0.061500 -0.125000 +v -0.125000 -0.061500 -0.187500 +v 0.187500 -0.061500 -0.187500 +v 0.250000 0.063500 0.250000 +v 0.312500 0.063500 0.250000 +v -0.125000 0.063500 0.187500 +v 0.125000 0.001000 0.187500 +v -0.062500 0.063500 0.125000 +v -0.125000 0.001000 0.062500 +v -0.062500 0.001000 0.062500 +v 0.187500 0.001000 0.062500 +v 0.250000 0.063500 0.062500 +v -0.062500 0.063500 0.187500 +v 0.000000 0.063500 0.187500 +v -0.125000 0.126000 0.125000 +v -0.125000 0.063500 0.000000 +v -0.062500 0.063500 0.000000 +v -0.062500 0.063500 -0.125000 +v -0.062500 0.126000 -0.125000 +v 0.250000 0.126000 -0.187500 +v 0.125000 0.126000 0.250000 +v -0.062500 0.126000 0.125000 +v 0.000000 0.126000 0.125000 +v 0.062500 0.126000 -0.062500 +v -0.125000 0.188500 -0.125000 +v 0.125000 0.188500 -0.125000 +v -0.187500 0.251000 0.250000 +v 0.062500 0.251000 0.250000 +v -0.062500 0.188500 0.125000 +v 0.250000 0.251000 0.000000 +v 0.062500 0.251000 -0.062500 +v -0.125000 0.251000 0.062500 +v 0.125000 0.251000 0.062500 +v -0.062500 0.376000 0.062500 +v -0.125000 0.376000 0.062500 +v 0.187500 0.376000 0.062500 +v 0.500000 -0.499000 0.312500 +v -0.500000 -0.499000 0.187500 +v -0.250000 -0.436500 0.125000 +v 0.375000 -0.436500 -0.187500 +v 0.500000 -0.499000 -0.437500 +v -0.500000 -0.499000 -0.500000 +v -0.125000 -0.499000 -0.500000 +v -0.250000 -0.374000 0.437500 +v 0.437500 -0.374000 0.437500 +v -0.437500 -0.436500 0.375000 +v -0.375000 -0.436500 0.375000 +v -0.250000 -0.374000 0.375000 +v 0.187500 -0.374000 0.375000 +v 0.375000 -0.374000 0.375000 +v 0.375000 -0.436500 0.375000 +v 0.375000 -0.374000 0.062500 +v -0.250000 -0.436500 -0.250000 +v 0.375000 -0.436500 -0.312500 +v 0.000000 -0.311500 0.437500 +v 0.062500 -0.311500 0.437500 +v -0.125000 -0.311500 0.375000 +v 0.500000 -0.311500 0.312500 +v 0.437500 -0.311500 0.250000 +v -0.187500 -0.311500 0.125000 +v -0.375000 -0.374000 0.000000 +v -0.250000 -0.311500 -0.312500 +v -0.250000 -0.311500 -0.437500 +v 0.500000 -0.311500 -0.437500 +v -0.500000 -0.311500 -0.500000 +v 0.125000 -0.311500 -0.500000 +v 0.125000 -0.249000 0.375000 +v -0.125000 -0.249000 0.312500 +v -0.125000 -0.311500 0.312500 +v 0.062500 -0.249000 0.250000 +v 0.312500 -0.311500 -0.062500 +v 0.375000 -0.249000 -0.062500 +v -0.375000 -0.311500 -0.187500 +v -0.187500 -0.311500 -0.187500 +v 0.437500 -0.311500 -0.187500 +v -0.500000 -0.249000 -0.250000 +v 0.125000 -0.311500 -0.312500 +v 0.125000 -0.249000 -0.312500 +v 0.250000 -0.311500 -0.312500 +v 0.000000 -0.249000 0.375000 +v 0.062500 -0.249000 0.312500 +v 0.250000 -0.186500 0.312500 +v -0.250000 -0.186500 -0.250000 +v -0.062500 -0.186500 -0.250000 +v -0.062500 -0.186500 -0.375000 +v -0.062500 -0.249000 -0.437500 +v 0.125000 -0.249000 -0.437500 +v -0.125000 -0.124000 0.312500 +v 0.250000 -0.124000 0.312500 +v -0.125000 -0.124000 0.250000 +v 0.312500 -0.186500 0.250000 +v 0.125000 -0.124000 0.187500 +v 0.187500 -0.186500 0.187500 +v 0.437500 -0.124000 0.187500 +v -0.312500 -0.124000 0.125000 +v -0.187500 -0.124000 0.000000 +v 0.312500 -0.124000 -0.062500 +v 0.125000 -0.124000 -0.250000 +v -0.437500 -0.124000 -0.375000 +v -0.062500 -0.124000 0.375000 +v 0.062500 -0.124000 0.312500 +v 0.125000 -0.124000 0.312500 +v -0.062500 -0.124000 0.187500 +v 0.062500 -0.124000 0.187500 +v -0.062500 -0.124000 0.125000 +v 0.312500 -0.124000 0.062500 +v 0.125000 -0.124000 -0.062500 +v 0.125000 -0.061500 -0.062500 +v -0.125000 -0.061500 -0.125000 +v -0.125000 -0.124000 -0.125000 +v 0.062500 -0.124000 -0.125000 +v 0.125000 -0.061500 -0.250000 +v 0.312500 -0.124000 -0.312500 +v 0.125000 -0.061500 -0.375000 +v 0.062500 -0.061500 0.312500 +v 0.062500 0.001000 0.187500 +v 0.125000 -0.061500 0.187500 +v -0.250000 -0.061500 0.125000 +v -0.125000 0.001000 0.000000 +v -0.062500 0.001000 -0.062500 +v 0.000000 0.001000 -0.187500 +v -0.062500 -0.061500 -0.312500 +v 0.187500 0.001000 0.187500 +v 0.312500 0.063500 0.062500 +v -0.062500 0.001000 0.000000 +v -0.062500 0.063500 -0.250000 +v 0.062500 0.063500 0.250000 +v 0.062500 0.126000 0.250000 +v 0.187500 0.063500 0.187500 +v -0.250000 0.126000 0.125000 +v -0.187500 0.126000 0.125000 +v 0.062500 0.063500 0.062500 +v 0.187500 0.126000 -0.062500 +v 0.250000 0.126000 -0.062500 +v -0.125000 0.126000 0.187500 +v -0.125000 0.188500 0.187500 +v 0.187500 0.188500 0.187500 +v -0.062500 0.188500 -0.062500 +v -0.062500 0.126000 -0.187500 +v 0.187500 0.251000 0.062500 +v 0.250000 0.251000 0.062500 +v -0.125000 0.251000 0.000000 +v -0.187500 0.251000 -0.187500 +v 0.125000 0.251000 -0.187500 +v 0.187500 -0.499000 0.500000 +v 0.375000 -0.499000 0.500000 +v 0.375000 -0.499000 0.437500 +v 0.500000 -0.499000 0.500000 +v -0.375000 -0.499000 0.375000 +v -0.250000 -0.499000 0.437500 +v -0.500000 -0.499000 0.375000 +v 0.312500 -0.499000 0.250000 +v 0.437500 -0.499000 0.312500 +v -0.437500 -0.499000 0.187500 +v -0.375000 -0.499000 0.250000 +v -0.125000 -0.499000 0.250000 +v 0.437500 -0.499000 0.250000 +v 0.500000 -0.499000 0.250000 +v -0.250000 -0.499000 0.125000 +v 0.250000 -0.499000 0.062500 +v 0.312500 -0.499000 0.062500 +v -0.437500 -0.499000 0.000000 +v 0.375000 -0.499000 -0.187500 +v -0.500000 -0.499000 -0.250000 +v -0.437500 -0.499000 -0.250000 +v 0.437500 -0.499000 -0.187500 +v -0.437500 -0.499000 -0.312500 +v -0.250000 -0.499000 -0.250000 +v 0.125000 -0.499000 -0.312500 +v 0.312500 -0.499000 -0.250000 +v 0.375000 -0.499000 -0.250000 +v 0.437500 -0.499000 -0.250000 +v 0.312500 -0.499000 -0.312500 +v -0.125000 -0.499000 -0.437500 +v 0.312500 -0.499000 -0.437500 +v -0.312500 -0.499000 -0.500000 +v -0.312500 -0.499000 -0.437500 +v 0.312500 -0.499000 -0.500000 +v -0.375000 -0.374000 0.437500 +v 0.375000 -0.374000 0.437500 +v -0.125000 -0.374000 0.375000 +v 0.437500 -0.374000 0.062500 +v 0.375000 -0.374000 -0.250000 +v 0.437500 -0.374000 -0.250000 +v 0.375000 -0.374000 -0.312500 +v 0.437500 -0.374000 -0.375000 +v -0.437500 -0.374000 -0.375000 +v -0.437500 -0.374000 -0.437500 +v 0.125000 -0.311500 0.375000 +v -0.312500 -0.311500 0.312500 +v 0.125000 -0.311500 0.312500 +v 0.250000 -0.311500 0.187500 +v -0.187500 -0.311500 0.000000 +v -0.125000 -0.311500 0.000000 +v 0.187500 -0.311500 0.000000 +v 0.250000 -0.311500 0.000000 +v 0.437500 -0.311500 0.062500 +v -0.437500 -0.311500 0.000000 +v -0.375000 -0.311500 -0.062500 +v 0.375000 -0.311500 0.000000 +v 0.125000 -0.311500 -0.062500 +v 0.250000 -0.311500 -0.062500 +v 0.375000 -0.311500 -0.062500 +v -0.250000 -0.311500 -0.187500 +v 0.250000 -0.311500 -0.187500 +v 0.312500 -0.311500 -0.250000 +v 0.250000 -0.311500 -0.375000 +v 0.062500 -0.249000 0.437500 +v -0.062500 -0.249000 0.375000 +v 0.375000 -0.249000 -0.187500 +v -0.062500 -0.249000 -0.312500 +v -0.062500 -0.249000 -0.375000 +v 0.312500 -0.186500 0.000000 +v -0.187500 -0.186500 -0.062500 +v -0.187500 -0.186500 -0.125000 +v -0.312500 -0.186500 -0.187500 +v -0.250000 -0.186500 -0.187500 +v -0.187500 -0.186500 -0.250000 +v -0.187500 -0.186500 -0.187500 +v -0.062500 -0.186500 -0.312500 +v -0.125000 -0.124000 0.375000 +v -0.312500 -0.124000 0.312500 +v -0.250000 -0.124000 0.312500 +v 0.125000 -0.124000 0.250000 +v -0.250000 -0.124000 0.187500 +v -0.187500 -0.124000 0.125000 +v 0.000000 -0.124000 0.125000 +v -0.125000 -0.124000 0.000000 +v 0.062500 -0.124000 0.062500 +v -0.250000 -0.124000 -0.062500 +v 0.000000 -0.124000 -0.062500 +v 0.187500 -0.124000 0.000000 +v -0.312500 -0.124000 -0.125000 +v -0.187500 -0.124000 -0.125000 +v 0.125000 -0.124000 -0.125000 +v 0.312500 -0.124000 -0.125000 +v -0.250000 -0.124000 -0.250000 +v 0.000000 -0.124000 -0.250000 +v 0.125000 -0.124000 -0.312500 +v 0.125000 -0.061500 0.312500 +v -0.187500 -0.061500 0.250000 +v 0.250000 -0.061500 -0.187500 +v 0.000000 0.001000 -0.062500 +v -0.187500 0.001000 -0.250000 +v 0.062500 0.063500 0.312500 +v 0.000000 0.063500 0.125000 +v -0.125000 0.063500 0.062500 +v 0.125000 0.063500 0.062500 +v -0.062500 0.063500 -0.062500 +v -0.125000 0.063500 -0.125000 +v -0.062500 0.063500 -0.187500 +v 0.062500 0.063500 -0.187500 +v 0.125000 0.063500 -0.250000 +v 0.125000 0.063500 -0.187500 +v 0.000000 0.126000 0.187500 +v 0.062500 0.126000 0.187500 +v 0.000000 0.126000 -0.062500 +v 0.000000 0.126000 -0.125000 +v 0.187500 0.126000 -0.125000 +v -0.062500 0.188500 0.187500 +v 0.125000 0.188500 0.125000 +v -0.125000 0.188500 0.062500 +v 0.000000 0.251000 0.062500 +v 0.062500 0.251000 0.000000 +v -0.125000 0.251000 -0.062500 +v -0.062500 0.251000 0.000000 +v 0.062500 0.251000 -0.187500 +v -0.375000 -0.436500 0.437500 +v -0.250000 -0.436500 0.375000 +v 0.187500 -0.436500 0.375000 +v 0.375000 -0.436500 0.312500 +v 0.312500 -0.436500 0.312500 +v 0.312500 -0.436500 0.250000 +v -0.437500 -0.436500 0.187500 +v -0.250000 -0.436500 0.187500 +v -0.312500 -0.436500 0.125000 +v 0.375000 -0.436500 0.062500 +v 0.375000 -0.436500 -0.125000 +v -0.437500 -0.436500 -0.250000 +v -0.375000 -0.436500 -0.312500 +v 0.125000 -0.436500 -0.375000 +v 0.312500 -0.436500 -0.375000 +v 0.312500 -0.436500 -0.437500 +v -0.250000 -0.311500 0.500000 +v 0.375000 -0.311500 0.437500 +v 0.500000 -0.311500 0.500000 +v -0.375000 -0.311500 0.375000 +v -0.250000 -0.311500 0.437500 +v 0.250000 -0.311500 0.375000 +v -0.437500 -0.311500 0.375000 +v -0.062500 -0.311500 0.312500 +v 0.187500 -0.311500 0.312500 +v 0.437500 -0.311500 0.375000 +v 0.250000 -0.311500 0.312500 +v 0.312500 -0.311500 0.312500 +v -0.500000 -0.311500 0.187500 +v 0.312500 -0.311500 0.250000 +v 0.375000 -0.311500 0.250000 +v -0.375000 -0.311500 0.125000 +v 0.375000 -0.311500 0.187500 +v 0.312500 -0.311500 0.062500 +v 0.312500 -0.311500 0.000000 +v -0.312500 -0.311500 -0.062500 +v -0.312500 -0.311500 -0.187500 +v -0.500000 -0.311500 -0.312500 +v 0.375000 -0.311500 -0.312500 +v -0.437500 -0.311500 -0.375000 +v -0.312500 -0.311500 -0.437500 +v -0.250000 -0.311500 -0.375000 +v -0.312500 -0.311500 -0.500000 +v 0.312500 -0.311500 -0.500000 +v 0.187500 -0.249000 0.500000 +v 0.000000 -0.249000 0.312500 +v 0.250000 -0.249000 0.312500 +v 0.375000 -0.249000 0.062500 +v 0.312500 -0.249000 0.000000 +v 0.187500 -0.249000 -0.125000 +v 0.500000 -0.249000 -0.187500 +v 0.187500 -0.249000 -0.187500 +v 0.250000 -0.249000 -0.187500 +v 0.125000 -0.249000 -0.250000 +v -0.125000 -0.249000 -0.500000 +v -0.062500 -0.186500 0.375000 +v 0.250000 -0.186500 0.250000 +v -0.125000 -0.186500 0.000000 +v -0.187500 -0.186500 0.000000 +v -0.250000 -0.186500 -0.125000 +v -0.312500 -0.186500 -0.250000 +v -0.187500 -0.186500 -0.312500 +v 0.250000 -0.124000 0.375000 +v -0.062500 -0.124000 0.312500 +v 0.312500 -0.124000 0.250000 +v -0.187500 -0.124000 0.250000 +v 0.375000 -0.124000 0.187500 +v 0.250000 -0.124000 0.062500 +v -0.187500 -0.124000 -0.062500 +v -0.250000 -0.124000 -0.125000 +v -0.125000 -0.124000 -0.187500 +v -0.312500 -0.124000 -0.187500 +v -0.187500 -0.124000 -0.187500 +v -0.312500 -0.124000 -0.312500 +v -0.250000 -0.124000 -0.375000 +v -0.187500 -0.124000 -0.312500 +v -0.062500 -0.124000 -0.375000 +v 0.125000 -0.124000 -0.437500 +v -0.062500 -0.061500 0.375000 +v -0.375000 -0.061500 0.375000 +v -0.062500 -0.061500 0.312500 +v 0.125000 -0.061500 0.375000 +v 0.250000 -0.061500 0.375000 +v 0.250000 -0.061500 0.250000 +v 0.125000 -0.061500 0.062500 +v 0.187500 -0.061500 -0.062500 +v 0.375000 -0.061500 -0.062500 +v 0.312500 -0.061500 -0.125000 +v 0.000000 -0.061500 -0.250000 +v 0.312500 -0.061500 -0.250000 +v -0.062500 -0.061500 -0.375000 +v 0.000000 -0.061500 -0.312500 +v -0.312500 0.001000 0.000000 +v -0.312500 0.001000 -0.125000 +v -0.125000 0.001000 -0.062500 +v -0.125000 0.001000 -0.125000 +v 0.062500 0.001000 -0.187500 +v -0.312500 0.001000 -0.187500 +v -0.187500 0.001000 -0.312500 +v -0.062500 0.063500 0.250000 +v 0.000000 0.063500 0.250000 +v 0.250000 0.063500 0.187500 +v -0.187500 0.063500 0.062500 +v -0.250000 0.063500 -0.062500 +v 0.125000 0.126000 0.375000 +v 0.000000 0.126000 0.250000 +v -0.062500 0.126000 0.187500 +v 0.125000 0.126000 0.125000 +v -0.062500 0.126000 -0.062500 +v 0.125000 0.126000 -0.125000 +v 0.000000 0.126000 -0.187500 +v 0.125000 0.126000 -0.250000 +v 0.312500 0.126000 -0.250000 +v -0.062500 0.126000 -0.312500 +v 0.125000 0.126000 -0.312500 +v -0.062500 0.188500 0.000000 +v -0.062500 0.251000 0.187500 +v 0.062500 0.251000 0.187500 +v 0.250000 0.251000 0.250000 +v -0.062500 0.251000 0.125000 +v -0.187500 0.251000 0.000000 +v -0.062500 0.251000 -0.062500 +v 0.000000 0.251000 -0.125000 +v 0.250000 0.251000 -0.187500 +v -0.062500 0.376000 0.187500 +v 0.062500 0.376000 0.062500 +v -0.125000 0.376000 -0.062500 +v 0.125000 0.376000 -0.062500 +v 0.125000 0.376000 -0.187500 +vt 0.531250 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.468750 +vt 0.625000 0.312500 +vt 0.625000 0.343750 +vt 0.656250 0.343750 +vt 0.343750 0.437500 +vt 0.375000 0.406250 +vt 0.343750 0.343750 +vt 0.656250 0.375000 +vt 0.656250 0.406250 +vt 0.687500 0.406250 +vt 0.562500 0.593750 +vt 0.562500 0.562500 +vt 0.531250 0.562500 +vt 0.687500 0.656250 +vt 0.718750 0.625000 +vt 0.750000 0.718750 +vt 0.281250 0.375000 +vt 0.312500 0.343750 +vt 0.281250 0.343750 +vt 0.656250 0.625000 +vt 0.625000 0.625000 +vt 0.625000 0.593750 +vt 0.406250 0.375000 +vt 0.406250 0.406250 +vt 0.500000 0.406250 +vt 0.625000 0.468750 +vt 0.625000 0.437500 +vt 0.656250 0.437500 +vt 0.625000 0.312500 +vt 0.656250 0.343750 +vt 0.625000 0.406250 +vt 0.437500 0.500000 +vt 0.406250 0.531250 +vt 0.468750 0.531250 +vt 0.468750 0.343750 +vt 0.500000 0.375000 +vt 0.531250 0.343750 +vt 0.343750 0.343750 +vt 0.281250 0.375000 +vt 0.281250 0.343750 +vt 0.375000 0.593750 +vt 0.343750 0.593750 +vt 0.343750 0.531250 +vt 0.375000 0.531250 +vt 0.468750 0.531250 +vt 0.468750 0.593750 +vt 0.687500 0.375000 +vt 0.718750 0.343750 +vt 0.687500 0.343750 +vt 0.250000 0.437500 +vt 0.281250 0.437500 +vt 0.281250 0.406250 +vt 0.468750 0.437500 +vt 0.468750 0.468750 +vt 0.406250 0.468750 +vt 0.562500 0.625000 +vt 0.593750 0.625000 +vt 0.593750 0.593750 +vt 0.312500 0.312500 +vt 0.406250 0.406250 +vt 0.406250 0.312500 +vt 0.250000 0.312500 +vt 0.281250 0.343750 +vt 0.250000 0.406250 +vt 0.468750 0.343750 +vt 0.468750 0.312500 +vt 0.375000 0.312500 +vt 0.656250 0.312500 +vt 0.750000 0.406250 +vt 0.750000 0.312500 +vt 0.750000 0.312500 +vt 0.718750 0.343750 +vt 0.750000 0.437500 +vt 0.281250 0.437500 +vt 0.312500 0.406250 +vt 0.281250 0.406250 +vt 0.312500 0.437500 +vt 0.343750 0.406250 +vt 0.312500 0.406250 +vt 0.312500 0.437500 +vt 0.343750 0.406250 +vt 0.312500 0.406250 +vt 0.687500 0.343750 +vt 0.625000 0.375000 +vt 0.687500 0.375000 +vt 0.375000 0.437500 +vt 0.406250 0.406250 +vt 0.375000 0.406250 +vt 0.500000 0.687500 +vt 0.500000 0.625000 +vt 0.531250 0.656250 +vt 0.375000 0.406250 +vt 0.343750 0.343750 +vt 0.375000 0.343750 +vt 0.468750 0.437500 +vt 0.500000 0.406250 +vt 0.468750 0.406250 +vt 0.375000 0.625000 +vt 0.406250 0.562500 +vt 0.375000 0.562500 +vt 0.687500 0.437500 +vt 0.718750 0.406250 +vt 0.687500 0.406250 +vt 0.312500 0.375000 +vt 0.312500 0.406250 +vt 0.343750 0.406250 +vt 0.531250 0.625000 +vt 0.562500 0.562500 +vt 0.531250 0.562500 +vt 0.500000 0.500000 +vt 0.437500 0.468750 +vt 0.437500 0.500000 +vt 0.281250 0.406250 +vt 0.312500 0.312500 +vt 0.281250 0.312500 +vt 0.468750 0.562500 +vt 0.500000 0.500000 +vt 0.468750 0.500000 +vt 0.593750 0.468750 +vt 0.593750 0.437500 +vt 0.468750 0.531250 +vt 0.500000 0.437500 +vt 0.468750 0.437500 +vt 0.500000 0.500000 +vt 0.531250 0.531250 +vt 0.500000 0.562500 +vt 0.656250 0.468750 +vt 0.437500 0.406250 +vt 0.375000 0.500000 +vt 0.500000 0.687500 +vt 0.468750 0.687500 +vt 0.468750 0.750000 +vt 0.343750 0.500000 +vt 0.375000 0.468750 +vt 0.343750 0.468750 +vt 0.406250 0.437500 +vt 0.437500 0.437500 +vt 0.437500 0.406250 +vt 0.437500 0.406250 +vt 0.343750 0.500000 +vt 0.343750 0.406250 +vt 0.406250 0.750000 +vt 0.437500 0.687500 +vt 0.468750 0.750000 +vt 0.468750 0.468750 +vt 0.468750 0.437500 +vt 0.406250 0.468750 +vt 0.375000 0.500000 +vt 0.406250 0.437500 +vt 0.375000 0.437500 +vt 0.531250 0.468750 +vt 0.500000 0.468750 +vt 0.562500 0.687500 +vt 0.562500 0.656250 +vt 0.656250 0.656250 +vt 0.562500 0.500000 +vt 0.593750 0.468750 +vt 0.562500 0.468750 +vt 0.562500 0.500000 +vt 0.593750 0.437500 +vt 0.531250 0.406250 +vt 0.625000 0.500000 +vt 0.593750 0.437500 +vt 0.562500 0.500000 +vt 0.343750 0.656250 +vt 0.375000 0.625000 +vt 0.343750 0.593750 +vt 0.593750 0.500000 +vt 0.625000 0.468750 +vt 0.593750 0.468750 +vt 0.625000 0.500000 +vt 0.656250 0.468750 +vt 0.625000 0.468750 +vt 0.343750 0.531250 +vt 0.375000 0.500000 +vt 0.343750 0.500000 +vt 0.531250 0.687500 +vt 0.500000 0.750000 +vt 0.500000 0.687500 +vt 0.531250 0.500000 +vt 0.500000 0.406250 +vt 0.406250 0.437500 +vt 0.468750 0.500000 +vt 0.562500 0.562500 +vt 0.531250 0.593750 +vt 0.593750 0.562500 +vt 0.562500 0.531250 +vt 0.593750 0.500000 +vt 0.562500 0.500000 +vt 0.437500 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.468750 +vt 0.625000 0.531250 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.718750 0.406250 +vt 0.687500 0.343750 +vt 0.718750 0.343750 +vt 0.468750 0.312500 +vt 0.593750 0.437500 +vt 0.468750 0.437500 +vt 0.406250 0.531250 +vt 0.437500 0.593750 +vt 0.468750 0.531250 +vt 0.406250 0.500000 +vt 0.406250 0.531250 +vt 0.562500 0.750000 +vt 0.593750 0.687500 +vt 0.562500 0.687500 +vt 0.562500 0.562500 +vt 0.531250 0.593750 +vt 0.562500 0.625000 +vt 0.656250 0.562500 +vt 0.593750 0.500000 +vt 0.593750 0.562500 +vt 0.531250 0.562500 +vt 0.531250 0.531250 +vt 0.562500 0.562500 +vt 0.593750 0.531250 +vt 0.562500 0.531250 +vt 0.687500 0.375000 +vt 0.687500 0.406250 +vt 0.593750 0.406250 +vt 0.375000 0.468750 +vt 0.343750 0.468750 +vt 0.343750 0.437500 +vt 0.531250 0.625000 +vt 0.531250 0.531250 +vt 0.562500 0.531250 +vt 0.343750 0.593750 +vt 0.375000 0.593750 +vt 0.375000 0.562500 +vt 0.375000 0.500000 +vt 0.406250 0.531250 +vt 0.375000 0.562500 +vt 0.531250 0.500000 +vt 0.437500 0.500000 +vt 0.500000 0.562500 +vt 0.562500 0.500000 +vt 0.531250 0.531250 +vt 0.531250 0.500000 +vt 0.281250 0.437500 +vt 0.312500 0.468750 +vt 0.281250 0.500000 +vt 0.437500 0.562500 +vt 0.437500 0.531250 +vt 0.375000 0.625000 +vt 0.406250 0.593750 +vt 0.375000 0.593750 +vt 0.281250 0.343750 +vt 0.312500 0.343750 +vt 0.312500 0.375000 +vt 0.406250 0.625000 +vt 0.437500 0.593750 +vt 0.406250 0.593750 +vt 0.468750 0.656250 +vt 0.406250 0.593750 +vt 0.406250 0.656250 +vt 0.468750 0.687500 +vt 0.437500 0.750000 +vt 0.468750 0.687500 +vt 0.468750 0.718750 +vt 0.562500 0.718750 +vt 0.562500 0.687500 +vt 0.593750 0.625000 +vt 0.562500 0.625000 +vt 0.531250 0.656250 +vt 0.531250 0.625000 +vt 0.750000 0.406250 +vt 0.718750 0.375000 +vt 0.500000 0.593750 +vt 0.531250 0.593750 +vt 0.437500 0.406250 +vt 0.437500 0.375000 +vt 0.375000 0.375000 +vt 0.500000 0.687500 +vt 0.531250 0.656250 +vt 0.500000 0.656250 +vt 0.500000 0.687500 +vt 0.468750 0.687500 +vt 0.531250 0.687500 +vt 0.562500 0.656250 +vt 0.531250 0.656250 +vt 0.437500 0.687500 +vt 0.406250 0.687500 +vt 0.406250 0.750000 +vt 0.375000 0.500000 +vt 0.406250 0.437500 +vt 0.375000 0.437500 +vt 0.718750 0.406250 +vt 0.625000 0.312500 +vt 0.718750 0.312500 +vt 0.375000 0.406250 +vt 0.343750 0.343750 +vt 0.343750 0.406250 +vt 0.312500 0.343750 +vt 0.281250 0.375000 +vt 0.281250 0.343750 +vt 0.312500 0.343750 +vt 0.281250 0.375000 +vt 0.281250 0.343750 +vt 0.406250 0.375000 +vt 0.375000 0.343750 +vt 0.531250 0.468750 +vt 0.562500 0.468750 +vt 0.593750 0.406250 +vt 0.656250 0.343750 +vt 0.625000 0.375000 +vt 0.625000 0.343750 +vt 0.687500 0.343750 +vt 0.656250 0.375000 +vt 0.656250 0.343750 +vt 0.718750 0.500000 +vt 0.656250 0.437500 +vt 0.687500 0.406250 +vt 0.281250 0.406250 +vt 0.250000 0.437500 +vt 0.250000 0.312500 +vt 0.593750 0.656250 +vt 0.562500 0.593750 +vt 0.593750 0.593750 +vt 0.437500 0.625000 +vt 0.437500 0.656250 +vt 0.468750 0.593750 +vt 0.343750 0.375000 +vt 0.312500 0.375000 +vt 0.656250 0.406250 +vt 0.562500 0.406250 +vt 0.562500 0.437500 +vt 0.531250 0.437500 +vt 0.625000 0.406250 +vt 0.656250 0.343750 +vt 0.468750 0.468750 +vt 0.468750 0.500000 +vt 0.562500 0.500000 +vt 0.593750 0.406250 +vt 0.562500 0.343750 +vt 0.593750 0.343750 +vt 0.250000 0.406250 +vt 0.312500 0.375000 +vt 0.312500 0.343750 +vt 0.437500 0.312500 +vt 0.375000 0.312500 +vt 0.375000 0.343750 +vt 0.468750 0.625000 +vt 0.437500 0.593750 +vt 0.437500 0.656250 +vt 0.343750 0.406250 +vt 0.312500 0.437500 +vt 0.312500 0.406250 +vt 0.343750 0.406250 +vt 0.343750 0.437500 +vt 0.312500 0.437500 +vt 0.343750 0.437500 +vt 0.750000 0.312500 +vt 0.718750 0.343750 +vt 0.750000 0.406250 +vt 0.406250 0.406250 +vt 0.375000 0.437500 +vt 0.375000 0.406250 +vt 0.406250 0.500000 +vt 0.531250 0.687500 +vt 0.562500 0.687500 +vt 0.562500 0.656250 +vt 0.437500 0.406250 +vt 0.406250 0.437500 +vt 0.437500 0.468750 +vt 0.562500 0.437500 +vt 0.531250 0.500000 +vt 0.531250 0.406250 +vt 0.656250 0.406250 +vt 0.656250 0.468750 +vt 0.625000 0.437500 +vt 0.531250 0.593750 +vt 0.531250 0.531250 +vt 0.562500 0.625000 +vt 0.625000 0.593750 +vt 0.656250 0.625000 +vt 0.593750 0.406250 +vt 0.625000 0.468750 +vt 0.625000 0.343750 +vt 0.343750 0.500000 +vt 0.312500 0.531250 +vt 0.375000 0.531250 +vt 0.343750 0.500000 +vt 0.406250 0.562500 +vt 0.343750 0.562500 +vt 0.750000 0.406250 +vt 0.718750 0.437500 +vt 0.718750 0.406250 +vt 0.343750 0.437500 +vt 0.312500 0.468750 +vt 0.312500 0.437500 +vt 0.531250 0.281250 +vt 0.500000 0.281250 +vt 0.468750 0.250000 +vt 0.593750 0.531250 +vt 0.593750 0.500000 +vt 0.625000 0.500000 +vt 0.593750 0.531250 +vt 0.562500 0.531250 +vt 0.562500 0.500000 +vt 0.687500 0.437500 +vt 0.656250 0.468750 +vt 0.656250 0.437500 +vt 0.531250 0.500000 +vt 0.562500 0.500000 +vt 0.343750 0.468750 +vt 0.312500 0.500000 +vt 0.312500 0.468750 +vt 0.406250 0.468750 +vt 0.375000 0.500000 +vt 0.375000 0.468750 +vt 0.437500 0.437500 +vt 0.375000 0.500000 +vt 0.437500 0.531250 +vt 0.500000 0.562500 +vt 0.500000 0.593750 +vt 0.562500 0.343750 +vt 0.593750 0.375000 +vt 0.625000 0.343750 +vt 0.593750 0.437500 +vt 0.625000 0.406250 +vt 0.687500 0.468750 +vt 0.718750 0.500000 +vt 0.343750 0.500000 +vt 0.312500 0.531250 +vt 0.312500 0.500000 +vt 0.375000 0.531250 +vt 0.718750 0.687500 +vt 0.687500 0.656250 +vt 0.656250 0.687500 +vt 0.375000 0.625000 +vt 0.375000 0.531250 +vt 0.406250 0.531250 +vt 0.656250 0.750000 +vt 0.656250 0.718750 +vt 0.593750 0.281250 +vt 0.687500 0.281250 +vt 0.625000 0.593750 +vt 0.593750 0.593750 +vt 0.656250 0.625000 +vt 0.500000 0.343750 +vt 0.468750 0.281250 +vt 0.468750 0.343750 +vt 0.593750 0.562500 +vt 0.562500 0.562500 +vt 0.562500 0.531250 +vt 0.656250 0.500000 +vt 0.625000 0.531250 +vt 0.625000 0.500000 +vt 0.687500 0.500000 +vt 0.656250 0.531250 +vt 0.406250 0.531250 +vt 0.375000 0.500000 +vt 0.468750 0.593750 +vt 0.375000 0.593750 +vt 0.375000 0.312500 +vt 0.312500 0.281250 +vt 0.437500 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.406250 +vt 0.437500 0.343750 +vt 0.406250 0.343750 +vt 0.312500 0.625000 +vt 0.312500 0.531250 +vt 0.500000 0.593750 +vt 0.500000 0.562500 +vt 0.656250 0.468750 +vt 0.625000 0.468750 +vt 0.625000 0.406250 +vt 0.656250 0.531250 +vt 0.625000 0.593750 +vt 0.656250 0.625000 +vt 0.687500 0.500000 +vt 0.656250 0.406250 +vt 0.625000 0.437500 +vt 0.562500 0.687500 +vt 0.531250 0.687500 +vt 0.531250 0.750000 +vt 0.437500 0.593750 +vt 0.531250 0.562500 +vt 0.687500 0.406250 +vt 0.656250 0.343750 +vt 0.687500 0.343750 +vt 0.312500 0.312500 +vt 0.343750 0.343750 +vt 0.437500 0.312500 +vt 0.593750 0.593750 +vt 0.562500 0.625000 +vt 0.562500 0.593750 +vt 0.500000 0.500000 +vt 0.531250 0.437500 +vt 0.562500 0.468750 +vt 0.437500 0.625000 +vt 0.406250 0.656250 +vt 0.406250 0.625000 +vt 0.406250 0.656250 +vt 0.406250 0.625000 +vt 0.656250 0.406250 +vt 0.656250 0.312500 +vt 0.687500 0.343750 +vt 0.500000 0.687500 +vt 0.500000 0.593750 +vt 0.531250 0.625000 +vt 0.562500 0.656250 +vt 0.531250 0.593750 +vt 0.562500 0.593750 +vt 0.437500 0.656250 +vt 0.406250 0.656250 +vt 0.406250 0.593750 +vt 0.468750 0.593750 +vt 0.468750 0.687500 +vt 0.531250 0.656250 +vt 0.500000 0.656250 +vt 0.531250 0.750000 +vt 0.562500 0.687500 +vt 0.593750 0.750000 +vt 0.312500 0.437500 +vt 0.281250 0.343750 +vt 0.312500 0.343750 +vt 0.343750 0.500000 +vt 0.343750 0.468750 +vt 0.375000 0.468750 +vt 0.625000 0.593750 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.312500 0.531250 +vt 0.343750 0.531250 +vt 0.343750 0.500000 +vt 0.500000 0.562500 +vt 0.562500 0.500000 +vt 0.437500 0.500000 +vt 0.406250 0.343750 +vt 0.437500 0.343750 +vt 0.750000 0.406250 +vt 0.718750 0.406250 +vt 0.718750 0.343750 +vt 0.312500 0.343750 +vt 0.281250 0.375000 +vt 0.281250 0.343750 +vt 0.375000 0.343750 +vt 0.468750 0.312500 +vt 0.468750 0.343750 +vt 0.406250 0.406250 +vt 0.375000 0.343750 +vt 0.406250 0.343750 +vt 0.718750 0.406250 +vt 0.687500 0.343750 +vt 0.312500 0.625000 +vt 0.343750 0.625000 +vt 0.343750 0.593750 +vt 0.718750 0.375000 +vt 0.656250 0.343750 +vt 0.718750 0.343750 +vt 0.375000 0.406250 +vt 0.281250 0.312500 +vt 0.375000 0.312500 +vt 0.593750 0.500000 +vt 0.687500 0.406250 +vt 0.687500 0.343750 +vt 0.718750 0.375000 +vt 0.687500 0.406250 +vt 0.687500 0.375000 +vt 0.593750 0.625000 +vt 0.593750 0.531250 +vt 0.562500 0.531250 +vt 0.406250 0.625000 +vt 0.375000 0.687500 +vt 0.375000 0.500000 +vt 0.468750 0.500000 +vt 0.437500 0.437500 +vt 0.750000 0.406250 +vt 0.718750 0.375000 +vt 0.718750 0.343750 +vt 0.375000 0.593750 +vt 0.375000 0.531250 +vt 0.375000 0.406250 +vt 0.281250 0.406250 +vt 0.343750 0.375000 +vt 0.312500 0.406250 +vt 0.437500 0.437500 +vt 0.437500 0.468750 +vt 0.468750 0.406250 +vt 0.437500 0.406250 +vt 0.593750 0.562500 +vt 0.625000 0.406250 +vt 0.593750 0.437500 +vt 0.593750 0.406250 +vt 0.656250 0.406250 +vt 0.625000 0.437500 +vt 0.625000 0.406250 +vt 0.593750 0.437500 +vt 0.593750 0.406250 +vt 0.656250 0.437500 +vt 0.656250 0.406250 +vt 0.687500 0.437500 +vt 0.343750 0.406250 +vt 0.375000 0.406250 +vt 0.375000 0.437500 +vt 0.343750 0.437500 +vt 0.406250 0.500000 +vt 0.375000 0.531250 +vt 0.406250 0.531250 +vt 0.468750 0.437500 +vt 0.406250 0.468750 +vt 0.375000 0.343750 +vt 0.625000 0.312500 +vt 0.593750 0.312500 +vt 0.687500 0.468750 +vt 0.656250 0.468750 +vt 0.656250 0.437500 +vt 0.656250 0.468750 +vt 0.687500 0.500000 +vt 0.437500 0.343750 +vt 0.468750 0.406250 +vt 0.687500 0.562500 +vt 0.687500 0.468750 +vt 0.718750 0.593750 +vt 0.375000 0.468750 +vt 0.375000 0.437500 +vt 0.562500 0.437500 +vt 0.468750 0.437500 +vt 0.468750 0.406250 +vt 0.687500 0.531250 +vt 0.687500 0.656250 +vt 0.625000 0.468750 +vt 0.593750 0.500000 +vt 0.593750 0.468750 +vt 0.468750 0.468750 +vt 0.656250 0.468750 +vt 0.625000 0.468750 +vt 0.406250 0.468750 +vt 0.406250 0.468750 +vt 0.375000 0.500000 +vt 0.375000 0.468750 +vt 0.406250 0.593750 +vt 0.437500 0.593750 +vt 0.437500 0.656250 +vt 0.375000 0.468750 +vt 0.343750 0.500000 +vt 0.343750 0.468750 +vt 0.375000 0.343750 +vt 0.406250 0.375000 +vt 0.468750 0.375000 +vt 0.406250 0.468750 +vt 0.375000 0.500000 +vt 0.531250 0.531250 +vt 0.437500 0.531250 +vt 0.468750 0.437500 +vt 0.437500 0.500000 +vt 0.406250 0.500000 +vt 0.406250 0.468750 +vt 0.343750 0.375000 +vt 0.406250 0.500000 +vt 0.375000 0.531250 +vt 0.375000 0.500000 +vt 0.562500 0.531250 +vt 0.562500 0.500000 +vt 0.500000 0.593750 +vt 0.500000 0.687500 +vt 0.656250 0.500000 +vt 0.562500 0.531250 +vt 0.562500 0.500000 +vt 0.593750 0.500000 +vt 0.562500 0.531250 +vt 0.625000 0.437500 +vt 0.500000 0.312500 +vt 0.500000 0.437500 +vt 0.406250 0.562500 +vt 0.437500 0.531250 +vt 0.468750 0.562500 +vt 0.562500 0.531250 +vt 0.468750 0.468750 +vt 0.562500 0.437500 +vt 0.468750 0.656250 +vt 0.500000 0.593750 +vt 0.468750 0.593750 +vt 0.500000 0.406250 +vt 0.406250 0.562500 +vt 0.375000 0.500000 +vt 0.406250 0.500000 +vt 0.375000 0.562500 +vt 0.343750 0.500000 +vt 0.531250 0.500000 +vt 0.562500 0.531250 +vt 0.531250 0.562500 +vt 0.625000 0.500000 +vt 0.562500 0.531250 +vt 0.593750 0.437500 +vt 0.562500 0.500000 +vt 0.625000 0.468750 +vt 0.500000 0.406250 +vt 0.531250 0.437500 +vt 0.531250 0.406250 +vt 0.656250 0.406250 +vt 0.687500 0.343750 +vt 0.656250 0.343750 +vt 0.562500 0.312500 +vt 0.593750 0.343750 +vt 0.500000 0.593750 +vt 0.468750 0.500000 +vt 0.500000 0.500000 +vt 0.250000 0.406250 +vt 0.250000 0.312500 +vt 0.281250 0.343750 +vt 0.500000 0.531250 +vt 0.562500 0.593750 +vt 0.468750 0.593750 +vt 0.437500 0.531250 +vt 0.468750 0.531250 +vt 0.468750 0.562500 +vt 0.437500 0.593750 +vt 0.437500 0.562500 +vt 0.406250 0.562500 +vt 0.375000 0.593750 +vt 0.375000 0.562500 +vt 0.593750 0.562500 +vt 0.593750 0.531250 +vt 0.656250 0.531250 +vt 0.656250 0.500000 +vt 0.562500 0.625000 +vt 0.531250 0.562500 +vt 0.562500 0.562500 +vt 0.531250 0.656250 +vt 0.531250 0.625000 +vt 0.281250 0.406250 +vt 0.312500 0.437500 +vt 0.250000 0.437500 +vt 0.500000 0.500000 +vt 0.468750 0.468750 +vt 0.562500 0.468750 +vt 0.500000 0.593750 +vt 0.468750 0.625000 +vt 0.468750 0.656250 +vt 0.468750 0.625000 +vt 0.593750 0.687500 +vt 0.562500 0.593750 +vt 0.562500 0.687500 +vt 0.562500 0.343750 +vt 0.531250 0.687500 +vt 0.500000 0.593750 +vt 0.468750 0.625000 +vt 0.468750 0.593750 +vt 0.625000 0.625000 +vt 0.562500 0.562500 +vt 0.562500 0.625000 +vt 0.531250 0.656250 +vt 0.531250 0.625000 +vt 0.625000 0.687500 +vt 0.593750 0.593750 +vt 0.625000 0.593750 +vt 0.562500 0.625000 +vt 0.531250 0.593750 +vt 0.531250 0.750000 +vt 0.593750 0.750000 +vt 0.406250 0.625000 +vt 0.500000 0.687500 +vt 0.406250 0.687500 +vt 0.656250 0.593750 +vt 0.625000 0.593750 +vt 0.625000 0.531250 +vt 0.625000 0.500000 +vt 0.562500 0.406250 +vt 0.625000 0.406250 +vt 0.562500 0.625000 +vt 0.593750 0.656250 +vt 0.750000 0.406250 +vt 0.718750 0.406250 +vt 0.718750 0.343750 +vt 0.468750 0.656250 +vt 0.437500 0.687500 +vt 0.593750 0.656250 +vt 0.562500 0.656250 +vt 0.468750 0.593750 +vt 0.406250 0.562500 +vt 0.406250 0.593750 +vt 0.437500 0.687500 +vt 0.406250 0.687500 +vt 0.625000 0.406250 +vt 0.468750 0.562500 +vt 0.468750 0.593750 +vt 0.625000 0.406250 +vt 0.625000 0.312500 +vt 0.312500 0.375000 +vt 0.375000 0.375000 +vt 0.718750 0.343750 +vt 0.687500 0.343750 +vt 0.281250 0.375000 +vt 0.625000 0.312500 +vt 0.500000 0.406250 +vt 0.437500 0.312500 +vt 0.375000 0.500000 +vt 0.406250 0.500000 +vt 0.343750 0.718750 +vt 0.281250 0.687500 +vt 0.281250 0.718750 +vt 0.687500 0.406250 +vt 0.687500 0.437500 +vt 0.656250 0.437500 +vt 0.656250 0.468750 +vt 0.656250 0.375000 +vt 0.687500 0.406250 +vt 0.687500 0.375000 +vt 0.281250 0.406250 +vt 0.312500 0.343750 +vt 0.687500 0.343750 +vt 0.625000 0.406250 +vt 0.656250 0.375000 +vt 0.562500 0.343750 +vt 0.531250 0.531250 +vt 0.500000 0.562500 +vt 0.437500 0.437500 +vt 0.562500 0.437500 +vt 0.562500 0.406250 +vt 0.593750 0.437500 +vt 0.468750 0.437500 +vt 0.468750 0.406250 +vt 0.593750 0.343750 +vt 0.593750 0.375000 +vt 0.625000 0.375000 +vt 0.656250 0.468750 +vt 0.656250 0.406250 +vt 0.656250 0.406250 +vt 0.687500 0.406250 +vt 0.687500 0.375000 +vt 0.250000 0.406250 +vt 0.750000 0.437500 +vt 0.281250 0.312500 +vt 0.250000 0.312500 +vt 0.468750 0.656250 +vt 0.500000 0.687500 +vt 0.500000 0.593750 +vt 0.656250 0.343750 +vt 0.750000 0.406250 +vt 0.625000 0.656250 +vt 0.562500 0.687500 +vt 0.562500 0.656250 +vt 0.343750 0.406250 +vt 0.343750 0.375000 +vt 0.312500 0.375000 +vt 0.437500 0.750000 +vt 0.468750 0.687500 +vt 0.468750 0.750000 +vt 0.625000 0.312500 +vt 0.625000 0.406250 +vt 0.531250 0.437500 +vt 0.562500 0.406250 +vt 0.531250 0.406250 +vt 0.687500 0.375000 +vt 0.718750 0.437500 +vt 0.687500 0.343750 +vt 0.406250 0.343750 +vt 0.468750 0.625000 +vt 0.500000 0.656250 +vt 0.437500 0.656250 +vt 0.312500 0.437500 +vt 0.343750 0.406250 +vt 0.312500 0.406250 +vt 0.312500 0.406250 +vt 0.281250 0.406250 +vt 0.468750 0.406250 +vt 0.406250 0.375000 +vt 0.500000 0.375000 +vt 0.437500 0.500000 +vt 0.437500 0.468750 +vt 0.406250 0.468750 +vt 0.468750 0.437500 +vt 0.500000 0.406250 +vt 0.468750 0.406250 +vt 0.343750 0.468750 +vt 0.343750 0.343750 +vt 0.656250 0.437500 +vt 0.312500 0.437500 +vt 0.593750 0.437500 +vt 0.687500 0.437500 +vt 0.718750 0.406250 +vt 0.750000 0.437500 +vt 0.406250 0.375000 +vt 0.375000 0.343750 +vt 0.468750 0.343750 +vt 0.343750 0.312500 +vt 0.250000 0.406250 +vt 0.250000 0.312500 +vt 0.625000 0.500000 +vt 0.656250 0.468750 +vt 0.625000 0.468750 +vt 0.250000 0.406250 +vt 0.250000 0.312500 +vt 0.406250 0.500000 +vt 0.406250 0.468750 +vt 0.625000 0.437500 +vt 0.593750 0.437500 +vt 0.656250 0.500000 +vt 0.562500 0.531250 +vt 0.687500 0.531250 +vt 0.312500 0.375000 +vt 0.406250 0.375000 +vt 0.500000 0.500000 +vt 0.375000 0.468750 +vt 0.593750 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.468750 +vt 0.687500 0.312500 +vt 0.750000 0.406250 +vt 0.687500 0.406250 +vt 0.468750 0.468750 +vt 0.468750 0.500000 +vt 0.531250 0.531250 +vt 0.406250 0.500000 +vt 0.562500 0.406250 +vt 0.281250 0.500000 +vt 0.375000 0.468750 +vt 0.593750 0.500000 +vt 0.406250 0.531250 +vt 0.531250 0.500000 +vt 0.625000 0.531250 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.531250 0.625000 +vt 0.687500 0.375000 +vt 0.687500 0.406250 +vt 0.593750 0.531250 +vt 0.625000 0.625000 +vt 0.562500 0.562500 +vt 0.406250 0.500000 +vt 0.343750 0.562500 +vt 0.406250 0.562500 +vt 0.437500 0.562500 +vt 0.468750 0.531250 +vt 0.437500 0.531250 +vt 0.500000 0.406250 +vt 0.593750 0.375000 +vt 0.562500 0.406250 +vt 0.468750 0.593750 +vt 0.468750 0.531250 +vt 0.718750 0.406250 +vt 0.687500 0.468750 +vt 0.718750 0.500000 +vt 0.562500 0.625000 +vt 0.500000 0.625000 +vt 0.687500 0.406250 +vt 0.656250 0.437500 +vt 0.687500 0.468750 +vt 0.281250 0.437500 +vt 0.593750 0.406250 +vt 0.500000 0.343750 +vt 0.625000 0.343750 +vt 0.468750 0.562500 +vt 0.437500 0.562500 +vt 0.406250 0.593750 +vt 0.468750 0.593750 +vt 0.500000 0.625000 +vt 0.500000 0.562500 +vt 0.531250 0.562500 +vt 0.468750 0.531250 +vt 0.500000 0.625000 +vt 0.500000 0.593750 +vt 0.468750 0.593750 +vt 0.531250 0.500000 +vt 0.437500 0.656250 +vt 0.625000 0.687500 +vt 0.406250 0.500000 +vt 0.406250 0.468750 +vt 0.500000 0.437500 +vt 0.562500 0.625000 +vt 0.500000 0.531250 +vt 0.500000 0.687500 +vt 0.531250 0.687500 +vt 0.468750 0.656250 +vt 0.437500 0.656250 +vt 0.593750 0.593750 +vt 0.593750 0.656250 +vt 0.562500 0.656250 +vt 0.406250 0.593750 +vt 0.500000 0.687500 +vt 0.500000 0.750000 +vt 0.437500 0.687500 +vt 0.468750 0.656250 +vt 0.531250 0.687500 +vt 0.562500 0.750000 +vt 0.562500 0.687500 +vt 0.687500 0.406250 +vt 0.562500 0.562500 +vt 0.593750 0.593750 +vt 0.406250 0.500000 +vt 0.593750 0.406250 +vt 0.531250 0.437500 +vt 0.531250 0.406250 +vt 0.312500 0.593750 +vt 0.343750 0.531250 +vt 0.312500 0.531250 +vt 0.593750 0.406250 +vt 0.593750 0.343750 +vt 0.375000 0.625000 +vt 0.375000 0.437500 +vt 0.281250 0.500000 +vt 0.718750 0.343750 +vt 0.750000 0.250000 +vt 0.687500 0.281250 +vt 0.562500 0.468750 +vt 0.593750 0.468750 +vt 0.531250 0.687500 +vt 0.625000 0.562500 +vt 0.625000 0.500000 +vt 0.500000 0.437500 +vt 0.437500 0.468750 +vt 0.437500 0.437500 +vt 0.406250 0.406250 +vt 0.375000 0.406250 +vt 0.593750 0.562500 +vt 0.625000 0.531250 +vt 0.375000 0.687500 +vt 0.406250 0.687500 +vt 0.687500 0.312500 +vt 0.718750 0.281250 +vt 0.687500 0.281250 +vt 0.437500 0.343750 +vt 0.468750 0.312500 +vt 0.437500 0.312500 +vt 0.593750 0.343750 +vt 0.625000 0.312500 +vt 0.593750 0.312500 +vt 0.312500 0.500000 +vt 0.343750 0.437500 +vt 0.312500 0.437500 +vt 0.687500 0.468750 +vt 0.718750 0.406250 +vt 0.687500 0.406250 +vt 0.406250 0.500000 +vt 0.406250 0.437500 +vt 0.625000 0.593750 +vt 0.656250 0.562500 +vt 0.687500 0.593750 +vt 0.625000 0.468750 +vt 0.656250 0.406250 +vt 0.718750 0.375000 +vt 0.687500 0.375000 +vt 0.406250 0.500000 +vt 0.343750 0.531250 +vt 0.343750 0.500000 +vt 0.687500 0.531250 +vt 0.718750 0.468750 +vt 0.687500 0.500000 +vt 0.281250 0.500000 +vt 0.312500 0.531250 +vt 0.343750 0.500000 +vt 0.468750 0.312500 +vt 0.468750 0.281250 +vt 0.437500 0.281250 +vt 0.656250 0.625000 +vt 0.375000 0.687500 +vt 0.375000 0.656250 +vt 0.312500 0.656250 +vt 0.312500 0.656250 +vt 0.343750 0.656250 +vt 0.343750 0.625000 +vt 0.500000 0.312500 +vt 0.531250 0.343750 +vt 0.562500 0.312500 +vt 0.531250 0.312500 +vt 0.593750 0.343750 +vt 0.625000 0.312500 +vt 0.593750 0.312500 +vt 0.593750 0.406250 +vt 0.562500 0.406250 +vt 0.562500 0.468750 +vt 0.656250 0.500000 +vt 0.687500 0.468750 +vt 0.656250 0.468750 +vt 0.656250 0.593750 +vt 0.687500 0.531250 +vt 0.656250 0.531250 +vt 0.375000 0.500000 +vt 0.281250 0.625000 +vt 0.281250 0.593750 +vt 0.437500 0.718750 +vt 0.468750 0.687500 +vt 0.437500 0.687500 +vt 0.625000 0.500000 +vt 0.562500 0.375000 +vt 0.593750 0.406250 +vt 0.625000 0.375000 +vt 0.343750 0.593750 +vt 0.375000 0.562500 +vt 0.343750 0.562500 +vt 0.468750 0.687500 +vt 0.468750 0.656250 +vt 0.406250 0.656250 +vt 0.562500 0.687500 +vt 0.468750 0.656250 +vt 0.312500 0.531250 +vt 0.437500 0.406250 +vt 0.437500 0.343750 +vt 0.468750 0.312500 +vt 0.437500 0.312500 +vt 0.750000 0.468750 +vt 0.687500 0.500000 +vt 0.468750 0.406250 +vt 0.531250 0.375000 +vt 0.437500 0.375000 +vt 0.531250 0.468750 +vt 0.562500 0.406250 +vt 0.531250 0.406250 +vt 0.625000 0.406250 +vt 0.375000 0.406250 +vt 0.406250 0.406250 +vt 0.406250 0.375000 +vt 0.375000 0.531250 +vt 0.625000 0.562500 +vt 0.656250 0.531250 +vt 0.625000 0.531250 +vt 0.375000 0.593750 +vt 0.406250 0.562500 +vt 0.375000 0.562500 +vt 0.406250 0.531250 +vt 0.437500 0.562500 +vt 0.468750 0.656250 +vt 0.500000 0.625000 +vt 0.468750 0.625000 +vt 0.531250 0.312500 +vt 0.468750 0.343750 +vt 0.531250 0.343750 +vt 0.437500 0.437500 +vt 0.406250 0.437500 +vt 0.531250 0.375000 +vt 0.562500 0.343750 +vt 0.562500 0.625000 +vt 0.656250 0.500000 +vt 0.687500 0.468750 +vt 0.718750 0.437500 +vt 0.437500 0.500000 +vt 0.468750 0.468750 +vt 0.437500 0.468750 +vt 0.406250 0.531250 +vt 0.406250 0.500000 +vt 0.375000 0.531250 +vt 0.468750 0.562500 +vt 0.500000 0.531250 +vt 0.468750 0.531250 +vt 0.375000 0.625000 +vt 0.406250 0.593750 +vt 0.375000 0.593750 +vt 0.437500 0.562500 +vt 0.437500 0.531250 +vt 0.406250 0.531250 +vt 0.468750 0.437500 +vt 0.500000 0.406250 +vt 0.468750 0.406250 +vt 0.437500 0.468750 +vt 0.437500 0.437500 +vt 0.562500 0.500000 +vt 0.593750 0.468750 +vt 0.562500 0.468750 +vt 0.468750 0.500000 +vt 0.593750 0.406250 +vt 0.562500 0.656250 +vt 0.500000 0.656250 +vt 0.531250 0.406250 +vt 0.562500 0.375000 +vt 0.531250 0.375000 +vt 0.500000 0.437500 +vt 0.500000 0.406250 +vt 0.500000 0.562500 +vt 0.531250 0.531250 +vt 0.500000 0.531250 +vt 0.468750 0.593750 +vt 0.468750 0.562500 +vt 0.593750 0.562500 +vt 0.562500 0.562500 +vt 0.312500 0.437500 +vt 0.437500 0.437500 +vt 0.468750 0.406250 +vt 0.437500 0.406250 +vt 0.531250 0.406250 +vt 0.531250 0.437500 +vt 0.562500 0.437500 +vt 0.437500 0.500000 +vt 0.468750 0.468750 +vt 0.437500 0.468750 +vt 0.562500 0.562500 +vt 0.593750 0.531250 +vt 0.562500 0.531250 +vt 0.468750 0.437500 +vt 0.500000 0.406250 +vt 0.500000 0.468750 +vt 0.531250 0.437500 +vt 0.500000 0.437500 +vt 0.531250 0.500000 +vt 0.562500 0.468750 +vt 0.531250 0.468750 +vt 0.468750 0.500000 +vt 0.437500 0.500000 +vt 0.562500 0.531250 +vt 0.562500 0.500000 +vt 0.531250 0.562500 +vt 0.531250 0.531250 +vt 0.500000 0.562500 +vt 0.500000 0.531250 +vt 0.468750 0.531250 +vt 0.562500 0.625000 +vt 0.468750 0.593750 +vt 0.468750 0.625000 +vt 0.593750 0.406250 +vt 0.625000 0.375000 +vt 0.531250 0.375000 +vt 0.531250 0.468750 +vt 0.437500 0.468750 +vt 0.625000 0.656250 +vt 0.562500 0.687500 +vt 0.625000 0.687500 +vt 0.468750 0.562500 +vt 0.312500 0.625000 +vt 0.312500 0.500000 +vt 0.343750 0.625000 +vt 0.656250 0.687500 +vt 0.656250 0.656250 +vt 0.687500 0.656250 +vt 0.312500 0.531250 +vt 0.281250 0.312500 +vt 0.281250 0.406250 +vt 0.593750 0.531250 +vt 0.625000 0.375000 +vt 0.656250 0.375000 +vt 0.375000 0.437500 +vt 0.375000 0.406250 +vt 0.718750 0.406250 +vt 0.750000 0.375000 +vt 0.656250 0.468750 +vt 0.625000 0.500000 +vt 0.468750 0.312500 +vt 0.500000 0.406250 +vt 0.250000 0.406250 +vt 0.343750 0.312500 +vt 0.250000 0.312500 +vt 0.562500 0.500000 +vt 0.250000 0.750000 +vt 0.281250 0.687500 +vt 0.343750 0.718750 +vt 0.468750 0.625000 +vt 0.375000 0.625000 +vt 0.468750 0.343750 +vt 0.625000 0.406250 +vt 0.656250 0.375000 +vt 0.562500 0.343750 +vt 0.250000 0.625000 +vt 0.250000 0.500000 +vt 0.593750 0.593750 +vt 0.593750 0.562500 +vt 0.625000 0.593750 +vt 0.406250 0.531250 +vt 0.406250 0.500000 +vt 0.468750 0.312500 +vt 0.437500 0.343750 +vt 0.437500 0.312500 +vt 0.625000 0.375000 +vt 0.593750 0.406250 +vt 0.593750 0.375000 +vt 0.406250 0.500000 +vt 0.375000 0.531250 +vt 0.375000 0.593750 +vt 0.406250 0.625000 +vt 0.375000 0.656250 +vt 0.375000 0.625000 +vt 0.625000 0.468750 +vt 0.437500 0.437500 +vt 0.718750 0.500000 +vt 0.562500 0.375000 +vt 0.406250 0.406250 +vt 0.406250 0.375000 +vt 0.468750 0.718750 +vt 0.562500 0.718750 +vt 0.562500 0.750000 +vt 0.468750 0.343750 +vt 0.656250 0.562500 +vt 0.656250 0.500000 +vt 0.593750 0.562500 +vt 0.406250 0.593750 +vt 0.343750 0.531250 +vt 0.250000 0.406250 +vt 0.468750 0.687500 +vt 0.375000 0.687500 +vt 0.406250 0.656250 +vt 0.375000 0.625000 +vt 0.375000 0.343750 +vt 0.312500 0.312500 +vt 0.437500 0.312500 +vt 0.406250 0.656250 +vt 0.343750 0.656250 +vt 0.500000 0.500000 +vt 0.593750 0.500000 +vt 0.468750 0.375000 +vt 0.437500 0.406250 +vt 0.437500 0.375000 +vt 0.406250 0.562500 +vt 0.343750 0.406250 +vt 0.343750 0.375000 +vt 0.312500 0.375000 +vt 0.468750 0.562500 +vt 0.437500 0.593750 +vt 0.437500 0.562500 +vt 0.593750 0.562500 +vt 0.343750 0.562500 +vt 0.343750 0.500000 +vt 0.437500 0.625000 +vt 0.406250 0.531250 +vt 0.343750 0.625000 +vt 0.593750 0.468750 +vt 0.593750 0.406250 +vt 0.562500 0.375000 +vt 0.531250 0.375000 +vt 0.468750 0.687500 +vt 0.562500 0.687500 +vt 0.437500 0.531250 +vt 0.468750 0.593750 +vt 0.531250 0.593750 +vt 0.468750 0.375000 +vt 0.437500 0.406250 +vt 0.531250 0.500000 +vt 0.531250 0.468750 +vt 0.593750 0.500000 +vt 0.468750 0.437500 +vt 0.468750 0.406250 +vt 0.562500 0.406250 +vt 0.531250 0.437500 +vt 0.468750 0.531250 +vt 0.562500 0.531250 +vt 0.531250 0.562500 +vt 0.468750 0.500000 +vt 0.437500 0.531250 +vt 0.531250 0.406250 +vt 0.531250 0.468750 +vt 0.500000 0.468750 +vt 0.593750 0.468750 +vt 0.593750 0.531250 +vt 0.562500 0.531250 +vt 0.500000 0.437500 +vt 0.531250 0.437500 +vt 0.687500 0.343750 +vt 0.718750 0.343750 +vt 0.718750 0.312500 +vt 0.375000 0.343750 +vt 0.687500 0.343750 +vt 0.625000 0.343750 +vt 0.468750 0.593750 +vt 0.656250 0.687500 +vt 0.656250 0.656250 +vt 0.687500 0.625000 +vt 0.718750 0.593750 +vt 0.750000 0.625000 +vt 0.312500 0.375000 +vt 0.500000 0.312500 +vt 0.406250 0.312500 +vt 0.656250 0.500000 +vt 0.625000 0.500000 +vt 0.656250 0.312500 +vt 0.468750 0.437500 +vt 0.531250 0.375000 +vt 0.343750 0.375000 +vt 0.468750 0.625000 +vt 0.375000 0.625000 +vt 0.281250 0.312500 +vt 0.250000 0.312500 +vt 0.343750 0.406250 +vt 0.406250 0.437500 +vt 0.468750 0.406250 +vt 0.500000 0.468750 +vt 0.468750 0.500000 +vt 0.593750 0.562500 +vt 0.562500 0.562500 +vt 0.312500 0.406250 +vt 0.281250 0.312500 +vt 0.656250 0.406250 +vt 0.718750 0.312500 +vt 0.343750 0.437500 +vt 0.625000 0.343750 +vt 0.531250 0.625000 +vt 0.531250 0.687500 +vt 0.531250 0.750000 +vt 0.468750 0.750000 +vt 0.468750 0.687500 +vt 0.343750 0.406250 +vt 0.500000 0.437500 +vt 0.406250 0.625000 +vt 0.343750 0.343750 +vt 0.281250 0.343750 +vt 0.281250 0.375000 +vt 0.500000 0.468750 +vt 0.312500 0.406250 +vt 0.500000 0.562500 +vt 0.500000 0.531250 +vt 0.531250 0.562500 +vt 0.375000 0.343750 +vt 0.375000 0.312500 +vt 0.500000 0.406250 +vt 0.531250 0.750000 +vt 0.531250 0.687500 +vt 0.468750 0.656250 +vt 0.375000 0.500000 +vt 0.500000 0.375000 +vt 0.437500 0.500000 +vt 0.406250 0.437500 +vt 0.468750 0.500000 +vt 0.375000 0.468750 +vt 0.406250 0.500000 +vt 0.656250 0.718750 +vt 0.562500 0.718750 +vt 0.625000 0.437500 +vt 0.531250 0.500000 +vt 0.625000 0.531250 +vt 0.406250 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.656250 +vt 0.531250 0.750000 +vt 0.500000 0.500000 +vt 0.406250 0.406250 +vt 0.531250 0.562500 +vt 0.625000 0.593750 +vt 0.593750 0.531250 +vt 0.468750 0.468750 +vt 0.593750 0.312500 +vt 0.375000 0.531250 +vt 0.406250 0.593750 +vt 0.468750 0.500000 +vt 0.593750 0.750000 +vt 0.531250 0.562500 +vt 0.531250 0.625000 +vt 0.562500 0.562500 +vt 0.593750 0.343750 +vt 0.593750 0.312500 +vt 0.687500 0.312500 +vt 0.343750 0.406250 +vt 0.625000 0.625000 +vt 0.375000 0.531250 +vt 0.406250 0.562500 +vt 0.531250 0.593750 +vt 0.531250 0.625000 +vt 0.531250 0.562500 +vt 0.468750 0.531250 +vt 0.437500 0.531250 +vt 0.593750 0.468750 +vt 0.562500 0.531250 +vt 0.312500 0.500000 +vt 0.343750 0.375000 +vt 0.437500 0.625000 +vt 0.468750 0.593750 +vt 0.625000 0.687500 +vt 0.593750 0.687500 +vt 0.718750 0.312500 +vt 0.750000 0.312500 +vt 0.718750 0.406250 +vt 0.375000 0.687500 +vt 0.437500 0.625000 +vt 0.468750 0.687500 +vt 0.468750 0.593750 +vt 0.500000 0.687500 +vt 0.593750 0.687500 +vt 0.593750 0.593750 +vt 0.468750 0.375000 +vt 0.468750 0.343750 +vt 0.375000 0.343750 +vt 0.531250 0.687500 +vt 0.500000 0.750000 +vt 0.625000 0.406250 +vt 0.343750 0.468750 +vt 0.406250 0.406250 +vt 0.312500 0.375000 +vt 0.468750 0.343750 +vt 0.468750 0.375000 +vt 0.500000 0.468750 +vt 0.656250 0.375000 +vt 0.656250 0.406250 +vt 0.281250 0.312500 +vt 0.281250 0.343750 +vt 0.312500 0.437500 +vt 0.343750 0.437500 +vt 0.500000 0.593750 +vt 0.562500 0.531250 +vt 0.562500 0.500000 +vt 0.468750 0.500000 +vt 0.468750 0.562500 +vt 0.406250 0.562500 +vt 0.562500 0.500000 +vt 0.656250 0.500000 +vt 0.656250 0.312500 +vt 0.437500 0.312500 +vt 0.468750 0.531250 +vt 0.562500 0.531250 +vt 0.562500 0.468750 +vt 0.312500 0.312500 +vt 0.250000 0.312500 +vt 0.312500 0.406250 +vt 0.406250 0.406250 +vt 0.468750 0.593750 +vt 0.343750 0.437500 +vt 0.281250 0.437500 +vt 0.281250 0.406250 +vt 0.718750 0.312500 +vt 0.406250 0.406250 +vt 0.312500 0.500000 +vt 0.343750 0.312500 +vt 0.375000 0.312500 +vt 0.531250 0.593750 +vt 0.406250 0.406250 +vt 0.562500 0.500000 +vt 0.593750 0.406250 +vt 0.593750 0.437500 +vt 0.625000 0.343750 +vt 0.656250 0.343750 +vt 0.593750 0.468750 +vt 0.593750 0.437500 +vt 0.562500 0.656250 +vt 0.468750 0.656250 +vt 0.500000 0.593750 +vt 0.531250 0.593750 +vt 0.625000 0.531250 +vt 0.656250 0.531250 +vt 0.531250 0.406250 +vt 0.500000 0.375000 +vt 0.593750 0.437500 +vt 0.593750 0.468750 +vt 0.437500 0.343750 +vt 0.437500 0.375000 +vt 0.375000 0.625000 +vt 0.406250 0.625000 +vt 0.312500 0.406250 +vt 0.750000 0.437500 +vt 0.343750 0.468750 +vt 0.593750 0.250000 +vt 0.625000 0.593750 +vt 0.562500 0.593750 +vt 0.562500 0.562500 +vt 0.562500 0.437500 +vt 0.343750 0.500000 +vt 0.437500 0.500000 +vt 0.468750 0.500000 +vt 0.437500 0.468750 +vt 0.406250 0.593750 +vt 0.406250 0.500000 +vt 0.468750 0.531250 +vt 0.500000 0.531250 +vt 0.625000 0.375000 +vt 0.656250 0.406250 +vt 0.656250 0.531250 +vt 0.531250 0.531250 +vt 0.531250 0.437500 +vt 0.718750 0.625000 +vt 0.687500 0.625000 +vt 0.656250 0.656250 +vt 0.562500 0.750000 +vt 0.687500 0.250000 +vt 0.750000 0.250000 +vt 0.750000 0.343750 +vt 0.656250 0.562500 +vt 0.625000 0.562500 +vt 0.500000 0.281250 +vt 0.656250 0.531250 +vt 0.687500 0.531250 +vt 0.406250 0.500000 +vt 0.375000 0.281250 +vt 0.437500 0.406250 +vt 0.625000 0.375000 +vt 0.656250 0.375000 +vt 0.687500 0.531250 +vt 0.687500 0.500000 +vt 0.593750 0.625000 +vt 0.625000 0.312500 +vt 0.656250 0.312500 +vt 0.656250 0.343750 +vt 0.593750 0.437500 +vt 0.593750 0.500000 +vt 0.593750 0.750000 +vt 0.593750 0.687500 +vt 0.468750 0.687500 +vt 0.437500 0.625000 +vt 0.468750 0.750000 +vt 0.437500 0.500000 +vt 0.531250 0.500000 +vt 0.656250 0.406250 +vt 0.312500 0.437500 +vt 0.343750 0.437500 +vt 0.437500 0.343750 +vt 0.437500 0.656250 +vt 0.687500 0.312500 +vt 0.687500 0.406250 +vt 0.593750 0.687500 +vt 0.500000 0.500000 +vt 0.375000 0.687500 +vt 0.375000 0.593750 +vt 0.593750 0.687500 +vt 0.281250 0.437500 +vt 0.312500 0.468750 +vt 0.312500 0.406250 +vt 0.375000 0.406250 +vt 0.656250 0.593750 +vt 0.562500 0.562500 +vt 0.406250 0.500000 +vt 0.718750 0.312500 +vt 0.750000 0.312500 +vt 0.312500 0.375000 +vt 0.375000 0.406250 +vt 0.468750 0.406250 +vt 0.375000 0.312500 +vt 0.687500 0.406250 +vt 0.281250 0.406250 +vt 0.625000 0.562500 +vt 0.375000 0.406250 +vt 0.437500 0.312500 +vt 0.343750 0.312500 +vt 0.343750 0.406250 +vt 0.468750 0.437500 +vt 0.718750 0.312500 +vt 0.750000 0.312500 +vt 0.718750 0.406250 +vt 0.343750 0.343750 +vt 0.437500 0.343750 +vt 0.437500 0.437500 +vt 0.281250 0.375000 +vt 0.437500 0.531250 +vt 0.437500 0.500000 +vt 0.468750 0.437500 +vt 0.593750 0.593750 +vt 0.625000 0.437500 +vt 0.656250 0.437500 +vt 0.625000 0.437500 +vt 0.625000 0.406250 +vt 0.687500 0.406250 +vt 0.375000 0.468750 +vt 0.312500 0.375000 +vt 0.343750 0.375000 +vt 0.343750 0.343750 +vt 0.375000 0.312500 +vt 0.562500 0.312500 +vt 0.562500 0.406250 +vt 0.562500 0.437500 +vt 0.468750 0.468750 +vt 0.656250 0.500000 +vt 0.656250 0.562500 +vt 0.656250 0.468750 +vt 0.687500 0.375000 +vt 0.718750 0.375000 +vt 0.687500 0.593750 +vt 0.562500 0.406250 +vt 0.625000 0.468750 +vt 0.625000 0.500000 +vt 0.468750 0.593750 +vt 0.406250 0.687500 +vt 0.468750 0.406250 +vt 0.437500 0.437500 +vt 0.500000 0.437500 +vt 0.468750 0.468750 +vt 0.468750 0.500000 +vt 0.343750 0.343750 +vt 0.312500 0.375000 +vt 0.593750 0.531250 +vt 0.531250 0.750000 +vt 0.468750 0.750000 +vt 0.468750 0.687500 +vt 0.531250 0.687500 +vt 0.656250 0.531250 +vt 0.593750 0.531250 +vt 0.625000 0.312500 +vt 0.437500 0.500000 +vt 0.468750 0.437500 +vt 0.375000 0.562500 +vt 0.343750 0.562500 +vt 0.562500 0.500000 +vt 0.625000 0.531250 +vt 0.562500 0.625000 +vt 0.468750 0.625000 +vt 0.468750 0.531250 +vt 0.562500 0.437500 +vt 0.625000 0.437500 +vt 0.625000 0.406250 +vt 0.718750 0.406250 +vt 0.718750 0.500000 +vt 0.687500 0.468750 +vt 0.656250 0.406250 +vt 0.625000 0.500000 +vt 0.562500 0.531250 +vt 0.562500 0.437500 +vt 0.531250 0.437500 +vt 0.531250 0.500000 +vt 0.687500 0.406250 +vt 0.531250 0.281250 +vt 0.531250 0.312500 +vt 0.562500 0.343750 +vt 0.468750 0.593750 +vt 0.281250 0.312500 +vt 0.281250 0.406250 +vt 0.437500 0.593750 +vt 0.593750 0.500000 +vt 0.656250 0.625000 +vt 0.687500 0.437500 +vt 0.468750 0.531250 +vt 0.468750 0.562500 +vt 0.531250 0.531250 +vt 0.562500 0.656250 +vt 0.562500 0.625000 +vt 0.281250 0.312500 +vt 0.281250 0.343750 +vt 0.250000 0.312500 +vt 0.312500 0.500000 +vt 0.625000 0.437500 +vt 0.625000 0.468750 +vt 0.562500 0.500000 +vt 0.562500 0.437500 +vt 0.468750 0.500000 +vt 0.500000 0.625000 +vt 0.468750 0.687500 +vt 0.562500 0.406250 +vt 0.625000 0.406250 +vt 0.562500 0.312500 +vt 0.656250 0.312500 +vt 0.531250 0.593750 +vt 0.500000 0.625000 +vt 0.625000 0.531250 +vt 0.531250 0.625000 +vt 0.562500 0.593750 +vt 0.562500 0.656250 +vt 0.593750 0.687500 +vt 0.656250 0.500000 +vt 0.531250 0.687500 +vt 0.625000 0.687500 +vt 0.562500 0.500000 +vt 0.593750 0.625000 +vt 0.718750 0.312500 +vt 0.750000 0.312500 +vt 0.468750 0.625000 +vt 0.468750 0.562500 +vt 0.625000 0.312500 +vt 0.531250 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.656250 +vt 0.531250 0.531250 +vt 0.687500 0.312500 +vt 0.312500 0.343750 +vt 0.718750 0.375000 +vt 0.625000 0.343750 +vt 0.437500 0.500000 +vt 0.437500 0.437500 +vt 0.406250 0.437500 +vt 0.406250 0.593750 +vt 0.343750 0.687500 +vt 0.625000 0.437500 +vt 0.625000 0.312500 +vt 0.718750 0.312500 +vt 0.718750 0.406250 +vt 0.687500 0.375000 +vt 0.656250 0.406250 +vt 0.656250 0.406250 +vt 0.656250 0.312500 +vt 0.437500 0.312500 +vt 0.375000 0.406250 +vt 0.375000 0.312500 +vt 0.593750 0.312500 +vt 0.687500 0.375000 +vt 0.718750 0.375000 +vt 0.687500 0.343750 +vt 0.656250 0.343750 +vt 0.687500 0.343750 +vt 0.625000 0.437500 +vt 0.656250 0.437500 +vt 0.718750 0.375000 +vt 0.281250 0.312500 +vt 0.250000 0.312500 +vt 0.718750 0.312500 +vt 0.750000 0.312500 +vt 0.250000 0.437500 +vt 0.468750 0.687500 +vt 0.750000 0.312500 +vt 0.656250 0.312500 +vt 0.312500 0.343750 +vt 0.437500 0.687500 +vt 0.656250 0.312500 +vt 0.687500 0.437500 +vt 0.437500 0.593750 +vt 0.343750 0.437500 +vt 0.437500 0.468750 +vt 0.468750 0.468750 +vt 0.406250 0.468750 +vt 0.375000 0.343750 +vt 0.562500 0.343750 +vt 0.531250 0.406250 +vt 0.562500 0.406250 +vt 0.687500 0.406250 +vt 0.656250 0.406250 +vt 0.750000 0.406250 +vt 0.375000 0.437500 +vt 0.468750 0.312500 +vt 0.562500 0.312500 +vt 0.343750 0.406250 +vt 0.375000 0.406250 +vt 0.281250 0.312500 +vt 0.281250 0.406250 +vt 0.687500 0.406250 +vt 0.406250 0.343750 +vt 0.437500 0.375000 +vt 0.500000 0.343750 +vt 0.500000 0.375000 +vt 0.468750 0.500000 +vt 0.593750 0.406250 +vt 0.750000 0.312500 +vt 0.500000 0.437500 +vt 0.468750 0.437500 +vt 0.468750 0.468750 +vt 0.531250 0.406250 +vt 0.375000 0.500000 +vt 0.656250 0.531250 +vt 0.718750 0.343750 +vt 0.718750 0.375000 +vt 0.562500 0.531250 +vt 0.593750 0.625000 +vt 0.468750 0.375000 +vt 0.437500 0.375000 +vt 0.437500 0.343750 +vt 0.656250 0.343750 +vt 0.625000 0.375000 +vt 0.500000 0.437500 +vt 0.468750 0.468750 +vt 0.375000 0.593750 +vt 0.687500 0.500000 +vt 0.468750 0.625000 +vt 0.656250 0.406250 +vt 0.656250 0.468750 +vt 0.281250 0.531250 +vt 0.312500 0.531250 +vt 0.406250 0.531250 +vt 0.562500 0.625000 +vt 0.468750 0.500000 +vt 0.531250 0.437500 +vt 0.406250 0.593750 +vt 0.406250 0.687500 +vt 0.500000 0.500000 +vt 0.500000 0.406250 +vt 0.593750 0.406250 +vt 0.468750 0.531250 +vt 0.468750 0.625000 +vt 0.437500 0.625000 +vt 0.625000 0.593750 +vt 0.593750 0.562500 +vt 0.625000 0.531250 +vt 0.406250 0.687500 +vt 0.500000 0.687500 +vt 0.468750 0.687500 +vt 0.500000 0.750000 +vt 0.625000 0.687500 +vt 0.593750 0.562500 +vt 0.343750 0.593750 +vt 0.625000 0.312500 +vt 0.625000 0.406250 +vt 0.593750 0.312500 +vt 0.437500 0.718750 +vt 0.437500 0.750000 +vt 0.562500 0.656250 +vt 0.656250 0.750000 +vt 0.656250 0.718750 +vt 0.750000 0.718750 +vt 0.656250 0.656250 +vt 0.750000 0.625000 +vt 0.718750 0.625000 +vt 0.250000 0.750000 +vt 0.343750 0.750000 +vt 0.343750 0.718750 +vt 0.281250 0.656250 +vt 0.250000 0.656250 +vt 0.687500 0.625000 +vt 0.656250 0.625000 +vt 0.281250 0.625000 +vt 0.250000 0.500000 +vt 0.250000 0.625000 +vt 0.562500 0.625000 +vt 0.250000 0.406250 +vt 0.281250 0.406250 +vt 0.312500 0.375000 +vt 0.312500 0.312500 +vt 0.437500 0.437500 +vt 0.437500 0.375000 +vt 0.687500 0.593750 +vt 0.718750 0.593750 +vt 0.750000 0.593750 +vt 0.656250 0.468750 +vt 0.750000 0.375000 +vt 0.625000 0.468750 +vt 0.625000 0.593750 +vt 0.718750 0.375000 +vt 0.656250 0.375000 +vt 0.375000 0.281250 +vt 0.593750 0.281250 +vt 0.281250 0.250000 +vt 0.375000 0.250000 +vt 0.593750 0.250000 +vt 0.468750 0.250000 +vt 0.468750 0.281250 +vt 0.750000 0.343750 +vt 0.687500 0.250000 +vt 0.500000 0.687500 +vt 0.718750 0.312500 +vt 0.468750 0.343750 +vt 0.625000 0.343750 +vt 0.343750 0.500000 +vt 0.718750 0.468750 +vt 0.375000 0.500000 +vt 0.625000 0.531250 +vt 0.656250 0.531250 +vt 0.687500 0.562500 +vt 0.593750 0.500000 +vt 0.687500 0.468750 +vt 0.656250 0.500000 +vt 0.281250 0.593750 +vt 0.312500 0.593750 +vt 0.437500 0.312500 +vt 0.437500 0.343750 +vt 0.562500 0.625000 +vt 0.562500 0.531250 +vt 0.281250 0.656250 +vt 0.312500 0.593750 +vt 0.625000 0.343750 +vt 0.562500 0.531250 +vt 0.593750 0.468750 +vt 0.531250 0.562500 +vt 0.562500 0.562500 +vt 0.531250 0.468750 +vt 0.687500 0.593750 +vt 0.375000 0.343750 +vt 0.437500 0.437500 +vt 0.437500 0.406250 +vt 0.312500 0.625000 +vt 0.656250 0.500000 +vt 0.562500 0.406250 +vt 0.625000 0.406250 +vt 0.375000 0.687500 +vt 0.562500 0.656250 +vt 0.437500 0.531250 +vt 0.750000 0.593750 +vt 0.531250 0.406250 +vt 0.562500 0.468750 +vt 0.343750 0.562500 +vt 0.656250 0.562500 +vt 0.468750 0.562500 +vt 0.500000 0.656250 +vt 0.468750 0.312500 +vt 0.656250 0.625000 +vt 0.656250 0.468750 +vt 0.718750 0.500000 +vt 0.468750 0.500000 +vt 0.406250 0.625000 +vt 0.468750 0.562500 +vt 0.500000 0.437500 +vt 0.468750 0.531250 +vt 0.593750 0.531250 +vt 0.281250 0.531250 +vt 0.468750 0.437500 +vt 0.562500 0.468750 +vt 0.593750 0.468750 +vt 0.593750 0.406250 +vt 0.593750 0.562500 +vt 0.531250 0.593750 +vt 0.437500 0.562500 +vt 0.562500 0.593750 +vt 0.531250 0.406250 +vt 0.562500 0.656250 +vt 0.468750 0.593750 +vt 0.656250 0.375000 +vt 0.718750 0.281250 +vt 0.687500 0.312500 +vt 0.687500 0.281250 +vt 0.468750 0.281250 +vt 0.593750 0.281250 +vt 0.593750 0.312500 +vt 0.468750 0.312500 +vt 0.375000 0.312500 +vt 0.312500 0.281250 +vt 0.375000 0.281250 +vt 0.437500 0.375000 +vt 0.406250 0.375000 +vt 0.312500 0.312500 +vt 0.281250 0.406250 +vt 0.281250 0.312500 +vt 0.312500 0.406250 +vt 0.375000 0.406250 +vt 0.406250 0.406250 +vt 0.343750 0.437500 +vt 0.375000 0.437500 +vt 0.375000 0.625000 +vt 0.375000 0.656250 +vt 0.281250 0.625000 +vt 0.281250 0.500000 +vt 0.562500 0.656250 +vt 0.437500 0.687500 +vt 0.562500 0.687500 +vt 0.656250 0.718750 +vt 0.437500 0.718750 +vt 0.343750 0.687500 +vt 0.343750 0.718750 +vt 0.281250 0.718750 +vt 0.312500 0.656250 +vt 0.281250 0.656250 +vt 0.687500 0.625000 +vt 0.718750 0.625000 +vt 0.718750 0.687500 +vt 0.312500 0.500000 +vt 0.281250 0.250000 +vt 0.375000 0.250000 +vt 0.375000 0.281250 +vt 0.250000 0.312500 +vt 0.750000 0.468750 +vt 0.593750 0.312500 +vt 0.343750 0.406250 +vt 0.562500 0.468750 +vt 0.250000 0.656250 +vt 0.375000 0.718750 +vt 0.343750 0.750000 +vt 0.375000 0.531250 +vt 0.500000 0.343750 +vt 0.656250 0.406250 +vt 0.625000 0.468750 +vt 0.312500 0.500000 +vt 0.656250 0.656250 +vt 0.625000 0.656250 +vt 0.625000 0.562500 +vt 0.406250 0.562500 +vt 0.468750 0.343750 +vt 0.625000 0.406250 +vt 0.687500 0.500000 +vt 0.437500 0.750000 +vt 0.531250 0.343750 +vt 0.437500 0.593750 +vt 0.281250 0.312500 +vt 0.250000 0.312500 +vt 0.281250 0.406250 +vt 0.281250 0.687500 +vt 0.281250 0.593750 +vt 0.312500 0.593750 +vt 0.468750 0.718750 +vt 0.375000 0.718750 +vt 0.562500 0.312500 +vt 0.625000 0.312500 +vt 0.375000 0.437500 +vt 0.312500 0.437500 +vt 0.437500 0.281250 +vt 0.531250 0.281250 +vt 0.343750 0.593750 +vt 0.500000 0.437500 +vt 0.468750 0.406250 +vt 0.312500 0.343750 +vt 0.437500 0.531250 +vt 0.468750 0.656250 +vt 0.500000 0.593750 +vt 0.562500 0.593750 +vt 0.625000 0.500000 +vt 0.531250 0.406250 +vt 0.593750 0.468750 +vt 0.531250 0.375000 +vt 0.625000 0.375000 +vt 0.625000 0.468750 +vt 0.562500 0.437500 +vt 0.500000 0.531250 +vt 0.468750 0.468750 +vt 0.437500 0.531250 +vt 0.437500 0.468750 +vt 0.468750 0.406250 +vt 0.562500 0.593750 +vt 0.531250 0.531250 +vt 0.500000 0.593750 +vt 0.531250 0.500000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +usemtl geyser +s off +f 421/1/1 187/2/1 537/3/1 +f 613/4/2 618/5/2 619/6/2 +f 419/7/2 549/8/2 546/9/2 +f 415/10/2 289/11/2 183/12/2 +f 83/13/2 210/14/2 325/15/2 +f 630/16/3 266/17/3 388/18/3 +f 368/19/4 593/20/4 249/21/4 +f 706/22/1 703/23/1 577/24/1 +f 13/25/4 29/26/4 522/27/4 +f 408/28/1 279/29/1 535/30/1 +f 484/31/5 3/32/5 31/33/5 +f 649/34/2 538/35/2 186/36/2 +f 105/37/2 692/38/2 569/39/2 +f 256/40/5 512/41/5 149/42/5 +f 528/43/3 628/44/3 627/45/3 +f 198/46/5 672/47/5 105/48/5 +f 267/49/4 256/50/4 253/51/4 +f 35/52/4 283/53/4 258/54/4 +f 166/55/1 184/56/1 302/57/1 +f 582/58/4 702/59/4 109/60/4 +f 475/61/4 620/62/4 362/63/4 +f 248/64/5 146/65/5 629/66/5 +f 3/67/4 485/68/4 476/69/4 +f 248/70/4 389/71/4 366/72/4 +f 367/73/4 150/74/4 646/75/4 +f 532/76/4 36/77/4 380/78/4 +f 391/79/4 515/80/4 513/81/4 +f 287/82/4 618/83/4 613/84/4 +f 255/85/4 508/86/4 510/87/4 +f 271/88/4 516/89/4 164/90/4 +f 232/91/5 579/92/5 111/93/5 +f 621/94/1 596/95/1 597/96/1 +f 639/97/4 524/98/4 275/99/4 +f 345/100/4 331/101/4 92/102/4 +f 536/103/4 268/104/4 49/105/4 +f 26/106/4 617/107/4 260/108/4 +f 226/109/6 216/110/6 220/111/6 +f 552/112/4 304/113/4 78/114/4 +f 13/115/2 151/116/2 141/117/2 +f 444/118/6 555/119/6 202/120/6 +f 190/121/4 279/29/4 61/122/4 +f 202/123/2 551/124/2 429/125/2 +f 420/126/1 316/127/1 95/128/1 +f 544/129/4 536/103/4 535/30/4 +f 165/130/1 304/113/1 414/131/1 +f 466/132/4 356/133/4 359/134/4 +f 413/135/4 648/136/4 406/137/4 +f 455/138/2 339/139/2 459/140/2 +f 42/141/1 546/142/1 514/143/1 +f 239/144/1 237/145/1 717/146/1 +f 54/147/4 56/148/4 289/149/4 +f 301/150/4 52/151/4 394/152/4 +f 420/126/4 538/153/4 650/154/4 +f 72/155/3 563/156/3 437/157/3 +f 558/158/4 543/159/4 539/160/4 +f 559/161/4 292/162/4 525/163/4 +f 84/164/4 278/165/4 560/166/4 +f 665/167/2 561/168/2 663/169/2 +f 189/170/4 407/171/4 541/172/4 +f 319/173/4 653/174/4 542/175/4 +f 564/176/4 548/177/4 426/178/4 +f 355/179/5 130/180/5 127/181/5 +f 316/127/4 558/158/4 660/182/4 +f 519/183/4 273/184/4 66/185/4 +f 324/186/4 695/187/4 100/188/4 +f 433/189/4 662/190/4 434/191/4 +f 340/192/3 97/193/3 694/194/3 +f 436/195/4 563/196/4 422/197/4 +f 399/198/5 364/199/5 18/200/5 +f 1/201/5 636/202/5 35/203/5 +f 78/114/4 76/204/4 93/205/4 +f 676/206/4 416/207/4 441/208/4 +f 719/209/6 121/210/6 124/211/6 +f 92/212/6 451/213/6 345/214/6 +f 91/215/4 663/216/4 689/217/4 +f 686/218/4 433/189/4 88/219/4 +f 209/220/4 89/221/4 203/222/4 +f 504/223/5 609/224/5 23/225/5 +f 541/226/5 540/227/5 46/228/5 +f 224/229/1 317/230/1 679/231/1 +f 569/232/4 451/233/4 320/234/4 +f 661/235/5 323/236/5 324/237/5 +f 202/238/4 429/239/4 449/240/4 +f 548/241/5 87/242/5 301/243/5 +f 59/244/5 69/245/5 70/246/5 +f 444/118/5 686/247/5 88/248/5 +f 697/249/4 338/250/4 692/251/4 +f 245/252/1 139/253/1 140/254/1 +f 698/255/4 332/256/4 337/257/4 +f 230/258/4 453/259/4 461/260/4 +f 713/261/6 718/262/6 130/180/6 +f 49/263/2 268/264/2 171/265/2 +f 235/266/4 225/267/4 226/268/4 +f 113/269/4 582/58/4 581/270/4 +f 634/271/1 160/272/1 256/50/1 +f 97/273/4 215/274/4 95/128/4 +f 381/275/6 505/276/6 372/277/6 +f 590/278/4 462/279/4 707/280/4 +f 717/146/4 588/281/4 126/282/4 +f 124/283/4 350/284/4 123/285/4 +f 711/286/4 708/287/4 716/288/4 +f 291/289/2 65/290/2 303/291/2 +f 388/292/1 138/293/1 365/294/1 +f 622/295/4 595/296/4 39/297/4 +f 371/298/1 503/299/1 592/300/1 +f 375/301/1 504/302/1 2/303/1 +f 263/304/1 622/295/1 10/305/1 +f 306/306/4 651/307/4 528/308/4 +f 378/309/1 507/310/1 145/311/1 +f 606/312/1 148/313/1 6/314/1 +f 195/315/1 295/316/1 34/317/1 +f 23/318/1 636/319/1 469/320/1 +f 230/321/5 572/322/5 96/323/5 +f 228/324/4 229/325/4 456/326/4 +f 153/327/1 613/84/1 152/328/1 +f 269/329/6 171/330/6 411/331/6 +f 394/332/6 164/333/6 597/334/6 +f 409/335/6 668/336/6 72/337/6 +f 32/338/1 602/339/1 364/340/1 +f 22/341/4 141/342/4 370/343/4 +f 134/344/6 483/345/6 363/346/6 +f 700/347/6 214/348/6 234/349/6 +f 393/350/1 285/351/1 381/352/1 +f 162/353/1 637/354/1 404/355/1 +f 164/90/1 638/356/1 618/83/1 +f 361/357/6 133/358/6 382/359/6 +f 28/360/1 270/361/1 621/94/1 +f 383/362/1 418/363/1 260/108/1 +f 126/364/6 357/365/6 118/366/6 +f 518/367/6 55/368/6 649/369/6 +f 167/370/1 307/371/1 526/372/1 +f 168/373/1 294/374/1 178/375/1 +f 672/47/6 569/376/6 439/377/6 +f 703/378/3 344/379/3 704/380/3 +f 628/381/4 652/382/4 19/383/4 +f 419/384/6 77/385/6 442/386/6 +f 81/387/5 95/388/5 684/389/5 +f 390/390/1 411/391/1 171/392/1 +f 37/393/1 647/394/1 533/395/1 +f 532/396/3 284/397/3 35/398/3 +f 121/399/3 120/400/3 354/401/3 +f 327/402/1 318/403/1 192/404/1 +f 63/405/1 311/406/1 402/407/1 +f 324/186/1 554/408/1 661/409/1 +f 179/410/1 545/411/1 50/412/1 +f 417/413/1 181/414/1 180/415/1 +f 392/416/6 514/143/6 547/417/6 +f 589/418/3 714/419/3 236/420/3 +f 426/421/2 181/422/2 413/423/2 +f 541/172/1 661/409/1 651/307/1 +f 534/424/1 32/338/1 169/425/1 +f 411/391/4 298/426/4 669/427/4 +f 655/428/1 670/429/1 424/430/1 +f 416/207/1 313/431/1 548/177/1 +f 510/432/2 509/433/2 147/434/2 +f 110/435/1 565/436/1 205/437/1 +f 635/438/3 171/265/3 269/439/3 +f 23/440/3 609/441/3 613/4/3 +f 566/442/2 327/443/2 681/444/2 +f 162/445/2 258/446/2 615/447/2 +f 218/448/1 217/449/1 323/450/1 +f 310/451/1 680/452/1 562/453/1 +f 72/454/1 86/455/1 563/196/1 +f 332/256/1 337/257/1 206/456/1 +f 656/457/1 448/458/1 329/459/1 +f 372/460/2 503/461/2 151/116/2 +f 95/388/6 552/462/6 420/463/6 +f 262/464/4 363/465/4 599/466/4 +f 92/102/1 696/467/1 673/468/1 +f 686/218/1 340/469/1 443/470/1 +f 448/471/3 336/472/3 693/473/3 +f 446/474/4 450/475/4 705/476/4 +f 423/477/4 47/478/4 60/479/4 +f 714/480/4 127/481/4 130/482/4 +f 570/483/1 567/484/1 581/270/1 +f 158/485/5 144/486/5 602/487/5 +f 611/488/2 514/489/2 381/490/2 +f 575/491/1 343/492/1 342/493/1 +f 81/494/1 175/495/1 176/496/1 +f 339/497/1 460/498/1 459/499/1 +f 228/324/1 111/500/1 580/501/1 +f 530/502/5 494/503/5 145/504/5 +f 354/505/1 213/506/1 458/507/1 +f 349/508/1 214/509/1 574/510/1 +f 353/511/1 708/287/1 584/512/1 +f 693/513/1 336/514/1 465/515/1 +f 234/516/1 466/132/1 117/517/1 +f 719/518/1 238/519/1 720/520/1 +f 178/521/5 603/522/5 252/523/5 +f 665/524/5 293/525/5 309/526/5 +f 336/527/6 430/528/6 659/529/6 +f 196/530/4 439/531/4 425/532/4 +f 684/533/4 557/534/4 81/494/4 +f 414/535/5 11/536/5 9/537/5 +f 261/538/5 383/539/5 250/540/5 +f 142/541/5 13/542/5 598/543/5 +f 249/544/5 244/545/5 245/546/5 +f 40/547/5 599/548/5 12/549/5 +f 260/550/5 595/551/5 133/358/5 +f 103/552/4 104/553/4 105/554/4 +f 510/555/5 606/556/5 255/557/5 +f 608/558/5 242/559/5 243/560/5 +f 218/448/4 319/173/4 664/561/4 +f 622/562/5 597/334/5 10/563/5 +f 14/564/5 624/565/5 263/566/5 +f 344/567/4 566/568/4 82/569/4 +f 579/570/1 233/571/1 697/249/1 +f 71/572/6 194/573/6 170/574/6 +f 159/575/5 508/576/5 21/577/5 +f 691/578/4 206/456/4 312/579/4 +f 633/580/5 631/581/5 267/582/5 +f 611/583/5 285/584/5 50/585/5 +f 615/586/5 392/416/5 393/587/5 +f 436/195/4 90/588/4 577/24/4 +f 618/589/5 163/590/5 616/591/5 +f 621/592/5 271/593/5 164/333/5 +f 516/594/5 273/595/5 272/596/5 +f 640/597/5 626/598/5 174/599/5 +f 42/600/5 30/601/5 290/602/5 +f 301/150/1 405/603/1 394/152/1 +f 182/604/4 675/605/4 79/606/4 +f 279/607/5 542/608/5 377/609/5 +f 145/311/4 495/610/4 487/611/4 +f 183/612/5 289/613/5 53/614/5 +f 174/599/6 537/615/6 185/616/6 +f 170/574/5 150/617/5 268/618/5 +f 602/619/3 601/620/3 18/621/3 +f 55/368/5 291/622/5 45/623/5 +f 63/624/5 536/625/5 49/626/5 +f 681/444/3 678/627/3 204/628/3 +f 302/629/5 200/630/5 417/631/5 +f 305/632/5 78/114/5 304/113/5 +f 54/633/5 659/529/5 184/634/5 +f 649/369/5 420/463/5 650/635/5 +f 538/636/5 554/637/5 306/638/5 +f 97/639/5 340/640/5 117/641/5 +f 651/642/5 557/643/5 176/644/5 +f 250/645/4 14/646/4 506/647/4 +f 543/648/5 189/649/5 541/226/5 +f 197/650/5 73/651/5 283/652/5 +f 434/653/5 558/654/5 539/655/5 +f 27/656/4 381/352/4 393/350/4 +f 64/657/5 199/658/5 549/659/5 +f 200/630/5 441/660/5 416/661/5 +f 230/258/1 221/662/1 120/663/1 +f 84/664/5 436/665/5 422/666/5 +f 192/667/5 210/668/5 559/161/5 +f 400/669/4 4/670/4 44/671/4 +f 218/672/5 326/673/5 212/674/5 +f 83/675/5 190/676/5 292/677/5 +f 112/678/4 341/679/4 94/680/4 +f 42/141/4 81/494/4 43/681/4 +f 568/682/5 561/683/5 319/684/5 +f 100/685/5 663/686/5 189/649/5 +f 553/687/5 676/688/5 322/689/5 +f 654/690/5 673/691/5 161/692/5 +f 426/693/6 406/694/6 163/590/6 +f 379/695/6 532/696/6 380/697/6 +f 401/698/4 605/699/4 137/700/4 +f 23/440/2 513/701/2 616/702/2 +f 570/703/5 429/704/5 551/705/5 +f 24/706/5 475/707/5 370/708/5 +f 680/709/5 436/665/5 577/710/5 +f 337/711/5 76/712/5 206/713/5 +f 334/714/5 571/715/5 333/716/5 +f 208/717/5 695/718/5 98/719/5 +f 336/527/5 335/720/5 315/721/5 +f 678/627/5 317/722/5 421/723/5 +f 107/724/5 440/725/5 331/726/5 +f 221/662/4 122/727/4 457/728/4 +f 522/729/5 277/730/5 44/731/5 +f 310/732/5 544/733/5 311/734/5 +f 338/735/5 698/736/5 337/711/5 +f 353/737/5 339/497/5 346/738/5 +f 120/739/6 222/740/6 119/741/6 +f 6/314/5 148/313/5 137/742/5 +f 588/743/5 222/740/5 119/741/5 +f 109/744/5 463/745/5 575/746/5 +f 344/747/5 90/748/5 327/402/5 +f 699/749/5 229/750/5 228/751/5 +f 354/752/5 221/753/5 213/754/5 +f 577/755/2 576/756/2 109/744/2 +f 717/757/5 357/365/5 360/758/5 +f 110/759/5 233/760/5 351/761/5 +f 329/762/5 328/763/5 675/764/5 +f 307/765/5 525/766/5 526/767/5 +f 350/284/5 701/768/5 114/769/5 +f 635/770/1 269/771/1 607/772/1 +f 462/773/5 589/774/5 234/349/5 +f 122/775/5 124/211/5 123/776/5 +f 190/777/2 539/778/2 543/779/2 +f 115/780/4 579/570/4 232/781/4 +f 530/782/4 148/313/4 6/314/4 +f 331/101/1 321/783/1 572/784/1 +f 529/785/6 364/199/6 5/786/6 +f 249/544/6 503/787/6 368/788/6 +f 504/223/6 7/789/6 2/790/6 +f 141/791/6 371/298/6 370/708/6 +f 492/792/1 156/793/1 483/794/1 +f 156/795/2 528/43/2 517/796/2 +f 160/797/2 511/798/2 512/799/2 +f 32/800/5 534/801/5 278/802/5 +f 430/803/3 656/804/3 658/805/3 +f 507/806/6 21/577/6 145/504/6 +f 47/807/6 604/808/6 146/65/6 +f 148/313/6 378/809/6 6/314/6 +f 531/810/6 147/811/6 605/812/6 +f 325/813/5 220/111/5 99/814/5 +f 646/815/6 172/816/6 390/817/6 +f 642/818/1 276/819/1 155/820/1 +f 594/821/6 373/822/6 152/823/6 +f 407/171/4 309/824/4 386/825/4 +f 625/826/6 275/827/6 376/828/6 +f 620/829/6 13/542/6 598/543/6 +f 399/198/6 534/801/6 642/830/6 +f 603/522/6 489/831/6 488/832/6 +f 118/833/4 119/834/4 222/835/4 +f 607/836/6 269/329/6 388/837/6 +f 403/838/3 281/839/3 401/840/3 +f 43/841/6 17/842/6 385/843/6 +f 359/844/5 125/845/5 358/846/5 +f 136/847/1 137/700/1 280/848/1 +f 286/849/6 513/850/6 36/851/6 +f 607/772/4 147/852/4 269/771/4 +f 170/853/1 254/854/1 150/74/1 +f 598/855/1 141/342/1 370/343/1 +f 343/856/5 231/857/5 349/858/5 +f 57/859/6 627/860/6 523/861/6 +f 59/244/6 397/862/6 157/863/6 +f 708/864/3 351/865/3 233/866/3 +f 650/154/1 550/867/1 65/868/1 +f 653/869/6 544/733/6 535/870/6 +f 626/871/1 625/872/1 3/67/1 +f 652/873/6 377/609/6 19/874/6 +f 307/765/6 421/723/6 58/875/6 +f 69/245/6 46/228/6 177/876/6 +f 83/675/6 643/877/6 292/677/6 +f 639/878/5 521/879/5 276/880/5 +f 110/881/3 106/882/3 104/883/3 +f 361/884/1 610/885/1 472/886/1 +f 291/622/6 45/623/6 81/387/6 +f 314/887/6 415/888/6 648/889/6 +f 608/890/1 243/891/1 249/21/1 +f 550/892/6 304/113/6 65/893/6 +f 192/667/6 167/894/6 641/895/6 +f 437/896/6 86/897/6 204/898/6 +f 611/583/1 151/899/1 251/900/1 +f 562/901/6 680/709/6 422/666/6 +f 661/235/6 539/655/6 651/642/6 +f 663/686/6 541/226/6 540/227/6 +f 561/683/6 542/608/6 407/902/6 +f 556/903/6 201/904/6 173/905/6 +f 470/906/5 610/907/5 257/908/5 +f 647/909/6 424/910/6 196/911/6 +f 202/120/6 538/636/6 660/912/6 +f 534/424/4 32/338/4 158/913/4 +f 423/914/6 62/915/6 631/581/6 +f 675/764/6 314/887/6 181/916/6 +f 98/719/6 208/717/6 316/917/6 +f 323/236/6 434/653/6 558/654/6 +f 325/813/6 559/161/6 435/918/6 +f 82/919/6 560/920/6 188/921/6 +f 235/266/1 348/922/1 226/268/1 +f 511/923/1 631/924/1 47/478/1 +f 307/765/6 677/925/6 458/926/6 +f 321/927/6 315/721/6 676/688/6 +f 667/928/6 91/929/6 690/930/6 +f 687/931/6 203/932/6 433/933/6 +f 162/934/5 25/935/5 515/936/5 +f 450/937/6 211/938/6 568/682/6 +f 387/939/4 62/940/4 71/941/4 +f 83/13/3 436/942/3 680/943/3 +f 531/944/4 48/945/4 299/946/4 +f 50/412/4 285/351/4 282/947/4 +f 157/948/1 16/949/1 603/950/1 +f 93/205/6 429/704/6 78/114/6 +f 340/640/6 449/951/6 443/952/6 +f 215/953/6 686/247/6 208/717/6 +f 99/814/6 342/954/6 582/955/6 +f 445/956/6 688/957/6 89/958/6 +f 697/959/6 692/960/6 691/961/6 +f 577/710/6 703/378/6 704/380/6 +f 355/179/6 124/211/6 123/776/6 +f 441/660/6 416/661/6 428/962/6 +f 94/680/6 571/715/6 586/963/6 +f 230/321/6 465/964/6 336/527/6 +f 658/965/1 183/966/1 639/97/1 +f 539/160/1 538/153/1 55/967/1 +f 706/968/6 86/897/6 683/969/6 +f 115/970/6 237/971/6 229/750/6 +f 584/972/6 698/736/6 460/973/6 +f 453/974/6 107/724/6 461/975/6 +f 231/976/1 582/58/1 702/59/1 +f 463/745/6 575/746/6 219/977/6 +f 717/757/6 587/978/6 240/979/6 +f 466/980/6 707/981/6 117/641/6 +f 591/982/6 720/983/6 468/984/6 +f 62/940/1 386/825/1 633/985/1 +f 220/986/1 576/987/1 226/268/1 +f 100/685/6 664/988/6 189/649/6 +f 397/989/1 57/990/1 523/991/1 +f 177/992/2 175/993/2 57/994/2 +f 508/86/1 399/995/1 18/996/1 +f 492/997/2 483/998/2 486/999/2 +f 477/1000/2 472/1001/2 471/1002/2 +f 677/925/3 676/1003/3 315/1004/3 +f 226/109/6 231/857/6 235/1005/6 +f 102/1006/1 189/170/1 561/1007/1 +f 45/1008/1 303/1009/1 290/1010/1 +f 541/226/6 398/1011/6 528/1012/6 +f 212/1013/1 89/221/1 211/1014/1 +f 352/1015/4 709/1016/4 111/500/4 +f 374/1017/2 369/1018/2 504/1019/2 +f 27/1020/2 140/1021/2 505/1022/2 +f 25/1023/2 152/1024/2 373/1025/2 +f 385/1026/2 15/1027/2 154/1028/2 +f 376/1029/2 14/1030/2 263/1031/2 +f 55/1032/3 290/602/3 274/1033/3 +f 529/1034/3 265/1035/3 32/1036/3 +f 31/1037/2 28/1038/2 516/594/2 +f 624/565/2 383/1039/2 622/1040/2 +f 549/1041/1 198/1042/1 547/1043/1 +f 527/1044/2 521/1045/2 524/1046/2 +f 522/1047/2 523/1048/2 43/1049/2 +f 533/1050/2 283/1051/2 282/1052/2 +f 530/1053/2 32/1036/2 529/1034/2 +f 633/1054/2 386/1055/2 168/1056/2 +f 294/1057/2 293/1058/2 652/1059/2 +f 404/1060/2 532/396/2 284/397/2 +f 405/1061/2 391/1062/2 286/1063/2 +f 163/1064/2 287/1065/2 161/1066/2 +f 200/1067/2 416/1068/2 80/1069/2 +f 640/1070/2 639/1071/2 56/1072/2 +f 278/1073/2 396/1074/2 58/1075/2 +f 40/547/4 657/1076/4 65/868/4 +f 60/1077/2 177/992/2 59/1078/2 +f 170/1079/2 536/1080/2 297/1081/2 +f 173/1082/2 54/633/2 184/634/2 +f 313/1083/2 207/1084/2 675/1085/2 +f 540/1086/2 651/1087/2 176/1088/2 +f 409/1089/2 544/1090/2 653/1091/2 +f 63/1092/2 535/1093/2 536/1080/2 +f 671/1094/4 623/1095/4 611/583/4 +f 412/1096/2 424/1097/2 545/1098/2 +f 276/1099/3 396/1074/3 174/1100/3 +f 427/1101/2 301/1102/2 414/1103/2 +f 322/1104/2 331/1105/2 440/1106/2 +f 656/804/2 182/1107/2 430/803/2 +f 199/1108/2 205/1109/2 565/1110/2 +f 81/387/2 554/1111/2 420/463/2 +f 188/1112/2 421/1113/2 307/1114/2 +f 189/1115/2 558/1116/2 661/1117/2 +f 660/1118/2 434/1119/2 202/123/2 +f 85/1120/2 562/1121/2 193/1122/2 +f 196/1123/2 672/1124/2 439/1125/2 +f 420/463/2 78/1126/2 550/1127/2 +f 87/1128/2 564/1129/2 439/1125/2 +f 437/157/2 422/1130/2 563/156/2 +f 663/216/1 652/382/1 665/1131/1 +f 409/1132/1 536/103/1 410/1133/1 +f 443/1134/2 334/1135/2 333/1136/2 +f 208/1137/2 443/1134/2 95/1138/2 +f 324/237/2 208/1137/2 98/1139/2 +f 209/1140/2 567/1141/2 444/1142/2 +f 102/1143/2 218/1144/2 100/1145/2 +f 574/1146/2 214/1147/2 215/1148/2 +f 332/1149/2 338/1150/2 337/1151/2 +f 571/1152/2 332/1149/2 93/1153/2 +f 222/1154/2 96/1155/2 572/1156/2 +f 214/1147/2 341/1157/2 340/192/2 +f 96/1155/2 693/473/2 453/1158/2 +f 86/1159/2 680/943/2 683/1160/2 +f 580/1161/2 345/1162/2 452/1163/2 +f 347/1164/2 580/1161/2 579/1165/2 +f 582/1166/2 348/1167/2 581/1168/2 +f 463/1169/2 582/1166/2 343/1170/2 +f 583/1171/2 701/1172/2 344/379/2 +f 196/530/1 532/76/1 286/1173/1 +f 227/1174/2 584/1175/2 460/1176/2 +f 111/1177/2 229/1178/2 585/1179/2 +f 117/1180/2 112/1181/2 586/1182/2 +f 350/1183/2 122/1184/2 123/1185/2 +f 711/1186/2 232/1187/2 708/864/2 +f 587/1188/2 237/1189/2 115/1190/2 +f 588/1191/2 357/1192/2 126/1193/2 +f 589/418/2 590/1194/2 466/1195/2 +f 124/1196/2 120/400/2 119/1197/2 +f 235/1198/2 124/1196/2 355/1199/2 +f 236/420/2 235/1198/2 714/419/2 +f 231/1200/2 113/1201/2 462/1202/2 +f 645/1203/2 61/1204/2 279/1205/2 +f 273/1206/2 271/1207/2 394/1208/2 +f 186/1209/1 429/239/1 305/1210/1 +f 296/1211/2 298/1212/2 299/1213/2 +f 333/1214/1 93/205/1 78/114/1 +f 252/1215/3 143/1216/3 19/1217/3 +f 606/1218/3 6/1219/3 378/1220/3 +f 674/1221/1 413/135/1 675/605/1 +f 614/1222/3 611/488/3 29/1223/3 +f 422/197/1 83/1224/1 292/162/1 +f 619/6/3 164/1225/3 618/5/3 +f 622/1040/3 28/1038/3 621/1226/3 +f 40/547/3 30/1227/3 262/1228/3 +f 264/1229/3 383/1039/3 261/1230/3 +f 625/1231/3 520/1232/3 31/1037/3 +f 484/1233/4 520/1234/4 526/372/4 +f 389/1235/6 500/1236/6 366/1237/6 +f 89/221/1 203/222/1 191/1238/1 +f 389/1239/3 631/1240/3 632/1241/3 +f 219/977/3 450/1242/3 101/1243/3 +f 404/1060/3 37/1244/3 533/1050/3 +f 41/1245/3 271/1207/3 270/1246/3 +f 394/1208/3 405/1061/3 38/1247/3 +f 400/1248/3 44/1249/3 59/1078/3 +f 643/1250/3 641/1251/3 644/1252/3 +f 207/1253/1 200/1254/1 66/185/1 +f 647/1255/3 179/1256/3 50/1257/3 +f 648/1258/3 417/1259/3 180/1260/3 +f 650/1261/3 306/1262/3 291/289/3 +f 539/778/3 541/1263/3 651/1087/3 +f 541/1263/3 652/1059/3 540/1086/3 +f 542/1264/3 309/1265/3 407/1266/3 +f 659/1267/3 200/1067/3 182/1107/3 +f 650/1261/3 304/1268/3 649/34/3 +f 183/612/6 418/1269/6 264/1229/6 +f 622/562/6 250/540/6 10/563/6 +f 181/422/3 416/1068/3 548/1270/3 +f 64/1271/3 657/1272/3 414/1103/3 +f 410/1273/3 411/1274/3 172/1275/3 +f 414/1103/3 655/1276/3 301/1102/3 +f 419/7/3 420/463/3 81/387/3 +f 690/1277/1 319/173/1 667/1278/1 +f 307/1114/3 188/1112/3 192/1279/3 +f 660/1118/3 420/463/3 552/462/3 +f 660/1118/3 661/1117/3 554/1111/3 +f 434/1119/3 664/1280/3 558/1116/3 +f 664/1280/3 561/168/3 189/1115/3 +f 691/578/1 672/1281/1 312/579/1 +f 257/1282/4 504/302/4 2/303/4 +f 668/1283/3 666/1284/3 667/1285/3 +f 580/501/1 452/1286/1 451/233/1 +f 675/1085/3 313/1083/3 564/1129/3 +f 198/1287/3 671/1288/3 74/1289/3 +f 102/1143/3 690/1290/3 91/1291/3 +f 57/990/4 67/1292/4 68/1293/4 +f 312/1294/3 76/1295/3 75/1296/3 +f 88/248/3 323/1297/3 316/917/3 +f 616/1298/4 25/1299/4 373/1300/4 +f 203/1301/3 326/1302/3 433/1303/3 +f 318/1304/3 83/13/3 210/14/3 +f 98/1139/3 685/1305/3 684/1306/3 +f 685/1305/6 661/235/6 557/643/6 +f 454/1307/4 199/1308/4 106/1309/4 +f 335/1310/3 331/1105/3 447/1311/3 +f 92/1312/3 440/1106/3 320/1313/3 +f 682/1314/3 683/1160/3 438/1315/3 +f 444/1142/3 687/931/3 686/1316/3 +f 99/814/3 212/1317/3 209/1140/3 +f 216/110/3 688/1318/3 220/111/3 +f 692/38/3 337/1151/3 691/1319/3 +f 337/1151/3 93/1153/3 330/1320/3 +f 572/1156/3 108/1321/3 456/1322/3 +f 336/472/3 221/1323/3 96/1155/3 +f 357/1192/3 126/1193/3 237/1189/3 +f 579/1165/3 346/1324/3 698/1325/3 +f 107/1326/3 228/1327/3 580/1161/3 +f 581/1168/3 343/1170/3 700/1328/3 +f 223/1329/3 226/1330/3 348/1167/3 +f 707/1331/3 234/1332/3 117/1180/3 +f 239/1333/3 717/1334/3 240/1335/3 +f 360/1336/3 241/1337/3 719/1338/3 +f 640/1339/1 58/1340/1 537/3/1 +f 58/1340/1 421/1/1 537/3/1 +f 619/6/2 39/1341/2 613/4/2 +f 39/1341/2 260/1342/2 617/1343/2 +f 613/4/2 39/1341/2 617/1343/2 +f 419/7/2 550/1127/2 549/8/2 +f 550/1127/2 64/1271/2 549/8/2 +f 549/8/2 547/1344/2 546/9/2 +f 183/12/2 51/1345/2 415/10/2 +f 51/1345/2 406/1346/2 415/10/2 +f 406/1346/2 648/1258/2 415/10/2 +f 203/1301/2 89/1347/2 325/15/2 +f 89/1347/2 83/13/2 325/15/2 +f 388/18/3 269/439/3 34/1348/3 +f 34/1348/3 33/1349/3 630/16/3 +f 169/1350/3 32/1036/3 399/1351/3 +f 388/18/3 34/1348/3 630/16/3 +f 630/16/3 169/1350/3 266/17/3 +f 169/1350/3 399/1351/3 266/17/3 +f 266/17/3 159/1352/3 388/18/3 +f 368/19/4 372/1353/4 593/20/4 +f 436/195/1 86/455/1 577/24/1 +f 86/455/1 706/22/1 577/24/1 +f 522/27/4 16/949/4 13/25/4 +f 16/949/4 486/1354/4 598/855/4 +f 13/25/4 16/949/4 598/855/4 +f 486/1354/4 478/1355/4 598/855/4 +f 535/30/1 544/129/1 408/28/1 +f 544/129/1 85/1356/1 408/28/1 +f 85/1356/1 193/1357/1 408/28/1 +f 485/1358/5 3/32/5 484/31/5 +f 3/32/5 625/826/5 31/33/5 +f 649/34/2 650/1261/2 538/35/2 +f 186/36/2 305/1359/2 649/34/2 +f 305/1359/2 304/1268/2 649/34/2 +f 691/1319/2 692/38/2 105/37/2 +f 692/38/2 451/1360/2 569/39/2 +f 256/40/5 160/1361/5 512/41/5 +f 43/1049/3 156/795/3 627/45/3 +f 156/795/3 528/43/3 627/45/3 +f 104/1362/5 106/1363/5 105/48/5 +f 106/1363/5 198/46/5 105/48/5 +f 267/49/4 160/272/4 256/50/4 +f 244/1364/4 1/1365/4 245/252/4 +f 1/1365/4 35/52/4 245/252/4 +f 283/53/4 533/395/4 258/54/4 +f 533/395/4 37/393/4 615/1366/4 +f 258/54/4 533/395/4 615/1366/4 +f 258/54/4 245/252/4 35/52/4 +f 271/88/1 41/1367/1 302/57/1 +f 41/1367/1 166/55/1 302/57/1 +f 166/55/1 31/1368/1 520/1234/1 +f 520/1234/1 173/1369/1 166/55/1 +f 173/1369/1 184/56/1 166/55/1 +f 184/56/1 659/1370/1 182/604/1 +f 302/57/1 648/136/1 271/88/1 +f 184/56/1 182/604/1 302/57/1 +f 445/1371/4 99/1372/4 109/60/4 +f 99/1372/4 582/58/4 109/60/4 +f 475/61/4 24/1373/4 620/62/4 +f 491/1374/5 146/65/5 248/64/5 +f 146/65/5 47/807/5 629/66/5 +f 476/69/4 597/96/4 3/67/4 +f 597/96/4 621/94/4 28/360/4 +f 28/360/4 625/872/4 3/67/4 +f 597/96/4 28/360/4 3/67/4 +f 248/70/4 629/1375/4 389/71/4 +f 498/1376/4 150/74/4 367/73/4 +f 150/74/4 170/853/4 646/75/4 +f 532/76/4 286/1173/4 36/77/4 +f 391/79/4 38/1377/4 515/80/4 +f 287/82/4 638/356/4 618/83/4 +f 255/85/4 21/1378/4 508/86/4 +f 271/88/4 41/1367/4 516/89/4 +f 580/1379/5 111/93/5 579/92/5 +f 111/93/5 709/1380/5 232/91/5 +f 709/1380/5 239/1381/5 232/91/5 +f 239/1381/5 716/1382/5 232/91/5 +f 716/1382/5 708/1383/5 232/91/5 +f 621/94/1 619/1384/1 596/95/1 +f 639/97/4 174/1385/4 524/98/4 +f 345/100/4 107/1386/4 331/101/4 +f 536/103/4 410/1133/4 268/104/4 +f 260/108/4 133/1387/4 26/106/4 +f 133/1387/4 7/1388/4 26/106/4 +f 7/1388/4 369/1389/4 26/106/4 +f 226/109/6 701/768/6 216/110/6 +f 552/112/4 649/1390/4 304/113/4 +f 13/115/2 251/1391/2 151/116/2 +f 444/118/6 567/1392/6 555/119/6 +f 190/121/4 408/28/4 279/29/4 +f 202/123/2 555/1393/2 551/124/2 +f 660/182/1 316/127/1 420/126/1 +f 316/127/1 208/1394/1 95/128/1 +f 544/129/4 409/1132/4 536/103/4 +f 414/131/1 9/1395/1 165/130/1 +f 9/1395/1 480/1396/1 134/344/1 +f 165/130/1 9/1395/1 134/344/1 +f 165/130/1 518/1397/1 649/1390/1 +f 304/113/1 78/114/1 414/131/1 +f 165/130/1 649/1390/1 304/113/1 +f 359/134/4 718/1398/4 466/132/4 +f 718/1398/4 589/1399/4 466/132/4 +f 466/132/4 117/517/4 586/1400/4 +f 466/132/4 586/1400/4 356/133/4 +f 413/135/4 314/1401/4 648/136/4 +f 459/140/2 698/1325/2 110/881/2 +f 698/1325/2 579/1165/2 697/1402/2 +f 110/881/2 698/1325/2 697/1402/2 +f 110/881/2 455/138/2 459/140/2 +f 42/141/1 419/1403/1 546/142/1 +f 709/1016/1 237/145/1 239/144/1 +f 237/145/1 126/282/1 717/146/1 +f 54/147/4 537/3/4 640/1339/4 +f 56/148/4 53/1404/4 289/149/4 +f 54/147/4 640/1339/4 56/148/4 +f 656/457/4 430/1405/4 289/149/4 +f 430/1405/4 54/147/4 289/149/4 +f 289/149/4 415/1406/4 656/457/4 +f 301/150/4 428/1407/4 52/151/4 +f 420/126/4 660/182/4 538/153/4 +f 437/157/3 195/1408/3 72/155/3 +f 195/1408/3 669/1409/3 72/155/3 +f 558/158/4 664/561/4 543/159/4 +f 559/161/4 210/668/4 83/1224/4 +f 292/162/4 645/1410/4 280/848/4 +f 559/161/4 83/1224/4 292/162/4 +f 525/163/4 431/1411/4 559/161/4 +f 292/162/4 280/848/4 525/163/4 +f 84/164/4 437/896/4 295/316/4 +f 278/165/4 58/1340/4 560/166/4 +f 58/1340/4 421/1/4 560/166/4 +f 84/164/4 295/316/4 278/165/4 +f 679/231/4 681/1412/4 84/164/4 +f 560/166/4 679/231/4 84/164/4 +f 665/167/2 667/1285/2 561/168/2 +f 667/1285/2 319/1413/2 561/168/2 +f 561/168/2 189/1115/2 663/169/2 +f 189/170/4 561/1007/4 407/171/4 +f 319/173/4 667/1278/4 653/174/4 +f 564/176/4 313/431/4 548/177/4 +f 581/1414/5 348/922/5 113/1415/5 +f 348/922/5 355/179/5 113/1415/5 +f 355/179/5 129/1416/5 130/180/5 +f 127/181/5 113/1415/5 355/179/5 +f 316/127/4 323/450/4 558/158/4 +f 556/1417/4 519/183/4 66/185/4 +f 519/183/4 272/1418/4 273/184/4 +f 273/184/4 417/413/4 66/185/4 +f 417/413/4 200/1254/4 66/185/4 +f 189/170/4 661/409/4 324/186/4 +f 324/186/4 98/1419/4 695/187/4 +f 695/187/4 101/1420/4 100/188/4 +f 101/1420/4 102/1006/4 100/188/4 +f 100/188/4 189/170/4 324/186/4 +f 433/189/4 326/1421/4 662/190/4 +f 694/194/3 571/1152/3 340/192/3 +f 571/1152/3 94/1422/3 340/192/3 +f 94/1422/3 341/1157/3 340/192/3 +f 436/195/4 86/455/4 563/196/4 +f 399/198/5 32/800/5 364/199/5 +f 1/201/5 469/1423/5 636/202/5 +f 78/114/4 414/131/4 76/204/4 +f 414/131/4 75/1424/4 76/204/4 +f 76/204/4 330/1425/4 93/205/4 +f 441/208/4 331/101/4 321/783/4 +f 676/206/4 80/1426/4 416/207/4 +f 441/208/4 321/783/4 676/206/4 +f 719/209/6 241/1427/6 121/210/6 +f 320/1428/6 451/213/6 92/212/6 +f 451/213/6 452/1429/6 345/214/6 +f 91/215/4 665/1131/4 663/216/4 +f 686/218/4 687/1430/4 433/189/4 +f 209/220/4 212/1013/4 89/221/4 +f 23/225/5 132/1431/5 504/223/5 +f 132/1431/5 246/1432/5 2/790/5 +f 504/223/5 132/1431/5 2/790/5 +f 246/1432/5 471/1433/5 2/790/5 +f 628/1434/5 528/1012/5 46/228/5 +f 528/1012/5 541/226/5 46/228/5 +f 679/231/1 681/1412/1 704/1435/1 +f 704/1435/1 224/229/1 679/231/1 +f 87/1436/4 439/531/4 320/234/4 +f 439/531/4 569/232/4 320/234/4 +f 558/654/5 323/236/5 661/235/5 +f 323/236/5 217/1437/5 324/237/5 +f 573/1438/4 700/1439/4 343/492/4 +f 342/493/4 209/220/4 444/1440/4 +f 573/1438/4 343/492/4 342/493/4 +f 449/240/4 341/679/4 573/1438/4 +f 332/256/4 94/680/4 334/714/4 +f 449/240/4 573/1438/4 444/1440/4 +f 573/1438/4 342/493/4 444/1440/4 +f 429/239/4 332/256/4 334/714/4 +f 429/239/4 334/714/4 449/240/4 +f 444/1440/4 202/238/4 449/240/4 +f 312/1441/5 75/1442/5 414/535/5 +f 301/243/5 394/332/5 548/241/5 +f 394/332/5 271/593/5 180/1443/5 +f 312/1441/5 414/535/5 301/243/5 +f 692/960/5 691/961/5 312/1441/5 +f 320/1428/5 451/213/5 692/960/5 +f 548/241/5 313/1444/5 87/242/5 +f 87/242/5 320/1428/5 312/1441/5 +f 320/1428/5 692/960/5 312/1441/5 +f 312/1441/5 301/243/5 87/242/5 +f 271/593/5 648/889/5 180/1443/5 +f 180/1443/5 181/916/5 548/241/5 +f 180/1443/5 548/241/5 394/332/5 +f 177/876/5 69/245/5 59/244/5 +f 69/245/5 68/1445/5 70/246/5 +f 316/917/5 660/912/5 88/248/5 +f 660/912/5 202/120/5 88/248/5 +f 202/120/5 444/118/5 88/248/5 +f 697/249/4 579/570/4 338/250/4 +f 259/1446/1 615/1366/1 140/254/1 +f 615/1366/1 258/54/1 140/254/1 +f 258/54/1 245/252/1 140/254/1 +f 698/255/4 346/1447/4 332/256/4 +f 230/258/4 96/1448/4 453/259/4 +f 130/180/6 127/181/6 713/261/6 +f 713/261/6 589/774/6 718/262/6 +f 171/265/2 269/439/2 531/1449/2 +f 269/439/2 34/1348/2 531/1449/2 +f 531/1449/2 281/839/2 171/265/2 +f 281/839/2 49/263/2 171/265/2 +f 235/266/4 591/1450/4 225/267/4 +f 113/269/4 231/976/4 582/58/4 +f 501/1451/1 500/1452/1 256/50/1 +f 500/1452/1 634/271/1 256/50/1 +f 634/271/1 632/1453/1 160/272/1 +f 110/435/4 351/1454/4 455/1455/4 +f 351/1454/4 116/1456/4 455/1455/4 +f 420/126/4 550/867/4 95/128/4 +f 550/867/4 455/1455/4 694/1457/4 +f 215/274/4 208/1394/4 95/128/4 +f 455/1455/4 116/1456/4 694/1457/4 +f 97/273/4 712/1458/4 215/274/4 +f 712/1458/4 467/1459/4 215/274/4 +f 550/867/4 694/1457/4 95/128/4 +f 467/1459/4 219/1460/4 215/274/4 +f 95/128/4 694/1457/4 97/273/4 +f 505/276/6 140/1461/6 139/1462/6 +f 139/1462/6 593/1463/6 505/276/6 +f 593/1463/6 372/277/6 505/276/6 +f 372/277/6 151/899/6 611/583/6 +f 611/583/6 381/275/6 372/277/6 +f 590/278/4 713/1464/4 462/279/4 +f 717/146/4 128/1465/4 588/281/4 +f 124/283/4 238/519/4 350/284/4 +f 716/288/4 358/846/4 711/286/4 +f 358/846/4 125/845/4 711/286/4 +f 291/289/2 650/1261/2 65/290/2 +f 388/292/1 159/1466/1 138/293/1 +f 39/297/4 51/1467/4 622/295/4 +f 51/1467/4 183/966/4 622/295/4 +f 183/966/4 624/1468/4 622/295/4 +f 622/295/4 10/305/4 595/296/4 +f 371/298/1 151/899/1 503/299/1 +f 375/301/1 374/1469/1 504/302/1 +f 263/304/1 624/1468/1 622/295/1 +f 10/305/1 601/1470/1 263/304/1 +f 601/1470/1 376/1471/1 263/304/1 +f 528/308/4 156/793/4 45/1008/4 +f 45/1008/4 291/1472/4 306/306/4 +f 306/306/4 554/408/4 661/409/4 +f 651/307/4 541/172/4 528/308/4 +f 306/306/4 661/409/4 651/307/4 +f 528/308/4 45/1008/4 306/306/4 +f 378/309/1 509/1473/1 507/310/1 +f 606/312/1 147/852/1 148/313/1 +f 34/317/1 269/771/1 195/315/1 +f 195/315/1 437/896/1 295/316/1 +f 295/316/1 33/1474/1 34/317/1 +f 246/1475/1 132/1476/1 469/320/1 +f 132/1476/1 23/318/1 469/320/1 +f 23/318/1 616/1298/1 161/1477/1 +f 616/1298/1 163/1478/1 161/1477/1 +f 161/1477/1 636/319/1 23/318/1 +f 230/321/5 118/366/5 572/322/5 +f 108/1479/4 588/281/4 348/922/4 +f 588/281/4 128/1465/4 355/179/4 +f 348/922/4 588/281/4 355/179/4 +f 128/1465/4 129/1416/4 355/179/4 +f 348/922/4 226/268/4 220/986/4 +f 348/922/4 220/986/4 108/1479/4 +f 220/986/4 325/1480/4 108/1479/4 +f 325/1480/4 435/1481/4 553/1482/4 +f 322/1483/4 440/1484/4 456/326/4 +f 440/1484/4 580/501/4 228/324/4 +f 456/326/4 440/1484/4 228/324/4 +f 325/1480/4 553/1482/4 322/1483/4 +f 237/145/4 126/282/4 229/325/4 +f 126/282/4 456/326/4 229/325/4 +f 456/326/4 108/1479/4 322/1483/4 +f 108/1479/4 325/1480/4 322/1483/4 +f 153/327/1 618/83/1 613/84/1 +f 411/331/6 669/1485/6 195/1486/6 +f 195/1486/6 269/329/6 411/331/6 +f 9/537/6 414/535/6 394/332/6 +f 414/535/6 301/243/6 394/332/6 +f 394/332/6 271/593/6 164/333/6 +f 476/1487/6 480/1488/6 9/537/6 +f 164/333/6 621/592/6 597/334/6 +f 597/334/6 476/1487/6 9/537/6 +f 9/537/6 394/332/6 597/334/6 +f 668/336/6 682/1489/6 438/1490/6 +f 72/337/6 298/1491/6 409/335/6 +f 298/1491/6 63/624/6 409/335/6 +f 668/336/6 438/1490/6 72/337/6 +f 63/624/6 536/625/6 409/335/6 +f 32/338/1 158/913/1 602/339/1 +f 247/1492/4 242/1493/4 370/343/4 +f 242/1493/4 22/341/4 370/343/4 +f 22/341/4 614/1494/4 141/342/4 +f 30/601/6 384/1495/6 363/346/6 +f 384/1495/6 165/130/6 363/346/6 +f 165/130/6 134/344/6 363/346/6 +f 234/349/6 462/773/6 700/347/6 +f 462/773/6 113/1415/6 700/347/6 +f 113/1415/6 581/1414/6 700/347/6 +f 700/347/6 573/1496/6 214/348/6 +f 393/350/1 392/1497/1 285/351/1 +f 284/1498/1 379/1499/1 404/355/1 +f 379/1499/1 162/353/1 404/355/1 +f 164/90/1 271/88/1 638/356/1 +f 477/1500/6 133/358/6 361/357/6 +f 133/358/6 260/550/6 382/359/6 +f 28/360/1 53/1404/1 270/361/1 +f 383/362/1 264/1501/1 418/363/1 +f 418/363/1 300/1502/1 260/108/1 +f 300/1502/1 617/107/1 260/108/1 +f 260/108/1 133/1387/1 250/645/1 +f 133/1387/1 477/1503/1 481/1504/1 +f 481/1504/1 250/645/1 133/1387/1 +f 250/645/1 383/362/1 260/108/1 +f 572/322/6 456/1505/6 118/366/6 +f 456/1505/6 126/364/6 118/366/6 +f 517/1506/6 55/368/6 518/367/6 +f 55/368/6 650/635/6 649/369/6 +f 167/370/1 188/1507/1 307/371/1 +f 526/372/1 529/1508/1 167/370/1 +f 529/1508/1 644/1509/1 167/370/1 +f 252/1510/1 604/1511/1 168/373/1 +f 294/374/1 69/1512/1 178/375/1 +f 69/1512/1 177/1513/1 178/375/1 +f 178/375/1 252/1510/1 168/373/1 +f 672/47/6 105/48/6 569/376/6 +f 703/378/3 706/1514/3 705/1515/3 +f 705/1515/3 463/1169/3 702/1516/3 +f 702/1516/3 582/1166/3 226/1330/3 +f 702/1516/3 226/1330/3 225/1517/3 +f 703/378/3 705/1515/3 702/1516/3 +f 458/1518/3 224/1519/3 344/379/3 +f 224/1519/3 704/380/3 344/379/3 +f 702/1516/3 225/1517/3 703/378/3 +f 225/1517/3 344/379/3 703/378/3 +f 43/681/4 627/1520/4 17/1521/4 +f 627/1520/4 628/381/4 19/383/4 +f 17/1521/4 627/1520/4 19/383/4 +f 46/1522/4 540/1523/4 652/382/4 +f 628/381/4 46/1522/4 652/382/4 +f 19/383/4 600/1524/4 17/1521/4 +f 600/1524/4 15/1525/4 17/1521/4 +f 442/386/6 454/1526/6 455/1527/6 +f 419/384/6 42/600/6 623/1528/6 +f 442/386/6 455/1527/6 550/892/6 +f 419/384/6 623/1528/6 77/385/6 +f 442/386/6 550/892/6 419/384/6 +f 81/387/5 420/463/5 95/388/5 +f 390/390/1 172/1529/1 411/391/1 +f 37/393/1 288/1530/1 647/394/1 +f 35/398/3 636/1531/3 532/396/3 +f 636/1531/3 161/1066/3 391/1062/3 +f 532/396/3 636/1531/3 391/1062/3 +f 391/1062/3 286/1063/3 532/396/3 +f 284/397/3 283/1051/3 35/398/3 +f 354/401/3 715/1532/3 121/399/3 +f 715/1532/3 468/1533/3 238/1534/3 +f 121/399/3 715/1532/3 238/1534/3 +f 238/1534/3 124/1196/3 121/399/3 +f 641/1535/1 643/877/1 192/404/1 +f 643/877/1 327/402/1 192/404/1 +f 63/405/1 298/426/1 311/406/1 +f 324/186/1 98/1419/1 554/408/1 +f 179/410/1 412/1536/1 545/411/1 +f 417/413/1 200/1254/1 181/414/1 +f 198/46/6 672/47/6 412/1537/6 +f 672/47/6 655/1538/6 412/1537/6 +f 412/1537/6 179/1539/6 547/417/6 +f 179/1539/6 392/416/6 547/417/6 +f 514/143/6 546/142/6 547/417/6 +f 547/417/6 198/46/6 412/1537/6 +f 392/416/6 393/587/6 514/143/6 +f 236/420/3 467/1540/3 589/418/3 +f 467/1540/3 712/1541/3 589/418/3 +f 712/1541/3 466/1195/3 589/418/3 +f 713/1542/3 127/1543/3 714/419/3 +f 589/418/3 713/1542/3 714/419/3 +f 548/1270/2 181/422/2 426/421/2 +f 181/422/2 314/1544/2 413/423/2 +f 541/172/1 189/170/1 661/409/1 +f 169/425/1 630/1545/1 534/424/1 +f 630/1545/1 204/1546/1 534/424/1 +f 204/1546/1 678/1547/1 534/424/1 +f 678/1547/1 396/1548/1 534/424/1 +f 63/405/4 298/426/4 411/391/4 +f 298/426/4 72/454/4 669/427/4 +f 655/428/1 672/1281/1 670/429/1 +f 416/207/1 441/208/1 313/431/1 +f 510/432/2 508/1549/2 509/433/2 +f 508/1549/2 507/1550/2 509/433/2 +f 509/433/2 148/1551/2 147/434/2 +f 64/657/1 550/867/1 205/437/1 +f 550/867/1 455/1455/1 205/437/1 +f 455/1455/1 110/435/1 205/437/1 +f 635/438/3 390/1552/3 171/265/3 +f 609/441/3 257/1553/3 610/1554/3 +f 610/1554/3 382/1555/3 617/1343/3 +f 382/1555/3 260/1342/3 617/1343/3 +f 609/441/3 610/1554/3 617/1343/3 +f 613/4/3 618/5/3 616/702/3 +f 609/441/3 617/1343/3 613/4/3 +f 613/4/3 616/702/3 23/440/3 +f 83/13/2 436/942/2 327/443/2 +f 436/942/2 681/444/2 327/443/2 +f 681/444/2 679/1556/2 566/442/2 +f 679/1556/2 82/1557/2 566/442/2 +f 162/445/2 379/1558/2 258/446/2 +f 558/158/1 664/561/1 323/450/1 +f 664/561/1 218/448/1 323/450/1 +f 218/448/1 219/1460/1 217/449/1 +f 219/1460/1 215/274/1 217/449/1 +f 215/274/1 208/1394/1 217/449/1 +f 310/451/1 683/1559/1 680/452/1 +f 72/454/1 438/1560/1 86/455/1 +f 427/1561/1 429/239/1 206/456/1 +f 429/239/1 332/256/1 206/456/1 +f 656/457/1 430/1405/1 448/458/1 +f 372/460/2 368/1562/2 503/461/2 +f 95/388/6 443/952/6 552/462/6 +f 262/464/4 30/1563/4 363/465/4 +f 673/468/1 564/176/1 92/102/1 +f 564/176/1 313/431/1 92/102/1 +f 92/102/1 345/100/1 696/467/1 +f 686/218/1 214/509/1 340/469/1 +f 328/1564/3 329/1565/3 693/473/3 +f 329/1565/3 448/471/3 693/473/3 +f 446/474/4 682/1566/4 668/1567/4 +f 85/1356/4 193/1357/4 211/1014/4 +f 446/474/4 668/1567/4 85/1356/4 +f 575/491/4 463/1568/4 450/475/4 +f 463/1568/4 705/476/4 450/475/4 +f 85/1356/4 211/1014/4 446/474/4 +f 211/1014/4 450/475/4 446/474/4 +f 489/1569/4 603/950/4 491/1570/4 +f 603/950/4 60/479/4 47/478/4 +f 491/1570/4 603/950/4 146/1571/4 +f 60/479/4 59/1572/4 70/1573/4 +f 70/1573/4 423/477/4 60/479/4 +f 423/477/4 631/924/4 47/478/4 +f 47/478/4 146/1571/4 603/950/4 +f 130/482/4 131/1574/4 714/480/4 +f 131/1574/4 236/1575/4 714/480/4 +f 113/269/1 127/481/1 587/1576/1 +f 127/481/1 130/482/1 587/1576/1 +f 113/269/1 347/1577/1 581/270/1 +f 130/482/1 240/1578/1 587/1576/1 +f 587/1576/1 115/780/1 347/1577/1 +f 347/1577/1 579/570/1 338/250/1 +f 570/483/1 551/1579/1 567/484/1 +f 551/1579/1 555/1580/1 567/484/1 +f 347/1577/1 338/250/1 570/483/1 +f 587/1576/1 347/1577/1 113/269/1 +f 581/270/1 347/1577/1 570/483/1 +f 567/484/1 99/1372/1 582/58/1 +f 567/484/1 582/58/1 581/270/1 +f 158/485/5 265/1581/5 144/486/5 +f 611/488/2 623/1582/2 514/489/2 +f 623/1582/2 42/1583/2 514/489/2 +f 514/489/2 393/1584/2 381/490/2 +f 575/491/1 463/1568/1 343/492/1 +f 557/534/1 81/494/1 176/496/1 +f 81/494/1 43/681/1 175/495/1 +f 43/681/1 627/1520/1 175/495/1 +f 175/495/1 46/1522/1 176/496/1 +f 46/1522/1 540/1523/1 176/496/1 +f 339/497/1 227/1585/1 460/498/1 +f 228/324/1 229/325/1 111/500/1 +f 495/1586/5 145/504/5 494/503/5 +f 145/504/5 507/806/5 530/502/5 +f 507/806/5 169/1587/5 530/502/5 +f 458/507/1 344/567/1 715/1588/1 +f 213/506/1 336/514/1 659/1370/1 +f 201/1589/1 307/371/1 213/506/1 +f 307/371/1 458/507/1 213/506/1 +f 213/506/1 659/1370/1 201/1589/1 +f 458/507/1 715/1588/1 354/505/1 +f 349/508/1 234/516/1 214/509/1 +f 353/511/1 711/286/1 708/287/1 +f 465/515/1 710/1590/1 693/513/1 +f 710/1590/1 328/1591/1 693/513/1 +f 234/516/1 589/1399/1 466/132/1 +f 124/283/1 238/519/1 719/518/1 +f 238/519/1 468/1592/1 720/520/1 +f 178/521/5 60/1593/5 603/522/5 +f 293/525/5 294/1594/5 168/1595/5 +f 168/1595/5 386/1596/5 293/525/5 +f 386/1596/5 309/526/5 293/525/5 +f 309/526/5 653/869/5 667/928/5 +f 667/928/5 665/524/5 309/526/5 +f 336/527/6 448/1597/6 430/528/6 +f 405/603/4 286/1173/4 425/532/4 +f 286/1173/4 196/530/4 425/532/4 +f 684/533/4 685/1598/4 557/534/4 +f 414/535/5 657/1599/5 11/536/5 +f 481/1600/5 482/1601/5 250/540/5 +f 482/1601/5 261/538/5 250/540/5 +f 142/541/5 251/1602/5 13/542/5 +f 612/1603/5 368/788/5 258/1604/5 +f 368/788/5 249/544/5 245/546/5 +f 249/544/5 474/1605/5 244/545/5 +f 245/546/5 258/1604/5 368/788/5 +f 40/547/5 262/1228/5 599/548/5 +f 260/550/5 39/1606/5 595/551/5 +f 672/1281/4 670/429/4 105/554/4 +f 670/429/4 103/552/4 105/554/4 +f 510/555/5 147/811/5 606/556/5 +f 608/558/5 22/1607/5 242/559/5 +f 218/448/4 568/1608/4 319/173/4 +f 622/562/5 621/592/5 597/334/5 +f 14/564/5 264/1229/5 624/565/5 +f 188/1507/4 307/371/4 82/569/4 +f 307/371/4 458/507/4 82/569/4 +f 458/507/4 344/567/4 82/569/4 +f 579/570/1 232/781/1 233/571/1 +f 170/574/6 150/617/6 387/1609/6 +f 150/617/6 498/1610/6 256/40/6 +f 160/1361/6 150/617/6 256/40/6 +f 498/1610/6 501/1611/6 256/40/6 +f 160/1361/6 632/1612/6 387/1609/6 +f 194/573/6 410/1613/6 170/574/6 +f 150/617/6 160/1361/6 387/1609/6 +f 387/1609/6 71/572/6 170/574/6 +f 496/1614/5 138/1615/5 21/577/5 +f 138/1615/5 159/575/5 21/577/5 +f 159/575/5 266/1616/5 508/576/5 +f 691/578/4 337/257/4 206/456/4 +f 267/582/5 253/1617/5 254/1618/5 +f 297/1619/5 536/625/5 409/335/5 +f 267/582/5 254/1618/5 633/580/5 +f 254/1618/5 297/1619/5 633/580/5 +f 631/581/5 511/1620/5 267/582/5 +f 409/335/5 62/915/5 297/1619/5 +f 62/915/5 633/580/5 297/1619/5 +f 74/1621/5 671/1094/5 545/1622/5 +f 671/1094/5 611/583/5 50/585/5 +f 545/1622/5 671/1094/5 50/585/5 +f 611/583/5 381/275/5 285/584/5 +f 615/586/5 37/1623/5 392/416/5 +f 83/1224/4 90/588/4 436/195/4 +f 90/588/4 578/1624/4 577/24/4 +f 618/589/5 638/1625/5 163/590/5 +f 621/592/5 270/1626/5 271/593/5 +f 516/594/5 41/1627/5 273/595/5 +f 640/597/5 537/615/5 173/905/5 +f 173/905/5 520/1628/5 640/597/5 +f 520/1628/5 626/598/5 640/597/5 +f 626/598/5 524/1629/5 174/599/5 +f 303/1630/5 65/893/5 550/892/5 +f 42/600/5 623/1528/5 154/1631/5 +f 15/1632/5 600/1633/5 363/346/5 +f 42/600/5 154/1631/5 15/1632/5 +f 303/1630/5 550/892/5 419/384/5 +f 384/1495/5 274/1033/5 290/602/5 +f 290/602/5 303/1630/5 419/384/5 +f 42/600/5 15/1632/5 30/601/5 +f 15/1632/5 363/346/5 30/601/5 +f 290/602/5 419/384/5 42/600/5 +f 30/601/5 384/1495/5 290/602/5 +f 301/150/1 425/532/1 405/603/1 +f 336/514/4 659/1370/4 79/606/4 +f 659/1370/4 182/604/4 79/606/4 +f 182/604/4 314/1401/4 675/605/4 +f 79/606/4 693/513/4 336/514/4 +f 377/609/5 492/1634/5 136/1635/5 +f 280/1636/5 645/1637/5 279/607/5 +f 377/609/5 136/1635/5 279/607/5 +f 136/1635/5 280/1636/5 279/607/5 +f 542/608/5 407/902/5 377/609/5 +f 279/607/5 408/1638/5 542/608/5 +f 487/611/4 364/340/4 145/311/4 +f 364/340/4 32/338/4 507/310/4 +f 145/311/4 364/340/4 507/310/4 +f 32/338/4 169/425/4 507/310/4 +f 28/1038/5 624/565/5 53/614/5 +f 624/565/5 183/612/5 53/614/5 +f 640/597/6 537/615/6 174/599/6 +f 537/615/6 187/1639/6 185/616/6 +f 150/617/5 607/836/5 171/330/5 +f 607/836/5 269/329/5 171/330/5 +f 171/330/5 268/618/5 150/617/5 +f 410/1613/5 170/574/5 268/618/5 +f 602/619/3 144/1640/3 3/1641/3 +f 601/620/3 10/1642/3 250/1643/3 +f 602/619/3 3/1641/3 601/620/3 +f 18/621/3 364/1644/3 602/619/3 +f 601/620/3 250/1643/3 18/621/3 +f 55/368/5 650/635/5 291/622/5 +f 49/626/5 281/1645/5 63/624/5 +f 281/1645/5 531/810/5 63/624/5 +f 531/810/5 299/1646/5 63/624/5 +f 299/1646/5 298/1491/5 63/624/5 +f 86/1159/3 436/942/3 681/444/3 +f 679/1556/3 317/722/3 678/627/3 +f 204/628/3 86/1159/3 681/444/3 +f 681/444/3 679/1556/3 678/627/3 +f 302/629/5 182/1647/5 200/630/5 +f 305/632/5 429/704/5 78/114/5 +f 54/633/5 430/528/5 659/529/5 +f 649/369/5 552/462/5 420/463/5 +f 538/636/5 660/912/5 554/637/5 +f 340/640/5 341/1648/5 707/981/5 +f 117/641/5 466/980/5 712/1649/5 +f 340/640/5 707/981/5 117/641/5 +f 712/1649/5 97/639/5 117/641/5 +f 651/642/5 661/235/5 557/643/5 +f 506/647/4 521/1650/4 399/995/4 +f 399/995/4 18/996/4 506/647/4 +f 18/996/4 250/645/4 506/647/4 +f 250/645/4 383/362/4 14/646/4 +f 383/362/4 264/1501/4 14/646/4 +f 543/648/5 664/988/5 189/649/5 +f 282/1651/5 283/652/5 73/651/5 +f 283/652/5 284/1652/5 197/650/5 +f 284/1652/5 532/696/5 197/650/5 +f 539/655/5 308/1653/5 434/653/5 +f 308/1653/5 191/1654/5 434/653/5 +f 393/350/4 392/1497/4 414/131/4 +f 392/1497/4 179/410/4 414/131/4 +f 179/410/4 412/1536/4 414/131/4 +f 414/131/4 9/1395/4 393/350/4 +f 9/1395/4 8/1655/4 27/656/4 +f 27/656/4 505/1656/4 381/352/4 +f 9/1395/4 27/656/4 393/350/4 +f 64/657/5 205/437/5 199/658/5 +f 200/630/5 207/1657/5 441/660/5 +f 241/1658/1 360/1659/1 120/663/1 +f 360/1659/1 464/1660/1 120/663/1 +f 230/258/1 96/1448/1 221/662/1 +f 464/1660/1 230/258/1 120/663/1 +f 120/663/1 121/1661/1 241/1658/1 +f 84/664/5 681/1662/5 436/665/5 +f 192/667/5 318/1663/5 210/668/5 +f 400/669/4 488/1664/4 4/670/4 +f 219/977/5 218/672/5 212/674/5 +f 218/672/5 664/988/5 326/673/5 +f 664/988/5 662/1665/5 326/673/5 +f 326/673/5 89/958/5 212/674/5 +f 212/674/5 575/746/5 219/977/5 +f 89/958/5 190/676/5 83/675/5 +f 190/676/5 61/1666/5 292/677/5 +f 112/678/4 707/280/4 341/679/4 +f 42/141/4 419/1403/4 81/494/4 +f 568/682/5 102/1667/5 561/683/5 +f 100/685/5 689/1668/5 663/686/5 +f 80/1669/5 676/688/5 553/687/5 +f 676/688/5 321/927/5 322/689/5 +f 654/690/5 674/1670/5 673/691/5 +f 673/691/5 696/1671/5 196/911/5 +f 696/1671/5 103/1672/5 196/911/5 +f 103/1672/5 670/1673/5 196/911/5 +f 196/911/5 286/849/5 391/1674/5 +f 391/1674/5 161/692/5 673/691/5 +f 161/692/5 287/1675/5 654/690/5 +f 391/1674/5 673/691/5 196/911/5 +f 287/1675/5 613/1676/5 617/1677/5 +f 617/1677/5 300/1678/5 287/1675/5 +f 300/1678/5 654/690/5 287/1675/5 +f 406/694/6 51/1679/6 638/1625/6 +f 51/1679/6 39/1606/6 619/1680/6 +f 619/1680/6 618/589/6 638/1625/6 +f 51/1679/6 619/1680/6 638/1625/6 +f 426/693/6 413/1681/6 406/694/6 +f 439/377/6 564/1682/6 426/693/6 +f 38/1683/6 405/1684/6 425/1685/6 +f 425/1685/6 439/377/6 426/693/6 +f 163/590/6 38/1683/6 426/693/6 +f 38/1683/6 425/1685/6 426/693/6 +f 406/694/6 638/1625/6 163/590/6 +f 380/697/6 23/225/6 132/1431/6 +f 132/1431/6 245/546/6 380/697/6 +f 245/546/6 258/1604/6 379/695/6 +f 379/695/6 284/1652/6 532/696/6 +f 245/546/6 379/695/6 380/697/6 +f 401/698/4 281/1686/4 605/699/4 +f 23/440/2 380/1687/2 513/701/2 +f 380/1687/2 36/1688/2 513/701/2 +f 513/701/2 515/1689/2 616/702/2 +f 570/703/5 332/1690/5 429/704/5 +f 247/1691/5 370/708/5 475/707/5 +f 370/708/5 141/791/5 24/706/5 +f 141/791/5 614/1692/5 24/706/5 +f 577/710/5 450/937/5 680/709/5 +f 450/937/5 211/938/5 680/709/5 +f 337/711/5 330/1693/5 76/712/5 +f 334/714/5 94/680/5 571/715/5 +f 208/717/5 215/953/5 695/718/5 +f 66/1694/5 659/529/5 315/721/5 +f 659/529/5 336/527/5 315/721/5 +f 336/527/5 96/323/5 335/720/5 +f 317/722/5 224/1695/5 458/926/5 +f 458/926/5 307/765/5 317/722/5 +f 307/765/5 421/723/5 317/722/5 +f 421/723/5 58/875/5 396/1696/5 +f 396/1696/5 678/627/5 421/723/5 +f 107/724/5 580/1379/5 440/725/5 +f 315/1697/4 335/1698/4 677/1699/4 +f 335/1698/4 96/1448/4 221/662/4 +f 221/662/4 120/663/4 122/727/4 +f 120/663/4 121/1661/4 122/727/4 +f 335/1698/4 221/662/4 677/1699/4 +f 457/728/4 677/1699/4 221/662/4 +f 114/1700/4 583/1701/4 457/728/4 +f 122/727/4 114/1700/4 457/728/4 +f 486/1702/5 16/1703/5 4/1704/5 +f 16/1703/5 522/729/5 4/1704/5 +f 43/841/5 81/387/5 277/730/5 +f 81/387/5 67/1705/5 277/730/5 +f 522/729/5 43/841/5 277/730/5 +f 44/731/5 4/1704/5 522/729/5 +f 48/1706/5 295/316/5 296/1707/5 +f 295/316/5 437/896/5 296/1707/5 +f 563/1708/5 86/897/5 683/969/5 +f 535/870/5 402/1709/5 311/734/5 +f 311/734/5 296/1707/5 563/1708/5 +f 296/1707/5 437/896/5 563/1708/5 +f 563/1708/5 683/969/5 310/732/5 +f 544/733/5 535/870/5 311/734/5 +f 310/732/5 85/1710/5 544/733/5 +f 311/734/5 563/1708/5 310/732/5 +f 338/735/5 579/92/5 698/736/5 +f 93/205/5 332/1690/5 346/738/5 +f 346/738/5 347/1711/5 353/737/5 +f 347/1711/5 115/970/5 353/737/5 +f 115/970/5 711/1712/5 353/737/5 +f 353/737/5 227/1585/5 339/497/5 +f 339/497/5 455/1527/5 93/205/5 +f 455/1527/5 550/892/5 93/205/5 +f 550/892/5 78/114/5 93/205/5 +f 93/205/5 346/738/5 339/497/5 +f 120/739/6 221/753/6 222/740/6 +f 401/1713/5 137/742/5 403/1714/5 +f 137/742/5 493/1715/5 6/314/5 +f 403/1714/5 137/742/5 148/313/5 +f 493/1715/5 497/1716/5 6/314/5 +f 148/313/5 33/1474/5 403/1714/5 +f 588/743/5 108/1717/5 222/740/5 +f 109/744/5 702/1718/5 463/745/5 +f 327/402/5 566/1719/5 344/747/5 +f 344/747/5 225/1720/5 578/1721/5 +f 225/1720/5 576/756/5 578/1721/5 +f 578/1721/5 90/748/5 344/747/5 +f 90/748/5 83/675/5 327/402/5 +f 699/749/5 585/1722/5 229/750/5 +f 354/752/5 120/739/5 221/753/5 +f 575/746/2 450/1242/2 109/744/2 +f 450/1242/2 577/755/2 109/744/2 +f 577/755/2 578/1721/2 576/756/2 +f 126/364/5 357/365/5 717/757/5 +f 357/365/5 464/1723/5 360/758/5 +f 110/759/5 697/959/5 233/760/5 +f 345/214/5 92/212/5 328/763/5 +f 92/212/5 313/1444/5 675/764/5 +f 675/764/5 314/887/5 656/1724/5 +f 92/212/5 675/764/5 328/763/5 +f 352/1725/5 452/1429/5 345/214/5 +f 328/763/5 710/1726/5 345/214/5 +f 710/1726/5 352/1725/5 345/214/5 +f 656/1724/5 329/762/5 675/764/5 +f 307/765/5 431/1727/5 525/766/5 +f 350/284/5 238/519/5 235/1005/5 +f 235/1005/5 226/109/5 350/284/5 +f 226/109/5 701/768/5 350/284/5 +f 701/768/5 583/1728/5 114/769/5 +f 499/1729/1 502/1730/1 607/772/1 +f 502/1730/1 635/770/1 607/772/1 +f 462/773/5 713/261/5 589/774/5 +f 122/775/5 121/210/5 124/211/5 +f 407/1266/2 542/1264/2 543/779/2 +f 542/1264/2 408/1731/2 190/777/2 +f 190/777/2 308/1732/2 539/778/2 +f 542/1264/2 190/777/2 543/779/2 +f 543/779/2 541/1263/2 407/1266/2 +f 115/780/4 347/1577/4 579/570/4 +f 497/1716/4 494/1733/4 6/314/4 +f 494/1733/4 530/782/4 6/314/4 +f 530/782/4 33/1474/4 148/313/4 +f 216/110/1 701/768/1 223/1734/1 +f 123/285/1 124/283/1 119/834/1 +f 223/1734/1 123/285/1 222/835/1 +f 123/285/1 119/834/1 222/835/1 +f 83/1224/1 90/588/1 216/110/1 +f 216/110/1 223/1734/1 222/835/1 +f 572/784/1 118/833/1 699/1735/1 +f 118/833/1 585/1736/1 699/1735/1 +f 216/110/1 222/835/1 432/1737/1 +f 222/835/1 572/784/1 321/783/1 +f 210/668/1 83/1224/1 216/110/1 +f 431/1411/1 559/161/1 210/668/1 +f 321/783/1 676/206/1 432/1737/1 +f 432/1737/1 431/1411/1 210/668/1 +f 210/668/1 216/110/1 432/1737/1 +f 222/835/1 321/783/1 432/1737/1 +f 699/1735/1 107/1386/1 331/101/1 +f 699/1735/1 331/101/1 572/784/1 +f 32/800/6 364/199/6 529/785/6 +f 364/199/6 487/1738/6 5/786/6 +f 249/544/6 592/1739/6 503/787/6 +f 504/223/6 369/1740/6 7/789/6 +f 141/791/6 151/899/6 371/298/6 +f 492/792/1 377/1741/1 156/793/1 +f 377/1741/1 407/171/1 528/308/1 +f 407/171/1 541/172/1 528/308/1 +f 156/793/1 30/1563/1 363/465/1 +f 377/1741/1 528/308/1 156/793/1 +f 156/793/1 363/465/1 483/794/1 +f 517/796/2 518/1742/2 165/1743/2 +f 384/1744/2 30/1227/2 156/795/2 +f 517/796/2 165/1743/2 384/1744/2 +f 528/43/2 398/1745/2 517/796/2 +f 384/1744/2 156/795/2 517/796/2 +f 160/797/2 267/1746/2 511/798/2 +f 644/1747/5 529/785/5 278/802/5 +f 529/785/5 32/800/5 278/802/5 +f 656/804/3 314/1544/3 413/423/3 +f 413/423/3 654/1748/3 300/1749/3 +f 300/1749/3 418/1750/3 658/805/3 +f 658/805/3 185/616/3 430/803/3 +f 185/616/3 187/1639/3 430/803/3 +f 187/1639/3 421/1113/3 307/1114/3 +f 201/904/3 659/1267/3 430/803/3 +f 187/1639/3 307/1114/3 201/904/3 +f 300/1749/3 658/805/3 656/804/3 +f 656/804/3 413/423/3 300/1749/3 +f 187/1639/3 201/904/3 430/803/3 +f 507/806/6 508/576/6 21/577/6 +f 47/807/6 168/1595/6 604/808/6 +f 148/313/6 509/1751/6 378/809/6 +f 281/1645/6 531/810/6 605/812/6 +f 531/810/6 34/1752/6 147/811/6 +f 147/811/6 606/556/6 605/812/6 +f 209/1140/5 203/932/5 99/814/5 +f 203/932/5 325/813/5 99/814/5 +f 220/111/5 226/109/5 582/955/5 +f 220/111/5 582/955/5 99/814/5 +f 390/817/6 635/1753/6 502/1754/6 +f 502/1754/6 367/1755/6 390/817/6 +f 367/1755/6 646/815/6 390/817/6 +f 261/1756/1 482/1757/1 155/820/1 +f 482/1757/1 135/1758/1 155/820/1 +f 135/1758/1 642/818/1 155/820/1 +f 152/823/6 613/1676/6 374/1759/6 +f 613/1676/6 617/1677/6 374/1759/6 +f 617/1677/6 26/1760/6 374/1759/6 +f 374/1759/6 375/1761/6 152/823/6 +f 375/1761/6 594/821/6 152/823/6 +f 20/1762/4 377/1741/4 386/825/4 +f 377/1741/4 407/171/4 386/825/4 +f 601/1763/6 3/32/6 376/828/6 +f 3/32/6 625/826/6 376/828/6 +f 625/826/6 31/33/6 166/1764/6 +f 56/1765/6 639/878/6 275/827/6 +f 625/826/6 166/1764/6 56/1765/6 +f 521/879/6 506/1766/6 376/828/6 +f 625/826/6 56/1765/6 275/827/6 +f 275/827/6 521/879/6 376/828/6 +f 478/1767/6 362/1768/6 598/543/6 +f 362/1768/6 620/829/6 598/543/6 +f 620/829/6 29/1223/6 13/542/6 +f 490/1769/6 18/200/6 135/1770/6 +f 18/200/6 399/198/6 642/830/6 +f 399/198/6 32/800/6 534/801/6 +f 642/830/6 135/1770/6 18/200/6 +f 488/832/6 400/1771/6 603/522/6 +f 400/1771/6 60/1593/6 603/522/6 +f 222/835/4 572/784/4 118/833/4 +f 118/833/4 357/1772/4 119/834/4 +f 388/837/6 365/1773/6 607/836/6 +f 365/1773/6 499/1774/6 607/836/6 +f 403/838/3 531/1449/3 281/839/3 +f 143/1775/6 16/1703/6 385/843/6 +f 16/1703/6 522/729/6 385/843/6 +f 522/729/6 43/841/6 385/843/6 +f 359/844/5 356/1776/5 125/845/5 +f 493/1777/1 137/700/1 136/847/1 +f 137/700/1 401/698/1 280/848/1 +f 286/849/6 391/1674/6 513/850/6 +f 606/312/4 147/852/4 607/772/4 +f 147/852/4 34/317/4 269/771/4 +f 170/853/1 297/1778/1 254/854/1 +f 598/855/1 13/25/1 141/342/1 +f 343/856/5 582/955/5 231/857/5 +f 349/858/5 574/1779/5 343/856/5 +f 574/1779/5 342/954/5 343/856/5 +f 57/859/6 175/1780/6 627/860/6 +f 59/244/6 177/876/6 397/862/6 +f 708/864/3 711/1186/3 356/1781/3 +f 711/1186/3 125/1782/3 356/1781/3 +f 356/1781/3 116/1783/3 708/864/3 +f 116/1783/3 351/865/3 708/864/3 +f 233/866/3 232/1187/3 708/864/3 +f 650/154/1 420/126/1 550/867/1 +f 401/1713/6 137/742/6 535/870/6 +f 137/742/6 20/1784/6 535/870/6 +f 386/1596/6 309/526/6 653/869/6 +f 20/1784/6 386/1596/6 535/870/6 +f 48/1706/6 403/1714/6 401/1713/6 +f 535/870/6 402/1709/6 401/1713/6 +f 402/1709/6 48/1706/6 401/1713/6 +f 386/1596/6 653/869/6 535/870/6 +f 3/67/1 144/1785/1 395/1786/1 +f 144/1785/1 265/1787/1 395/1786/1 +f 395/1786/1 626/871/1 3/67/1 +f 652/873/6 407/902/6 377/609/6 +f 58/875/6 396/1696/6 527/1788/6 +f 395/1789/6 526/767/6 58/875/6 +f 526/767/6 307/765/6 58/875/6 +f 58/875/6 527/1788/6 395/1789/6 +f 69/245/6 540/227/6 46/228/6 +f 83/675/6 327/402/6 643/877/6 +f 275/827/5 521/879/5 639/878/5 +f 521/879/5 155/1790/5 276/880/5 +f 110/881/3 455/138/3 454/1791/3 +f 104/883/3 103/1792/3 696/1793/3 +f 696/1793/3 345/1162/3 452/1163/3 +f 452/1163/3 580/1161/3 579/1165/3 +f 452/1163/3 579/1165/3 697/1402/3 +f 104/883/3 696/1793/3 452/1163/3 +f 110/881/3 454/1791/3 106/882/3 +f 104/883/3 452/1163/3 697/1402/3 +f 697/1402/3 110/881/3 104/883/3 +f 361/884/1 382/1794/1 610/885/1 +f 156/1795/6 43/841/6 45/623/6 +f 43/841/6 81/387/6 45/623/6 +f 81/387/6 420/463/6 291/622/6 +f 420/463/6 650/635/6 291/622/6 +f 314/887/6 656/1724/6 415/888/6 +f 474/1796/1 249/21/1 243/891/1 +f 249/21/1 368/19/1 608/890/1 +f 368/19/1 612/1797/1 608/890/1 +f 550/892/6 78/114/6 304/113/6 +f 192/667/6 188/921/6 167/894/6 +f 33/1474/6 295/316/6 630/1798/6 +f 295/316/6 437/896/6 204/898/6 +f 437/896/6 563/1708/6 86/897/6 +f 204/898/6 630/1798/6 295/316/6 +f 251/900/1 142/1799/1 154/1800/1 +f 142/1799/1 143/1801/1 154/1800/1 +f 143/1801/1 385/1802/1 154/1800/1 +f 154/1800/1 623/1095/1 251/900/1 +f 623/1095/1 611/583/1 251/900/1 +f 680/709/6 436/665/6 422/666/6 +f 422/666/6 645/1637/6 562/901/6 +f 645/1637/6 279/607/6 408/1638/6 +f 408/1638/6 193/1803/6 562/901/6 +f 645/1637/6 408/1638/6 562/901/6 +f 661/235/6 558/654/6 539/655/6 +f 663/686/6 189/649/6 541/226/6 +f 561/683/6 319/684/6 542/608/6 +f 520/1628/6 519/1804/6 173/905/6 +f 519/1804/6 556/903/6 173/905/6 +f 470/906/5 472/1805/5 610/907/5 +f 196/911/6 286/849/6 404/1806/6 +f 404/1806/6 533/1807/6 647/909/6 +f 647/909/6 50/585/6 545/1622/6 +f 424/910/6 670/1673/6 196/911/6 +f 647/909/6 545/1622/6 424/910/6 +f 196/911/6 404/1806/6 647/909/6 +f 202/120/6 186/1808/6 538/636/6 +f 527/1809/4 396/1548/4 158/913/4 +f 396/1548/4 534/424/4 158/913/4 +f 666/1810/6 62/915/6 423/914/6 +f 62/915/6 633/580/6 631/581/6 +f 548/241/6 313/1444/6 181/916/6 +f 313/1444/6 675/764/6 181/916/6 +f 660/912/6 554/637/6 316/917/6 +f 554/637/6 98/719/6 316/917/6 +f 323/236/6 433/933/6 434/653/6 +f 325/813/6 210/668/6 559/161/6 +f 82/919/6 679/1811/6 560/920/6 +f 235/266/1 355/179/1 348/922/1 +f 47/478/1 146/1571/1 511/923/1 +f 146/1571/1 149/1812/1 511/923/1 +f 149/1812/1 512/1813/1 511/923/1 +f 307/765/6 431/1727/6 677/925/6 +f 431/1727/6 432/1814/6 677/925/6 +f 677/925/6 457/1815/6 458/926/6 +f 321/927/6 335/720/6 315/721/6 +f 667/928/6 665/524/6 91/929/6 +f 687/931/6 209/1140/6 203/932/6 +f 162/934/5 615/586/5 259/1816/5 +f 259/1816/5 27/1817/5 8/1818/5 +f 596/1819/5 619/1680/5 153/1820/5 +f 619/1680/5 618/589/5 153/1820/5 +f 259/1816/5 8/1818/5 25/935/5 +f 8/1818/5 596/1819/5 25/935/5 +f 162/934/5 259/1816/5 25/935/5 +f 596/1819/5 153/1820/5 25/935/5 +f 25/935/5 616/591/5 515/936/5 +f 515/936/5 38/1683/5 405/1684/5 +f 405/1684/5 425/1685/5 637/1821/5 +f 425/1685/5 655/1538/5 288/1822/5 +f 637/1821/5 425/1685/5 288/1822/5 +f 655/1538/5 412/1537/5 179/1539/5 +f 288/1822/5 37/1623/5 637/1821/5 +f 655/1538/5 179/1539/5 288/1822/5 +f 515/936/5 405/1684/5 162/934/5 +f 405/1684/5 637/1821/5 162/934/5 +f 102/1667/6 101/1823/6 568/682/6 +f 101/1823/6 450/937/6 568/682/6 +f 211/938/6 193/1803/6 319/684/6 +f 211/938/6 319/684/6 568/682/6 +f 633/985/4 62/940/4 387/939/4 +f 62/940/4 666/1824/4 71/941/4 +f 211/1825/3 89/1347/3 680/943/3 +f 89/1347/3 83/13/3 680/943/3 +f 403/1826/4 48/945/4 531/944/4 +f 48/945/4 296/1827/4 299/946/4 +f 282/947/4 73/1828/4 545/411/4 +f 73/1828/4 74/1829/4 545/411/4 +f 545/411/4 50/412/4 282/947/4 +f 157/948/1 522/27/1 16/949/1 +f 603/950/1 60/479/1 157/948/1 +f 60/479/1 59/1572/1 157/948/1 +f 93/205/6 332/1690/6 429/704/6 +f 340/640/6 341/1648/6 449/951/6 +f 215/953/6 214/348/6 686/247/6 +f 209/1140/6 342/954/6 99/814/6 +f 342/954/6 343/856/6 582/955/6 +f 445/956/6 109/744/6 576/756/6 +f 688/957/6 90/748/6 83/675/6 +f 445/956/6 576/756/6 688/957/6 +f 89/958/6 212/674/6 445/956/6 +f 688/957/6 83/675/6 89/958/6 +f 691/961/6 312/1441/6 75/1442/6 +f 75/1442/6 565/1830/6 691/961/6 +f 565/1830/6 110/759/6 691/961/6 +f 110/759/6 697/959/6 691/961/6 +f 704/380/6 681/1662/6 577/710/6 +f 681/1662/6 436/665/6 577/710/6 +f 223/1831/6 348/922/6 123/776/6 +f 348/922/6 355/179/6 123/776/6 +f 427/1832/6 206/713/6 428/962/6 +f 206/713/6 337/711/6 338/735/6 +f 338/735/6 579/92/6 580/1379/6 +f 206/713/6 338/735/6 440/725/6 +f 428/962/6 206/713/6 440/725/6 +f 273/595/6 52/1833/6 417/631/6 +f 52/1833/6 428/962/6 416/661/6 +f 417/631/6 52/1833/6 416/661/6 +f 338/735/6 580/1379/6 440/725/6 +f 440/725/6 331/726/6 441/660/6 +f 416/661/6 200/630/6 417/631/6 +f 440/725/6 441/660/6 428/962/6 +f 571/715/6 694/1834/6 586/963/6 +f 694/1834/6 116/1835/6 586/963/6 +f 116/1835/6 356/1776/6 586/963/6 +f 586/963/6 112/678/6 94/680/6 +f 336/527/6 96/323/6 230/321/6 +f 230/321/6 464/1723/6 465/964/6 +f 174/1385/1 185/1836/1 639/97/1 +f 185/1836/1 658/965/1 639/97/1 +f 183/966/1 624/1468/1 639/97/1 +f 624/1468/1 275/99/1 639/97/1 +f 517/1837/1 398/1838/1 539/160/1 +f 398/1838/1 543/159/1 539/160/1 +f 539/160/1 558/158/1 660/182/1 +f 538/153/1 650/154/1 55/967/1 +f 55/967/1 517/1837/1 539/160/1 +f 539/160/1 660/182/1 538/153/1 +f 446/1839/6 705/1840/6 683/969/6 +f 705/1840/6 706/968/6 683/969/6 +f 228/751/6 347/1711/6 229/750/6 +f 347/1711/6 115/970/6 229/750/6 +f 584/972/6 708/1383/6 232/91/6 +f 232/91/6 579/92/6 584/972/6 +f 579/92/6 698/736/6 584/972/6 +f 698/736/6 459/1841/6 460/973/6 +f 453/974/6 693/1842/6 447/1843/6 +f 693/1842/6 79/1844/6 447/1843/6 +f 79/1844/6 207/1657/6 447/1843/6 +f 447/1843/6 331/726/6 453/974/6 +f 331/726/6 107/724/6 453/974/6 +f 107/724/6 580/1379/6 111/93/6 +f 107/724/6 111/93/6 461/975/6 +f 702/59/1 236/1575/1 231/976/1 +f 236/1575/1 714/480/1 231/976/1 +f 219/977/6 467/1845/6 463/745/6 +f 467/1845/6 236/1846/6 463/745/6 +f 236/1846/6 702/1718/6 463/745/6 +f 717/757/6 126/364/6 587/978/6 +f 466/980/6 590/1847/6 707/981/6 +f 236/1846/6 131/1848/6 591/982/6 +f 131/1848/6 720/983/6 591/982/6 +f 468/984/6 715/1849/6 344/747/6 +f 344/747/6 225/1720/6 468/984/6 +f 225/1720/6 591/982/6 468/984/6 +f 62/940/1 309/824/1 386/825/1 +f 688/1850/1 576/987/1 220/986/1 +f 576/987/1 225/267/1 226/268/1 +f 100/685/6 218/672/6 664/988/6 +f 397/989/1 177/1513/1 57/990/1 +f 177/992/2 46/1851/2 175/993/2 +f 496/1852/1 21/1378/1 18/996/1 +f 21/1378/1 508/86/1 18/996/1 +f 508/86/1 266/1853/1 399/995/1 +f 18/996/1 490/1854/1 496/1852/1 +f 498/1855/2 367/1856/2 493/1857/2 +f 367/1856/2 502/1858/2 493/1857/2 +f 499/1859/2 365/1860/2 497/1861/2 +f 365/1860/2 138/1862/2 496/1863/2 +f 502/1858/2 499/1859/2 493/1857/2 +f 366/1864/2 500/1865/2 501/1866/2 +f 501/1866/2 498/1855/2 492/997/2 +f 501/1866/2 492/997/2 491/1867/2 +f 248/1868/2 366/1864/2 491/1867/2 +f 366/1864/2 501/1866/2 491/1867/2 +f 365/1860/2 496/1863/2 497/1861/2 +f 495/1869/2 494/1870/2 497/1861/2 +f 496/1863/2 495/1869/2 497/1861/2 +f 491/1867/2 492/997/2 489/1871/2 +f 4/1872/2 488/1873/2 489/1871/2 +f 493/1857/2 136/1874/2 498/1855/2 +f 136/1874/2 492/997/2 498/1855/2 +f 499/1859/2 497/1861/2 493/1857/2 +f 486/999/2 4/1872/2 489/1871/2 +f 475/707/2 362/1875/2 478/1876/2 +f 478/1876/2 486/999/2 483/998/2 +f 486/999/2 489/1871/2 492/997/2 +f 478/1876/2 483/998/2 479/1877/2 +f 247/1691/2 475/707/2 479/1877/2 +f 475/707/2 478/1876/2 479/1877/2 +f 479/1877/2 473/1878/2 247/1691/2 +f 134/1879/2 480/1880/2 483/998/2 +f 480/1880/2 479/1877/2 483/998/2 +f 487/1881/2 495/1869/2 496/1863/2 +f 490/1882/2 135/1883/2 485/1884/2 +f 135/1883/2 482/1885/2 485/1884/2 +f 487/1881/2 496/1863/2 490/1882/2 +f 484/1886/2 5/1887/2 485/1884/2 +f 5/1887/2 487/1881/2 485/1884/2 +f 487/1881/2 490/1882/2 485/1884/2 +f 482/1885/2 481/1888/2 485/1884/2 +f 476/1889/2 485/1884/2 481/1888/2 +f 473/1878/2 479/1877/2 474/1890/2 +f 479/1877/2 480/1880/2 474/1890/2 +f 480/1880/2 476/1889/2 246/1891/2 +f 242/1892/2 247/1691/2 473/1878/2 +f 474/1890/2 243/1893/2 242/1892/2 +f 469/1894/2 1/1895/2 244/1896/2 +f 474/1890/2 242/1892/2 473/1878/2 +f 246/1891/2 469/1894/2 244/1896/2 +f 244/1896/2 474/1890/2 480/1880/2 +f 480/1880/2 246/1891/2 244/1896/2 +f 476/1889/2 481/1888/2 477/1000/2 +f 477/1000/2 361/1897/2 472/1001/2 +f 476/1889/2 477/1000/2 471/1002/2 +f 246/1891/2 476/1889/2 471/1002/2 +f 472/1001/2 470/1898/2 471/1002/2 +f 677/925/3 432/1814/3 676/1003/3 +f 582/955/6 231/857/6 226/109/6 +f 231/857/6 714/1899/6 235/1005/6 +f 102/1006/1 100/188/1 189/170/1 +f 45/1008/1 291/1472/1 303/1009/1 +f 541/226/6 543/648/6 398/1011/6 +f 211/1014/1 450/475/1 212/1013/1 +f 450/475/1 575/491/1 212/1013/1 +f 580/501/4 452/1286/4 111/500/4 +f 452/1286/4 352/1015/4 111/500/4 +f 374/1017/2 26/1900/2 369/1018/2 +f 27/1020/2 259/1901/2 140/1021/2 +f 25/1023/2 153/1902/2 152/1024/2 +f 385/1026/2 17/1903/2 15/1027/2 +f 376/1029/2 506/1904/2 14/1030/2 +f 55/1032/3 45/1905/3 290/602/3 +f 529/1034/3 526/1906/3 265/1035/3 +f 526/1906/3 395/1907/3 265/1035/3 +f 265/1035/3 158/1908/3 32/1036/3 +f 31/1037/2 625/1231/2 28/1038/2 +f 28/1038/2 621/1226/2 164/1225/2 +f 516/594/2 272/596/2 31/1037/2 +f 272/596/2 519/1909/2 31/1037/2 +f 28/1038/2 164/1225/2 516/594/2 +f 519/1909/2 520/1232/2 31/1037/2 +f 624/565/2 264/1229/2 383/1039/2 +f 549/1041/1 199/1308/1 198/1042/1 +f 527/1044/2 158/1908/2 399/1351/2 +f 158/1908/2 32/1036/2 399/1351/2 +f 527/1044/2 399/1351/2 521/1045/2 +f 521/1045/2 275/1910/2 524/1046/2 +f 524/1046/2 626/1911/2 395/1907/2 +f 524/1046/2 395/1907/2 527/1044/2 +f 522/1047/2 157/1912/2 523/1048/2 +f 157/1912/2 397/1913/2 523/1048/2 +f 523/1048/2 627/45/2 43/1049/2 +f 282/1052/2 285/1914/2 533/1050/2 +f 285/1914/2 392/1915/2 533/1050/2 +f 392/1915/2 37/1244/2 533/1050/2 +f 401/840/2 403/838/2 280/1916/2 +f 403/838/2 33/1349/2 530/1053/2 +f 530/1053/2 169/1350/2 32/1036/2 +f 403/838/2 530/1053/2 529/1034/2 +f 280/1916/2 403/838/2 529/1034/2 +f 526/1906/2 525/1917/2 529/1034/2 +f 525/1917/2 280/1916/2 529/1034/2 +f 47/1918/2 631/1240/2 168/1056/2 +f 631/1240/2 633/1054/2 168/1056/2 +f 540/1086/2 69/1919/2 652/1059/2 +f 69/1919/2 294/1057/2 652/1059/2 +f 404/1060/2 286/1063/2 532/396/2 +f 405/1061/2 38/1247/2 391/1062/2 +f 163/1064/2 638/1920/2 287/1065/2 +f 431/1921/2 307/1114/2 556/903/2 +f 307/1114/2 201/904/2 556/903/2 +f 556/903/2 66/1922/2 80/1069/2 +f 66/1922/2 200/1067/2 80/1069/2 +f 556/903/2 80/1069/2 431/1921/2 +f 435/1923/2 559/1924/2 431/1921/2 +f 80/1069/2 553/1925/2 431/1921/2 +f 553/1925/2 435/1923/2 431/1921/2 +f 640/1070/2 174/1100/2 639/1071/2 +f 278/1073/2 534/1926/2 396/1074/2 +f 12/549/4 11/1927/4 40/547/4 +f 11/1927/4 657/1076/4 40/547/4 +f 64/657/4 550/867/4 65/868/4 +f 274/1928/4 384/1929/4 40/547/4 +f 650/154/4 55/967/4 274/1928/4 +f 657/1076/4 64/657/4 65/868/4 +f 65/868/4 650/154/4 274/1928/4 +f 274/1928/4 40/547/4 65/868/4 +f 60/1077/2 178/1930/2 177/992/2 +f 170/1079/2 410/1273/2 536/1080/2 +f 173/1082/2 537/1931/2 54/633/2 +f 441/1932/2 207/1084/2 313/1083/2 +f 207/1084/2 79/1933/2 675/1085/2 +f 540/1086/2 541/1263/2 651/1087/2 +f 309/1265/2 62/1934/2 653/1091/2 +f 62/1934/2 409/1089/2 653/1091/2 +f 63/1092/2 402/1935/2 535/1093/2 +f 671/1094/4 77/1936/4 623/1095/4 +f 412/1096/2 655/1276/2 424/1097/2 +f 174/1100/3 639/1071/3 276/1099/3 +f 276/1099/3 642/1937/3 396/1074/3 +f 642/1937/3 534/1926/3 396/1074/3 +f 396/1074/3 58/1075/3 640/1070/3 +f 396/1074/3 640/1070/3 174/1100/3 +f 427/1101/2 428/1938/2 301/1102/2 +f 414/1103/2 78/1126/2 427/1101/2 +f 78/1126/2 429/125/2 427/1101/2 +f 322/1104/2 321/1939/2 331/1105/2 +f 314/1544/2 182/1107/2 656/804/2 +f 182/1107/2 659/1267/2 430/803/2 +f 565/1110/2 75/1296/2 198/1287/2 +f 75/1296/2 312/1294/2 672/1124/2 +f 198/1287/2 75/1296/2 672/1124/2 +f 198/1287/2 199/1108/2 565/1110/2 +f 81/387/2 557/1940/2 554/1111/2 +f 557/1940/2 661/1117/2 554/1111/2 +f 554/1111/2 660/1118/2 420/463/2 +f 188/1112/2 560/1941/2 421/1113/2 +f 189/1115/2 664/1280/2 558/1116/2 +f 558/1116/2 434/1119/2 660/1118/2 +f 434/1119/2 191/1942/2 202/123/2 +f 85/1120/2 310/1943/2 562/1121/2 +f 196/1123/2 670/1944/2 672/1124/2 +f 420/463/2 552/462/2 78/1126/2 +f 87/1128/2 313/1083/2 564/1129/2 +f 437/157/2 84/1945/2 422/1130/2 +f 540/1523/1 652/382/1 663/216/1 +f 652/382/1 293/1946/1 665/1131/1 +f 410/1133/1 194/1947/1 409/1132/1 +f 194/1947/1 668/1567/1 409/1132/1 +f 443/1134/2 449/1948/2 334/1135/2 +f 208/1137/2 686/1316/2 443/1134/2 +f 324/237/2 217/1437/2 208/1137/2 +f 209/1140/2 99/814/2 567/1141/2 +f 102/1143/2 568/1949/2 218/1144/2 +f 215/1148/2 219/977/2 574/1146/2 +f 219/977/2 575/746/2 574/1146/2 +f 575/746/2 342/1950/2 574/1146/2 +f 332/1149/2 570/1951/2 338/1150/2 +f 571/1152/2 94/1422/2 332/1149/2 +f 222/1154/2 221/1323/2 96/1155/2 +f 214/1147/2 573/1952/2 341/1157/2 +f 96/1155/2 336/472/2 693/473/2 +f 86/1159/2 436/942/2 680/943/2 +f 580/1161/2 107/1326/2 345/1162/2 +f 347/1164/2 228/1327/2 580/1161/2 +f 582/1166/2 226/1330/2 348/1167/2 +f 463/1169/2 702/1516/2 582/1166/2 +f 226/1330/2 225/1517/2 701/1172/2 +f 225/1517/2 344/379/2 701/1172/2 +f 344/379/2 458/1518/2 583/1171/2 +f 458/1518/2 457/1953/2 583/1171/2 +f 196/530/1 197/1954/1 532/76/1 +f 227/1174/2 353/1955/2 584/1175/2 +f 585/1179/2 118/1956/2 230/1957/2 +f 230/1957/2 461/1958/2 585/1179/2 +f 461/1958/2 111/1177/2 585/1179/2 +f 117/1180/2 707/1331/2 112/1181/2 +f 350/1183/2 114/1959/2 122/1184/2 +f 711/1186/2 115/1190/2 232/1187/2 +f 587/1188/2 126/1193/2 237/1189/2 +f 588/1191/2 119/1197/2 357/1192/2 +f 589/418/2 713/1542/2 590/1194/2 +f 124/1196/2 121/399/2 120/400/2 +f 235/1198/2 238/1534/2 124/1196/2 +f 236/420/2 591/1960/2 235/1198/2 +f 234/1332/2 349/1961/2 462/1202/2 +f 349/1961/2 231/1200/2 462/1202/2 +f 645/1203/2 292/1962/2 61/1204/2 +f 394/1208/2 52/1963/2 273/1206/2 +f 273/1206/2 41/1245/2 271/1207/2 +f 186/1209/1 202/238/1 429/239/1 +f 296/1211/2 311/1964/2 298/1212/2 +f 78/114/1 552/112/1 333/1214/1 +f 552/112/1 443/470/1 333/1214/1 +f 333/1214/1 571/1965/1 93/205/1 +f 595/551/3 10/1642/3 597/1966/3 +f 595/551/3 597/1966/3 596/1819/3 +f 7/1967/3 133/358/3 375/1968/3 +f 133/358/3 595/551/3 375/1968/3 +f 375/1968/3 2/1969/3 7/1967/3 +f 245/1970/3 132/1971/3 594/1972/3 +f 139/1973/3 245/1970/3 594/1972/3 +f 594/1972/3 375/1968/3 596/1819/3 +f 375/1968/3 595/551/3 596/1819/3 +f 596/1819/3 8/1818/3 594/1972/3 +f 139/1973/3 8/1818/3 593/1974/3 +f 139/1973/3 594/1972/3 8/1818/3 +f 592/1975/3 249/1976/3 593/1974/3 +f 8/1818/3 9/1977/3 11/1978/3 +f 371/1979/3 592/1975/3 593/1974/3 +f 598/1980/3 370/1981/3 371/1979/3 +f 142/1982/3 598/1980/3 371/1979/3 +f 371/1979/3 593/1974/3 599/1983/3 +f 593/1974/3 8/1818/3 11/1978/3 +f 11/1978/3 12/1984/3 599/1983/3 +f 593/1974/3 11/1978/3 599/1983/3 +f 143/1216/3 142/1982/3 600/1985/3 +f 142/1982/3 371/1979/3 599/1983/3 +f 143/1216/3 600/1985/3 19/1217/3 +f 599/1983/3 363/1986/3 600/1985/3 +f 19/1217/3 377/1987/3 20/1988/3 +f 599/1983/3 600/1985/3 142/1982/3 +f 603/1989/3 16/1990/3 143/1216/3 +f 20/1988/3 137/1991/3 254/1992/3 +f 137/1991/3 605/1993/3 254/1992/3 +f 605/1993/3 606/1218/3 607/1994/3 +f 607/1994/3 150/1995/3 605/1993/3 +f 150/1995/3 254/1992/3 605/1993/3 +f 253/1996/3 256/1997/3 149/1998/3 +f 253/1996/3 149/1998/3 604/1999/3 +f 149/1998/3 146/2000/3 604/1999/3 +f 254/1992/3 253/1996/3 20/1988/3 +f 253/1996/3 604/1999/3 20/1988/3 +f 252/1215/3 603/1989/3 143/1216/3 +f 20/1988/3 604/1999/3 19/1217/3 +f 604/1999/3 252/1215/3 19/1217/3 +f 145/2001/3 21/2002/3 378/1220/3 +f 21/2002/3 255/2003/3 378/1220/3 +f 255/2003/3 606/1218/3 378/1220/3 +f 654/2004/1 413/135/1 674/1221/1 +f 413/135/1 314/1401/1 675/605/1 +f 614/1222/3 22/2005/3 611/488/3 +f 22/2005/3 608/2006/3 611/488/3 +f 608/2006/3 612/2007/3 611/488/3 +f 620/829/3 24/2008/3 614/1222/3 +f 43/1049/3 522/1047/3 623/1582/3 +f 522/1047/3 29/1223/3 623/1582/3 +f 29/1223/3 620/829/3 614/1222/3 +f 612/2007/3 258/446/3 381/490/3 +f 611/488/3 612/2007/3 381/490/3 +f 258/446/3 615/447/3 381/490/3 +f 615/447/3 393/1584/3 381/490/3 +f 623/1582/3 42/1583/3 43/1049/3 +f 611/488/3 623/1582/3 29/1223/3 +f 292/162/1 645/1410/1 422/197/1 +f 422/197/1 436/195/1 83/1224/1 +f 619/6/3 621/1226/3 164/1225/3 +f 622/1040/3 624/565/3 28/1038/3 +f 40/547/3 384/1744/3 30/1227/3 +f 155/2009/3 521/1045/3 264/1229/3 +f 521/1045/3 275/1910/3 264/1229/3 +f 155/2009/3 264/1229/3 261/1230/3 +f 275/1910/3 624/565/3 264/1229/3 +f 625/1231/3 626/1911/3 520/1232/3 +f 526/372/4 529/1508/4 5/2010/4 +f 5/2010/4 484/1233/4 526/372/4 +f 484/1233/4 31/1368/4 520/1234/4 +f 520/1234/4 173/1369/4 526/372/4 +f 173/1369/4 201/1589/4 307/371/4 +f 526/372/4 173/1369/4 307/371/4 +f 389/1235/6 634/2011/6 500/1236/6 +f 203/222/1 209/220/1 444/1440/1 +f 444/1440/1 202/238/1 203/222/1 +f 202/238/1 191/1238/1 203/222/1 +f 191/1238/1 308/2012/1 190/121/1 +f 190/121/1 89/221/1 191/1238/1 +f 389/1239/3 629/2013/3 631/1240/3 +f 629/2013/3 47/1918/3 631/1240/3 +f 631/1240/3 633/1054/3 632/1241/3 +f 633/1054/3 387/2014/3 632/1241/3 +f 632/1241/3 634/2015/3 389/1239/3 +f 695/2016/3 215/1148/3 219/977/3 +f 219/977/3 575/746/3 450/1242/3 +f 101/1243/3 695/2016/3 219/977/3 +f 404/1060/3 637/2017/3 37/1244/3 +f 270/1246/3 53/2018/3 41/1245/3 +f 53/2018/3 56/1072/3 41/1245/3 +f 56/1072/3 166/2019/3 41/1245/3 +f 38/1247/3 163/1064/3 394/1208/3 +f 163/1064/3 638/1920/3 271/1207/3 +f 394/1208/3 163/1064/3 271/1207/3 +f 277/2020/3 57/994/3 44/1249/3 +f 57/994/3 177/992/3 59/1078/3 +f 59/1078/3 60/1077/3 400/1248/3 +f 57/994/3 59/1078/3 44/1249/3 +f 295/2021/3 48/2022/3 278/1073/3 +f 48/2022/3 402/1935/3 645/1203/3 +f 278/1073/3 48/2022/3 644/1252/3 +f 402/1935/3 535/1093/3 279/1205/3 +f 645/1203/3 292/1962/3 643/1250/3 +f 402/1935/3 279/1205/3 645/1203/3 +f 644/1252/3 48/2022/3 643/1250/3 +f 641/1251/3 167/2023/3 644/1252/3 +f 643/1250/3 48/2022/3 645/1203/3 +f 66/185/1 315/1697/1 207/1253/1 +f 315/1697/1 335/1698/1 207/1253/1 +f 335/1698/1 447/2024/1 207/1253/1 +f 647/1255/3 288/2025/3 179/1256/3 +f 648/1258/3 302/2026/3 417/1259/3 +f 650/1261/3 538/35/3 306/1262/3 +f 539/778/3 543/779/3 541/1263/3 +f 541/1263/3 407/1266/3 652/1059/3 +f 542/1264/3 653/1091/3 309/1265/3 +f 659/1267/3 66/1922/3 200/1067/3 +f 650/1261/3 65/290/3 304/1268/3 +f 264/1229/6 624/565/6 183/612/6 +f 183/612/6 658/2027/6 418/1269/6 +f 622/562/6 383/539/6 250/540/6 +f 181/422/3 200/1067/3 416/1068/3 +f 414/1103/3 78/1126/3 64/1271/3 +f 78/1126/3 550/1127/3 64/1271/3 +f 172/1275/3 646/2028/3 410/1273/3 +f 646/2028/3 170/1079/3 410/1273/3 +f 410/1273/3 536/1080/3 63/1092/3 +f 410/1273/3 63/1092/3 411/1274/3 +f 412/1096/3 655/1276/3 414/1103/3 +f 655/1276/3 425/2029/3 301/1102/3 +f 419/7/3 550/1127/3 420/463/3 +f 690/1277/1 568/1608/1 319/173/1 +f 559/1924/3 431/1921/3 192/1279/3 +f 431/1921/3 307/1114/3 192/1279/3 +f 78/1126/3 429/125/3 552/462/3 +f 429/125/3 202/123/3 552/462/3 +f 202/123/3 660/1118/3 552/462/3 +f 660/1118/3 558/1116/3 661/1117/3 +f 434/1119/3 662/2030/3 664/1280/3 +f 664/1280/3 319/1413/3 561/168/3 +f 691/578/1 105/554/1 672/1281/1 +f 471/2031/4 470/2032/4 2/303/4 +f 470/2032/4 257/1282/4 2/303/4 +f 257/1282/4 609/2033/4 504/302/4 +f 557/1940/3 661/1117/3 189/1115/3 +f 557/1940/3 189/1115/3 663/169/3 +f 67/1705/3 81/387/3 557/1940/3 +f 423/2034/3 70/2035/3 68/2036/3 +f 68/2036/3 67/1705/3 557/1940/3 +f 557/1940/3 663/169/3 68/2036/3 +f 663/169/3 665/167/3 68/2036/3 +f 68/2036/3 665/167/3 423/2034/3 +f 194/2037/3 71/2038/3 666/1284/3 +f 667/1285/3 319/1413/3 193/1122/3 +f 423/2034/3 665/167/3 666/1284/3 +f 665/167/3 667/1285/3 666/1284/3 +f 668/1283/3 194/2037/3 666/1284/3 +f 667/1285/3 193/1122/3 85/1120/3 +f 85/1120/3 668/1283/3 667/1285/3 +f 320/234/1 440/1484/1 451/233/1 +f 440/1484/1 580/501/1 451/233/1 +f 673/2039/3 674/2040/3 564/1129/3 +f 674/2040/3 675/1085/3 564/1129/3 +f 198/1287/3 199/1108/3 671/1288/3 +f 199/1108/3 442/2041/3 77/2042/3 +f 671/1288/3 199/1108/3 77/2042/3 +f 74/1289/3 73/2043/3 670/1944/3 +f 73/2043/3 197/2044/3 670/1944/3 +f 670/1944/3 672/1124/3 74/1289/3 +f 672/1124/3 198/1287/3 74/1289/3 +f 197/2044/3 196/1123/3 670/1944/3 +f 102/1143/3 568/1949/3 690/1290/3 +f 91/1291/3 689/2045/3 102/1143/3 +f 689/2045/3 100/1145/3 102/1143/3 +f 68/1293/4 69/1512/4 57/990/4 +f 69/1512/4 177/1513/4 57/990/4 +f 57/990/4 277/2046/4 67/1292/4 +f 312/1294/3 206/2047/3 76/1295/3 +f 88/248/3 433/1303/3 323/1297/3 +f 594/2048/4 132/1476/4 373/1300/4 +f 132/1476/4 23/318/4 373/1300/4 +f 23/318/4 616/1298/4 373/1300/4 +f 203/1301/3 89/1347/3 326/1302/3 +f 318/1304/3 327/443/3 83/13/3 +f 98/1139/3 324/237/3 685/1305/3 +f 684/1306/3 95/1138/3 98/1139/3 +f 95/1138/3 208/1137/3 98/1139/3 +f 685/1305/6 324/237/6 661/235/6 +f 442/2049/4 199/1308/4 454/1307/4 +f 199/1308/4 198/1042/4 106/1309/4 +f 335/1310/3 321/1939/3 331/1105/3 +f 92/1312/3 331/1105/3 440/1106/3 +f 446/2050/3 683/1160/3 682/1314/3 +f 683/1160/3 86/1159/3 438/1315/3 +f 444/1142/3 209/1140/3 687/931/3 +f 99/814/3 445/2051/3 212/1317/3 +f 216/110/3 90/2052/3 688/1318/3 +f 692/38/3 338/1150/3 337/1151/3 +f 337/1151/3 332/1149/3 93/1153/3 +f 572/1156/3 222/1154/3 108/1321/3 +f 336/472/3 213/2053/3 221/1323/3 +f 237/1189/3 709/2054/3 464/2055/3 +f 709/2054/3 352/2056/3 710/2057/3 +f 464/2055/3 709/2054/3 710/2057/3 +f 710/2057/3 465/2058/3 464/2055/3 +f 464/2055/3 357/1192/3 237/1189/3 +f 579/1165/3 347/1164/3 346/1324/3 +f 107/1326/3 699/2059/3 228/1327/3 +f 581/1168/3 582/1166/3 343/1170/3 +f 223/1329/3 701/1172/3 226/1330/3 +f 707/1331/3 462/1202/3 234/1332/3 +f 240/1335/3 130/2060/3 358/2061/3 +f 130/2060/3 718/2062/3 358/2061/3 +f 718/2062/3 359/2063/3 358/2061/3 +f 358/2061/3 716/2064/3 240/1335/3 +f 716/2064/3 239/1333/3 240/1335/3 +f 719/1338/3 720/2065/3 129/2066/3 +f 720/2065/3 131/2067/3 129/2066/3 +f 131/2067/3 130/2060/3 129/2066/3 +f 128/2068/3 717/1334/3 360/1336/3 +f 129/2066/3 128/2068/3 719/1338/3 +f 128/2068/3 360/1336/3 719/1338/3 diff --git a/mods/everness/nodes.lua b/mods/everness/nodes.lua new file mode 100644 index 0000000..73ea027 --- /dev/null +++ b/mods/everness/nodes.lua @@ -0,0 +1,13795 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2022 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +-- +-- Ores +-- + +Everness:register_node('everness:coral_desert_stone_with_coal', { + description = S('Coal Ore'), + tiles = { 'everness_coral_desert_stone.png^everness_mineral_coal.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + xp = 1, + blast_furnace_smeltable = 1 + }, + drop = 'default:coal_lump', + sounds = Everness.node_sound_stone_defaults(), + -- MCL + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, +}) + +Everness:register_node('everness:crystal_stone_with_coal', { + description = S('Coal Ore'), + tiles = { 'everness_crystal_stone.png^[sheet:2x2:1,1^everness_mineral_coal.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + xp = 1, + blast_furnace_smeltable = 1 + }, + drop = 'default:coal_lump', + sounds = Everness.node_sound_stone_defaults(), + -- MCL + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, +}) + +Everness:register_node('everness:cursed_stone_carved_with_coal', { + description = S('Coal Ore'), + tiles = { 'everness_cursed_stone_carved.png^[sheet:2x2:1,1^everness_mineral_coal.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + xp = 1, + blast_furnace_smeltable = 1 + }, + drop = 'default:coal_lump', + sounds = Everness.node_sound_stone_defaults(), + -- MCL + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, +}) + +Everness:register_node('everness:mineral_stone_with_coal', { + description = S('Coal Ore'), + tiles = { 'everness_mineral_stone.png^[sheet:2x2:1,1^everness_mineral_coal.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + xp = 1, + blast_furnace_smeltable = 1 + }, + drop = 'default:coal_lump', + sounds = Everness.node_sound_stone_defaults(), + -- MCL + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, +}) + +Everness:register_node('everness:stone_with_pyrite', { + description = S('Pyrite Ore'), + tiles = { 'everness_stone.png^everness_mineral_pyrite.png' }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1, + material_stone = 1, + blast_furnace_smeltable = 1 + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 3, + _mcl_silk_touch_drop = true, + drop = 'everness:pyrite_lump', + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone_with_ceramic_sherds', { + description = S('Ceramic Sherds. Use archeological pickaxe to have a chance of getting various different sherds.'), + short_description = S('Ceramic Sherds'), + tiles = { 'everness_mineral_stone.png^[sheet:2x2:1,1^everness_ceramic_sherds_ore.png' }, + groups = { + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + xp = 1, + blast_furnace_smeltable = 1 + }, + drop = { + max_items = 1, + items = { + { + tool_groups = { 'archeological_drop' }, + items = { 'everness:ceramic_pot_sherd_flowers' }, + rarity = 20 + }, + { + tool_groups = { 'archeological_drop' }, + items = { 'everness:ceramic_pot_sherd_lines' }, + rarity = 10 + }, + { + tool_groups = { 'archeological_drop' }, + items = { 'everness:ceramic_pot_sherd_tribal' }, + rarity = 5 + }, + { + items = { 'everness:ceramic_pot_sherd_blank' } + } + } + }, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:pyriteblock', { + description = S('Pyrite Block'), + tiles = { 'everness_pyrite_block.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyriteblock_forged', { + description = S('Forged Pyrite Block'), + tiles = { 'everness_pyrite_block_forged.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyriteblock_brick', { + description = S('Pyrite Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyriteblock_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyriteblock_slab_brick', { + description = S('Pyrite Slab Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_block_slab_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyriteblock_spiral', { + description = S('Pyrite Spiral'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_block_spiral.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyrite_pillar_bottom', { + description = S('Pyrite Pillar Bottom'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_pillar_bottom.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyrite_pillar_middle', { + description = S('Pyrite Pillar Middle'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_pillar_middle.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyrite_pillar_top', { + description = S('Pyrite Pillar Top'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_pillar_top.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyrite_pillar_small', { + description = S('Pyrite Pillar Small'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_pillar_small.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:pyriteblock_polished', { + description = S('Polished Pyrite Block'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_pyrite_block_polished.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 4, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 3, + sounds = Everness.node_sound_metal_defaults(), +}) + +Everness:register_node('everness:quartz_ore', { + description = S('Quartz Ore'), + tiles = { 'everness_stone.png^everness_quartz_ore.png' }, + groups = { + -- MTG + cracky = 3, + stone = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + xp = 3 + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 3, + _mcl_silk_touch_drop = true, + drop = 'everness:quartz_crystal', + sounds = Everness.node_sound_stone_defaults(), +}) + +-- +-- Stone +-- + +Everness:register_node('everness:coral_desert_stone', { + description = S('Coral Desert Stone'), + tiles = { 'everness_coral_desert_stone.png' }, + drop = 'everness:coral_desert_cobble', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_stone', { + description = S('Crystal Stone'), + tiles = { + { + name = 'everness_crystal_stone.png', + align_style = 'world', + scale = 2 + } + }, + drop = 'everness:crystal_cobble', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_sandstone', { + description = S('Coral Sandstone'), + tiles = { 'everness_coral_sandstone.png' }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1, + -- Everness + everness_sandstone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_sandstone_brick', { + description = S('Coral Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_coral_sandstone_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_sandstone_chiseled', { + description = S('Coral Sandstone Chiseled Block'), + tiles = { 'everness_coral_sandstone_chiseled.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_sandstone_carved_1', { + description = S('Coral Sandstone Carved Block'), + tiles = { 'everness_coral_sandstone_carved_1.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_white_sandstone', { + description = S('Coral White Sandstone'), + tiles = { 'everness_coral_white_sandstone.png' }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_white_sandstone_brick', { + description = S('Coral White Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_coral_white_sandstone_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_white_sandstone_pillar', { + description = S('Coral White Sandstone Pillar'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + 'everness_coral_white_sandstone.png', + 'everness_coral_white_sandstone.png', + 'everness_coral_white_sandstone_pillar.png', + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_desert_stone_block', { + description = S('Coral Desert Stone Block'), + tiles = { 'everness_coral_desert_stone_block.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_desert_stone_brick', { + description = S('Coral Desert Stone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_coral_desert_stone_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_bones', { + description = S('Coral Bones'), + tiles = { 'everness_coral_bones.png' }, + groups = { + -- MTG + cracky = 3, + stone = 1, + -- MCL + pickaxey = 1, + building_block = 1 + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_bones_block', { + description = S('Coral Bones Block'), + tiles = { 'everness_coral_bones_block.png' }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_bones_brick', { + description = S('Coral Bones Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_coral_bones_brick.png' }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_cobble', { + description = S('Crystal Cobblestone'), + tiles = { 'everness_crystal_cobble.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_mossy_cobble', { + description = S('Crystal Mossy Cobblestone'), + tiles = { 'everness_crystal_mossy_cobble.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_stone_brick', { + description = S('Crystal Stone Brick'), + paramtype2 = 'facedir', + drawtype = 'allfaces', + place_param2 = 0, + tiles = { 'everness_crystal_stone_brick.png' }, + use_texture_alpha = 'blend', + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_desert_cobble', { + description = S('Coral Desert Cobblestone'), + tiles = { 'everness_coral_desert_cobble.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_desert_mossy_cobble', { + description = S('Coral Mossy Cobblestone'), + tiles = { 'everness_coral_desert_mossy_cobble.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_desert_stone_with_moss', { + description = S('Coral Desert Stone with Moss'), + tiles = { + 'everness_coral_stone_with_moss_top.png', + 'everness_coral_desert_stone.png', + { + name = 'everness_coral_desert_stone.png^everness_coral_stone_with_moss_side.png', + tileable_vertical = false + } + }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_spreading_dirt_type_under = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + drop = 'everness:coral_desert_cobble', + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_deep_ocean_sandstone_block', { + description = S('Coral Deep Ocean Sandstone Block'), + tiles = { 'everness_deep_ocean_sandstone_block.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_deep_ocean_sandstone_brick', { + description = S('Coral Deep Ocean Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_deep_ocean_sandstone_brick.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_sandstone_block', { + description = S('Cursed Lands Deep Ocean Sandstone Block'), + tiles = { 'everness_cursed_lands_deep_ocean_sandblock.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_sandstone_brick', { + description = S('Cursed Lands Deep Ocean Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_cursed_lands_deep_ocean_sand_brick.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_sandstone_block', { + description = S('Crystal Forest Deep Ocean Sandstone Block'), + tiles = { 'everness_crystal_forest_deep_ocean_sandstone_block.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_sandstone_brick', { + description = S('Crystal Forest Deep Ocean Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_crystal_forest_deep_ocean_sandstone_brick.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_desert_stone', { + description = S('Forsaken Desert Stone'), + tiles = { 'everness_forsaken_desert_stone.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + drop = 'everness:forsaken_desert_cobble_red', + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_desert_cobble_red', { + description = S('Forsaken Desert Cobblestone Red'), + tiles = { 'everness_forsaken_desert_cobble_red.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_desert_cobble', { + description = S('Forsaken Desert Cobblestone'), + tiles = { 'everness_forsaken_desert_cobble.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:volcanic_rock', { + description = S('Volcanic Rock'), + tiles = { 'everness_volcanic_rock.png' }, + sounds = Everness.node_sound_stone_defaults(), + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + is_ground_content = false, +}) + +Everness:register_node('everness:volcanic_rock_with_magma', { + description = S('Volcanic Rock with Magma'), + tiles = { + { + name = 'everness_volcanic_rock_with_magma_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + sounds = Everness.node_sound_stone_defaults(), + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + paramtype = 'light', + light_source = 3, +}) + +Everness:register_node('everness:magmacobble', { + description = 'Magma Cobblestone', + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), + tiles = { + { + name = 'everness_magmacobble_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + special_tiles = { + -- New-style lava source material (mostly unused) + { + name = 'everness_magmacobble_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + backface_culling = false, + }, + }, + paramtype = 'light', + light_source = 3, +}) + +Everness:register_node('everness:cursed_stone', { + description = S('Cursed Stone'), + tiles = { + { name = 'everness_cursed_stone.png' } + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults() +}) + +Everness:register_node('everness:cursed_stone_carved', { + description = S('Cursed Stone Carved'), + tiles = { + { + name = 'everness_cursed_stone_carved.png', + align_style = 'world', + scale = 2 + } + }, + drop = 'everness:cursed_stone', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults() +}) + +Everness:register_node('everness:cursed_brick', { + description = S('Cursed Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_cursed_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_brick_with_growth', { + description = S('Cursed Brick with Growth'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_cursed_brick_with_growth.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_brick_mixed', { + description = S('Cursed Brick Mixed'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_cursed_brick_mixed.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_brick_carved', { + description = S('Cursed Brick Carved'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_cursed_brick_carved.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:volcanic_sulfur', { + description = S('Volcanic Sulfur Stone'), + tiles = { 'everness_volcanic_sulfur_stone.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:sulfur_stone', { + description = S('Sulfur Stone'), + tiles = { 'everness_sulfur_stone.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), + on_construct = function(pos) + Everness:tick_sulfur_stone(pos) + end, + on_timer = function(pos, elapsed) + local _, node_counts = core.find_nodes_in_area( + vector.offset(pos, -1, 1, -1), + vector.offset(pos, 1, 1, 1), + 'everness:volcanic_sulfur', + false + ) + + if node_counts['everness:volcanic_sulfur'] < 4 + or core.get_node(vector.new(pos.x, pos.y + 1, pos.z)).name ~= 'air' + then + -- stop timer, to restart timer: dig/place again + -- Everness:tick_sulfur_stone_again(pos) + return + end + + local particlespawner_def = { + amount = 1, + time = 4, + minpos = vector.new({ x = pos.x - 0.25, y = pos.y + 0.6, z = pos.z - 0.25 }), + maxpos = vector.new({ x = pos.x + 0.25, y = pos.y + 0.6, z = pos.z + 0.25 }), + minvel = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxvel = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minacc = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + maxacc = vector.new({ x = 0.1, y = 0.5, z = 0.1 }), + minexptime = 7.5, + maxexptime = 7.5, + minsize = 16, + maxsize = 24, + texture = 'everness_smoke_cloud_particle_static.png', + } + + if core.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + particlespawner_def = { + amount = 1, + time = 4, + size = { + min = 16, + max = 24, + }, + exptime = 7.5, + pos = { + min = vector.new({ x = pos.x - 0.25, y = pos.y + 0.6, z = pos.z - 0.25 }), + max = vector.new({ x = pos.x + 0.25, y = pos.y + 0.6, z = pos.z + 0.25 }), + }, + vel = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + acc = { + min = vector.new({ x = -0.1, y = 0.25, z = -0.1 }), + max = vector.new({ x = 0.1, y = 0.5, z = 0.1 }) + }, + texture = { + name = 'everness_smoke_cloud_particle_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 8, + aspect_h = 8, + length = 8 + } + } + } + end + + core.add_particlespawner(particlespawner_def) + + Everness:tick_sulfur_stone(pos) + end, + after_destruct = function(pos, oldnode) + pos.y = pos.y + 1 + + if core.get_node(pos).name == 'everness:flame_permanent' then + core.remove_node(pos) + end + end, + on_ignite = function(pos, igniter) + local flame_pos = { x = pos.x, y = pos.y + 1, z = pos.z } + + if core.get_node(flame_pos).name == 'air' then + core.set_node(flame_pos, {name = 'everness:flame_permanent'}) + end + end, + -- MCL + _on_ignite = function(player, pointed_thing) + local pos = pointed_thing.under + local flame_pos = { x = pos.x, y = pos.y + 1, z = pos.z } + + if core.get_node(flame_pos).name == 'air' then + core.set_node(flame_pos, {name = 'everness:flame_permanent'}) + return true + end + + return false + end +}) + +Everness:register_node('everness:forsaken_tundra_cobble', { + description = S('Forsaken Tundra Cobblestone'), + tiles = { 'everness_forsaken_tundra_cobblestone.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_tundra_stone', { + description = S('Forsaken Tundra Stone'), + tiles = { 'everness_forsaken_tundra_stone.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + drop = 'everness:forsaken_tundra_cobble', + legacy_mineral = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mold_cobble', { + description = S('Mold Cobble'), + tiles = { 'everness_mold_stone.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + sounds = Everness.node_sound_stone_defaults(), + _mcl_blast_resistance = 6, + _mcl_hardness = 2, +}) + +Everness:register_node('everness:forsaken_tundra_brick', { + description = S('Forsaken Tundra Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_forsaken_tundra_brick.png' }, + is_ground_content = false, + groups = { + cracky = 2, + -- MCL + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_tundra_rocks', { + description = S('Forsaken Tundra Rocks'), + tiles = { + 'everness_forsaken_tundra_rocks_top.png', + 'everness_forsaken_tundra_rocks_top.png', + 'everness_forsaken_tundra_rocks_side.png', + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + legacy_mineral = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:blue_crying_obsidian', { + description = S('Blue Crying Obsidian'), + tiles = { 'everness_blue_crying_obsidian.png' }, + sounds = Everness.node_sound_stone_defaults(), + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1, + -- Everness + everness_obsidian = 1 + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, +}) + +Everness:register_node('everness:blue_weeping_obsidian', { + description = S('Blue Weeping Obsidian'), + tiles = { 'everness_blue_weeping_obsidian.png' }, + sounds = Everness.node_sound_stone_defaults(), + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1, + -- Everness + everness_obsidian = 1 + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + paramtype = 'light', + light_source = 7, +}) + +Everness:register_node('everness:weeping_obsidian', { + description = S('Weeping Obsidian'), + tiles = { 'everness_weeping_obsidian.png' }, + sounds = Everness.node_sound_stone_defaults(), + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1, + -- Everness + everness_obsidian = 1 + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + paramtype = 'light', + light_source = 7, +}) + +Everness:register_node('everness:mold_stone_with_moss', { + description = S('Mold Stone'), + tiles = { + 'everness_mold_stone_with_moss_top.png', + 'everness_mold_stone.png', + 'everness_mold_stone_with_moss_side.png' + }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_spreading_dirt_type_under = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + is_ground_content = false, + drop = 'everness:mold_cobble', + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:soul_sandstone', { + description = S('Soul Sandstone'), + tiles = { 'everness_soul_sandstone.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), + after_destruct = function(pos) + pos.y = pos.y + 1 + if core.get_node(pos).name == 'everness:flame_permanent_blue' then + core.remove_node(pos) + end + end, + on_ignite = function(pos) + local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if core.get_node(flame_pos).name == 'air' then + core.set_node(flame_pos, {name = 'everness:flame_permanent_blue'}) + end + end +}) + +Everness:register_node('everness:soul_sandstone_veined', { + description = S('Soul Sandstone Veined'), + tiles = { + 'everness_soul_sandstone_veined_top.png', + 'everness_soul_sandstone.png', + 'everness_soul_sandstone_veined_side.png' + }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_spreading_dirt_type_under = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + drop = 'everness:soul_sandstone', + sounds = Everness.node_sound_stone_defaults(), + after_destruct = function(pos) + pos.y = pos.y + 1 + if core.get_node(pos).name == 'everness:flame_permanent_purple' then + core.remove_node(pos) + end + end, + on_ignite = function(pos) + local flame_pos = {x = pos.x, y = pos.y + 1, z = pos.z} + if core.get_node(flame_pos).name == 'air' then + core.set_node(flame_pos, {name = 'everness:flame_permanent_purple'}) + end + end +}) + +Everness:register_node('everness:crystal_block_purple', { + description = S('Purple Crystal Block'), + paramtype = 'light', + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + 'everness_crystal_block_purple_top.png', + 'everness_crystal_block_purple_top.png', + 'everness_crystal_block_purple.png' + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + light_source = 7, + sounds = Everness.node_sound_crystal_defaults(), +}) + +Everness:register_node('everness:crystal_block_orange', { + description = S('Orange Crystal Block'), + paramtype = 'light', + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + 'everness_crystal_block_orange_top.png', + 'everness_crystal_block_orange_top.png', + 'everness_crystal_block_orange.png' + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + light_source = 7, + sounds = Everness.node_sound_crystal_defaults(), +}) + +Everness:register_node('everness:crystal_block_cyan', { + description = S('Cyan Crystal Block'), + paramtype = 'light', + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + 'everness_crystal_block_cyan_top.png', + 'everness_crystal_block_cyan_top.png', + 'everness_crystal_block_cyan.png' + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + light_source = 7, + sounds = Everness.node_sound_crystal_defaults(), +}) + +-- Quartz + +-- Quartz Block +Everness:register_node('everness:quartz_block', { + description = S('Quartz Block'), + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_quartz_block_top.png', + 'everness_quartz_block_bottom.png', + 'everness_quartz_block_side.png', + }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + quartz_block = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +-- Chiseled Quartz +Everness:register_node('everness:quartz_chiseled', { + description = S('Chiseled Quartz'), + tiles = { + 'everness_quartz_block_chiseled_top.png', + 'everness_quartz_block_chiseled_top.png', + 'everness_quartz_block_chiseled.png', + }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + quartz_block = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +-- Quartz Pillar +Everness:register_node('everness:quartz_pillar', { + description = S('Quartz Pillar'), + paramtype2 = 'facedir', + tiles = { + 'everness_quartz_block_lines_top.png', + 'everness_quartz_block_lines_top.png', + 'everness_quartz_block_lines.png', + }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + quartz_block = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), + on_place = core.rotate_node +}) + +Everness:register_node('everness:forsaken_desert_brick', { + description = S('Forsaken Desert Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_forsaken_desert_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_desert_brick_red', { + description = S('Forsaken Desert Brick Red'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_forsaken_desert_brick_red.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_desert_chiseled_stone', { + description = S('Forsaken Desert Chiseled Stone'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + 'everness_forsaken_desert_chiseled_stone_top.png', + 'everness_forsaken_desert_chiseled_stone_bottom.png', + 'everness_forsaken_desert_chiseled_stone_side.png' + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:forsaken_desert_engraved_stone', { + description = S('Forsaken Desert Engraved Stone'), + tiles = { 'everness_forsaken_desert_engraved_stone.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + pickaxey = 1, + stonebrick = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_sandstone', { + description = S('Crystal Sandstone'), + tiles = { 'everness_crystal_sandstone.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_sandstone_brick', { + description = S('Crystal Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_crystal_sandstone_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_sandstone_chiseled', { + description = S('Crystal Sandstone Chiseled'), + tiles = { 'everness_crystal_sandstone_chiseled.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_sandstone_block', { + description = S('Cursed Sandstone Block'), + tiles = { 'everness_cursed_sandstone_block.png' }, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_sandstone_brick', { + description = S('Cursed Sandstone Brick'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_cursed_sandstone_brick.png' }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone', { + description = S('Mineral') .. ' ' .. S('Stone'), + tiles = { + { + name = 'everness_mineral_stone.png', + align_style = 'world', + scale = 2 + } + }, + drop = 'everness:mineral_stone_cobble', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone_cobble', { + description = S('Mineral') .. ' ' .. S('Cobblestone'), + tiles = { + { + name = 'everness_mineral_cobblestone.png', + align_style = 'world', + scale = 2 + } + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone_block', { + description = S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Block'), + tiles = { + { + name = 'everness_mineral_stone_block.png', + align_style = 'world', + scale = 2 + } + }, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone_brick', { + description = S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick'), + paramtype2 = 'facedir', + is_ground_content = false, + place_param2 = 0, + tiles = { + { + name = 'everness_mineral_stone_brick.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = false, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_sandstone', { + description = S('Mineral') .. ' ' .. S('Sandstone'), + tiles = { 'everness_mineral_sandstone.png' }, + groups = { + -- MTG + cracky = 3, + crumbly = 1, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + -- Everness + everness_sandstone = 1 + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_sandstone_block', { + description = S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Block'), + tiles = { + { + name = 'everness_mineral_sandstone_block.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + sandstone = 1, + normal_sandstone = 1, + building_block = 1, + material_stone = 1, + }, + _mcl_blast_resistance = 0.8, + _mcl_hardness = 0.8, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone_brick_with_growth', { + description = S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Growth'), + paramtype2 = 'facedir', + is_ground_content = false, + place_param2 = 0, + tiles = { + { + name = 'everness_mineral_stone_brick_with_growth.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = false, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_stone_brick_with_flower_growth', { + description = S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Flower Growth'), + paramtype2 = 'facedir', + is_ground_content = false, + place_param2 = 0, + tiles = { + { + name = 'everness_mineral_stone_brick_with_flower_growth.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = false, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_sandstone_brick', { + description = S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick'), + paramtype2 = 'facedir', + is_ground_content = false, + place_param2 = 0, + tiles = { + { + name = 'everness_mineral_sandstone_brick.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = false, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_sandstone_brick_block', { + description = S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Block'), + paramtype2 = 'facedir', + is_ground_content = false, + place_param2 = 0, + tiles = { + { name = 'everness_mineral_sandstone_brick_block_top.png' }, + { name = 'everness_mineral_sandstone_brick_block_top.png' }, + { + name = 'everness_mineral_sandstone_brick_block.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = false, + sounds = Everness.node_sound_stone_defaults(), +}) + +-- +-- Soft / Non-Stone +-- + +Everness:register_node('everness:coral_dirt', { + description = S('Coral Dirt'), + short_description = S('Coral Dirt'), + tiles = { 'everness_coral_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:coral_deep_ocean_mud', { + description = S('Coral Deep Ocean Mud'), + short_description = S('Coral Deep Ocean Mud'), + tiles = { 'everness_mud_2.png' }, + groups = { crumbly = 3, bio_bubbles = 1 }, + sounds = Everness.node_sound_mud_defaults(), +}) + +Everness:register_node('everness:cursed_dirt', { + description = S('Cursed Dirt'), + short_description = S('Cursed Dirt'), + tiles = { 'everness_cursed_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_mud_defaults(), +}) + +Everness:register_node('everness:crystal_dirt', { + description = S('Crystal Dirt'), + short_description = S('Crystal Dirt'), + tiles = { 'everness_crystal_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:forsaken_tundra_dirt', { + description = S('Forsaken Tundra Dirt'), + short_description = S('Forsaken Tundra Dirt'), + tiles = { 'everness_forsaken_tundra_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:forsaken_tundra_dirt_with_grass', { + description = S('Forsaken Tundra Dirt with Grass'), + short_description = S('Forsaken Tundra Dirt with Grass'), + tiles = { + 'everness_forsaken_tundra_grass.png', + 'everness_forsaken_tundra_dirt.png', + { name = 'everness_forsaken_tundra_dirt.png^everness_forsaken_tundra_grass_side.png', tileable_vertical = false } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + -- drop = 'everness:forsaken_tundra_dirt', + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:dirt_with_coral_grass', { + description = S('Dirt with Coral Grass'), + short_description = S('Dirt with Coral Grass'), + tiles = { + 'everness_coral_grass.png', + 'everness_coral_dirt.png', + { name = 'everness_coral_dirt.png^everness_coral_grass_side.png', tileable_vertical = false } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:coral_dirt', + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:dirt_with_cursed_grass', { + description = S('Dirt with Cursed Grass'), + short_description = S('Dirt with Cursed Grass'), + tiles = { + { + name = 'everness_cursed_grass.png', + align_style = 'world', + scale = 4 + }, + 'everness_cursed_dirt.png', + { name = 'everness_cursed_dirt.png^everness_cursed_grass_side.png', tileable_vertical = false } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:cursed_dirt', + sounds = Everness.node_sound_mud_defaults(), +}) + +Everness:register_node('everness:dirt_with_crystal_grass', { + description = S('Dirt with Crystal Grass'), + short_description = S('Dirt with Crystal Grass'), + tiles = { + 'everness_crystal_grass.png', + 'everness_crystal_dirt.png', + { name = 'everness_crystal_dirt.png^everness_crystal_grass_side.png', tileable_vertical = false } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:crystal_dirt', + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:dry_ocean_dirt', { + description = S('Dry Ocean Dirt'), + short_description = S('Dry Ocean Dirt'), + tiles = { + { + name = 'everness_forsaken_desert_dry_ocean_dirt.png', + align_style = 'world', + scale = 4 + } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:gravel', { + description = 'Everness ' .. S('Gravel'), + tiles = { 'everness_gravel.png' }, + groups = { + -- MTG + crumbly = 2, + -- MCL + handy = 1, + shovely = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- All + falling_node = 1, + }, + -- MCL + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + sounds = Everness.node_sound_gravel_defaults(), + drop = { + max_items = 1, + items = { + -- { items = { 'default:flint' }, rarity = 16 }, + { items = { 'everness:gravel' } } + } + } +}) + +Everness:register_node('everness:flame_permanent', { + description = S('Permanent Fire'), + drawtype = 'firelike', + use_texture_alpha = 'blend', + tiles = { + { + name = 'everness_flame_permanent.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 4 + } + } + }, + inventory_image = 'everness_flame_permanent_item.png', + paramtype = 'light', + light_source = 13, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + floodable = true, + damage_per_second = 4, + groups = { + igniter = 2, + dig_immediate = 3, + fire = 1 + }, + drop = '', + on_flood = function(pos, oldnode, newnode) + -- Play flame extinguish sound if liquid is not an 'igniter' + if core.get_item_group(newnode.name, 'igniter') == 0 then + core.sound_play('everness_extinguish_flame', + { + pos = pos, + max_hear_distance = 16, + gain = 1.0, + pitch = math.random(5, 20) / 10 + }, + true + ) + end + + -- Remove the flame + return false + end +}) + +Everness:register_node('everness:flame_permanent_purple', { + description = S('Permanent Fire'), + drawtype = 'firelike', + use_texture_alpha = 'blend', + tiles = { + { + name = 'everness_flame_permanent_purple.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 4 + } + } + }, + inventory_image = 'everness_flame_permanent_purple_item.png', + paramtype = 'light', + light_source = 13, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + floodable = true, + damage_per_second = 4, + groups = { + igniter = 2, + dig_immediate = 3, + fire = 1 + }, + drop = '', + on_flood = function(pos, oldnode, newnode) + -- Play flame extinguish sound if liquid is not an 'igniter' + if core.get_item_group(newnode.name, 'igniter') == 0 then + core.sound_play('everness_extinguish_flame', + { + pos = pos, + max_hear_distance = 16, + gain = 1.0, + pitch = math.random(5, 20) / 10 + }, + true + ) + end + + -- Remove the flame + return false + end +}) + +Everness:register_node('everness:flame_permanent_blue', { + description = S('Permanent Fire'), + drawtype = 'firelike', + use_texture_alpha = 'blend', + tiles = { + { + name = 'everness_flame_permanent_blue.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 4 + } + } + }, + inventory_image = 'everness_flame_permanent_blue_item.png', + paramtype = 'light', + light_source = 13, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + floodable = true, + damage_per_second = 4, + groups = { + igniter = 2, + dig_immediate = 3, + fire = 1 + }, + drop = '', + on_flood = function(pos, oldnode, newnode) + -- Play flame extinguish sound if liquid is not an 'igniter' + if core.get_item_group(newnode.name, 'igniter') == 0 then + core.sound_play('everness_extinguish_flame', + { + pos = pos, + max_hear_distance = 16, + gain = 1.0, + pitch = math.random(5, 20) / 10 + }, + true + ) + end + + -- Remove the flame + return false + end +}) + +-- Mapgen Marker + +Everness:register_node('everness:marker', { + drawtype = 'airlike', + description = 'Marker for mapgen', + tiles = { 'everness_lootchest_marker_top.png', 'everness_lootchest_marker_side.png' }, + groups = { dig_immediate = 3, not_in_creative_inventory = 1 }, + _mcl_hardness = 0.2, + paramtype2 = 'facedir', + drop = '' +}) + +-- Everness default blocks + +Everness:register_node('everness:dirt_1', { + description = S('Dirt'), + short_description = S('Dirt'), + tiles = { 'everness_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:dry_dirt', { + description = S('Dry Dirt'), + short_description = S('Dry Dirt'), + tiles = { 'everness_dry_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:dry_dirt_with_dry_grass', { + description = S('Dirt with Dry Grass'), + short_description = S('Dirt with Dry Grass'), + tiles = { + 'everness_dry_grass_top.png', + 'everness_dry_dirt.png', + { name = 'everness_dry_dirt.png^everness_dry_grass_side.png', tileable_vertical = false } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:dry_dirt', + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:dirt_with_grass_1', { + description = S('Dirt with Grass'), + short_description = S('Dirt with Grass'), + tiles = { + 'everness_grass_top.png', + 'everness_dirt.png', + { name = 'everness_dirt.png^everness_grass_side.png', tileable_vertical = false } + }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:dirt_1', + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:dirt_with_grass_extras_1', { + description = S('Dirt with Grass'), + short_description = S('Dirt with Grass'), + tiles = { + { name = 'everness_grass_top.png^everness_grass_extras_1.png', tileable_vertical = false }, + 'everness_dirt.png', + { name = 'everness_dirt.png^everness_grass_side.png', tileable_vertical = false } + }, + use_texture_alpha = 'clip', + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:dirt_1', + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:dirt_with_grass_extras_2', { + description = S('Dirt with Grass'), + short_description = S('Dirt with Grass'), + tiles = { + { name = 'everness_grass_top.png^everness_grass_extras_2.png', tileable_vertical = false }, + 'everness_dirt.png', + { name = 'everness_dirt.png^everness_grass_side.png', tileable_vertical = false } + }, + use_texture_alpha = 'clip', + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + drop = 'everness:dirt_1', + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:crystal_cave_dirt', { + description = S('Crystal Cave Dirt'), + short_description = S('Crystal Cave Dirt'), + tiles = { 'everness_crystal_cave_dirt.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:crystal_cave_dirt_with_moss', { + description = S('Crystal Cave Dirt with Moss'), + short_description = S('Crystal Cave Dirt with Moss'), + tiles = { + 'everness_crystal_cave_dirt_top.png', + 'everness_crystal_cave_dirt.png', + 'everness_crystal_cave_dirt_side.png' + }, + drop = 'everness:crystal_cave_dirt', + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type_under = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:moss_block', { + description = S('Moss Block'), + tiles = { 'everness_moss_block.png' }, + groups = { + -- MTG + crumbly = 3, + -- Everness + everness_spreading_dirt_type_under = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:crystal_moss_block', { + description = S('Crystal Moss Block'), + tiles = { 'everness_crystal_cave_moss.png' }, + groups = { + -- MTG + crumbly = 3, + -- MCL + handy = 1, + shovely = 1, + dirt = 2, + grass_block = 1, + grass_block_no_snow = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + -- Everness + everness_spreading_dirt_type = 1, + -- ALL + soil = 1, + }, + _mcl_blast_resistance = 0.6, + _mcl_hardness = 0.6, + sounds = Everness.node_sound_grass_defaults(), +}) + +Everness:register_node('everness:coral_sand', { + description = S('Coral Sand'), + short_description = S('Coral Sand'), + tiles = { 'everness_coral_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:coral_white_sand', { + description = S('Coral White Sand'), + short_description = S('Coral White Sand'), + tiles = { 'everness_coral_white_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:cursed_sand', { + description = S('Cursed Sand'), + short_description = S('Cursed Sand'), + tiles = { 'everness_cursed_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:crystal_sand', { + description = S('Crystal Sand'), + short_description = S('Crystal Sand'), + tiles = { 'everness_crystal_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_sand_with_crack', { + description = S('Crystal Forest Deep Ocean Sand with Crack'), + short_description = S('Crystal Forest Deep Ocean Sand with Crack'), + tiles = { 'everness_crystal_forest_deep_ocean_sand_with_crack.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + rising_crystals = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:forsaken_tundra_beach_sand', { + description = S('Forsaken Tundra Beach Sand'), + short_description = S('Forsaken Tundra Beach Sand'), + tiles = { 'everness_forsaken_tundra_beach_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:forsaken_tundra_beach_sand_with_shells', { + description = S('Forsaken Tundra Beach Sand with Shells'), + short_description = S('Forsaken Tundra Beach Sand'), + tiles = { 'everness_forsaken_tundra_beach_sand_with_shells.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:forsaken_desert_sand', { + description = S('Forsaken Desert Sand'), + short_description = S('Forsaken Desert Sand'), + tiles = { 'everness_forsaken_desert_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:coral_forest_deep_ocean_sand', { + description = S('Coral Forest Deep Ocean Sand'), + short_description = S('Coral Forest Deep Ocean Sand'), + tiles = { 'everness_deep_ocean_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_sand', { + description = S('Cursed Lands Deep Ocean Sand'), + short_description = S('Cursed Lands Deep Ocean Sand'), + tiles = { 'everness_cursed_lands_deep_ocean_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_sand_with_crack', { + description = S('Cursed Lands Deep Ocean Sand with Crack'), + short_description = S('Cursed Lands Deep Ocean Sand with Crack'), + tiles = { 'everness_cursed_lands_deep_ocean_sand_with_crack.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + rising_souls = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_sand', { + description = S('Crystal Forest Deep Ocean Sand'), + short_description = S('Crystal Forest Deep Ocean Sand'), + tiles = { 'everness_crystal_forest_deep_ocean_sand.png' }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:mineral_sand', { + description = S('Mineral Sand'), + short_description = S('Mineral Sand'), + tiles = { + { + name = 'everness_mineral_sand.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + -- MCL + handy = 1, + shovely = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + soil_sapling = 2, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:frosted_snowblock', { + description = S('Frosted Snow Block'), + tiles = { 'everness_frosted_snow.png' }, + groups = { + -- MTG + crumbly = 3, + cools_lava = 1, + snowy = 1, + -- MCL + shovely = 2, + building_block = 1, + snow_cover = 1 + }, + _mcl_blast_resistance = 0.1, + _mcl_hardness = 0.1, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_frosted_snow_defaults(), + on_construct = function(pos) + pos.y = pos.y - 1 + + local alias_dirt_with_grass = core.registered_aliases['default:dirt_with_grass'] + local alias_dirt_with_snow = core.registered_aliases['default:dirt_with_snow'] + + if core.get_node(pos).name == alias_dirt_with_grass then + core.set_node(pos, { name = alias_dirt_with_snow }) + end + end, +}) + +-- 'is ground content = false' to avoid tunnels in sea ice or ice rivers +Everness:register_node('everness:frosted_ice', { + description = S('Frosted Ice'), + tiles = { 'everness_frosted_ice.png' }, + is_ground_content = false, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + -- ALL + slippery = 3 + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_ice_defaults(), +}) + +Everness:register_node('everness:frosted_ice_translucent', { + description = S('Frosted Ice Translucent'), + tiles = { 'everness_frosted_ice_translucent.png' }, + is_ground_content = false, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + -- ALL + slippery = 3 + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_ice_defaults(), + drawtype = 'glasslike', + -- opaque, clip, blend + use_texture_alpha = 'blend' +}) + +-- Mapgen-placed ice with 'is ground content = true' to contain tunnels +Everness:register_node('everness:frosted_cave_ice', { + description = S('Frosted Cave Ice'), + tiles = { 'everness_frosted_ice.png' }, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + -- ALL + slippery = 3, + not_in_creative_inventory = 1 + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + drop = 'everness:frosted_ice', + sounds = Everness.node_sound_ice_defaults(), +}) + +-- Mapgen-placed ice with 'is ground content = true' to contain tunnels +Everness:register_node('everness:frosted_cave_ice_illuminating', { + description = S('Frosted Cave Ice'), + tiles = { 'everness_frosted_ice.png' }, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + -- ALL + slippery = 3, + not_in_creative_inventory = 1 + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + drop = 'everness:frosted_ice', + sounds = Everness.node_sound_ice_defaults(), + light_source = 9, + is_ground_content = false +}) + +Everness:register_node('everness:bone', { + description = S('Bone'), + tiles = { 'everness_bone_top.png', 'everness_bone_top.png', 'everness_bone.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node +}) + +Everness:register_node('everness:ancient_emerald_ice', { + description = S('Ancient Emerald Ice'), + tiles = { 'everness_ancient_emerald_ice.png' }, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_ice_defaults(), +}) + +Everness:register_node('everness:dense_emerald_ice', { + description = S('Dense Emerald Ice'), + tiles = { 'everness_dense_emerald_ice.png' }, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_ice_defaults(), +}) + +Everness:register_node('everness:emerald_ice', { + description = S('Emerald Ice'), + tiles = { 'everness_emerald_ice.png' }, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + cools_lava = 1, + -- MCL + handy = 1, + pickaxey = 1, + building_block = 1, + ice = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_ice_defaults(), +}) + +Everness:register_node('everness:snowcobble', { + description = 'Snow Cobble', + tiles = { 'everness_snowcobble.png' }, + groups = { + -- MTG + puts_out_fire = 1, + cools_lava = 1, + snowy = 1, + cracky = 2, + stone = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_snow_defaults(), + is_ground_content = false, + + on_construct = function(pos) + pos.y = pos.y - 1 + + local alias_dirt_with_grass = core.registered_aliases['default:dirt_with_grass'] + local alias_dirt_with_snow = core.registered_aliases['default:dirt_with_snow'] + + if core.get_node(pos).name == alias_dirt_with_grass then + core.set_node(pos, { name = alias_dirt_with_snow }) + end + end, +}) + +Everness:register_node('everness:icecobble', { + description = 'Ice Cobble', + tiles = { 'everness_icecobble.png' }, + groups = { + -- MTG + puts_out_fire = 1, + cools_lava = 1, + cracky = 2, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + cobble = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 2, + sounds = Everness.node_sound_ice_defaults(), + is_ground_content = false, +}) + +Everness:register_node('everness:cursed_mud', { + description = S('Cursed Mud'), + tiles = { 'everness_cursed_mud.png' }, + drawtype = 'glasslike', + paramtype = 'light', + move_resistance = 7, + drowning = 2, + walkable = false, + climbable = false, + post_effect_color = { r = 49, g = 51, b = 57, a = 245 }, + groups = { + -- MTG + crumbly = 3, + everness_sand = 1, + liquid = 3, + disable_jump = 1, + -- MCL + handy = 1, + shovely = 1, + soil_sugarcane = 1, + enderman_takable = 1, + building_block = 1, + material_sand = 1, + -- ALL + falling_node = 1, + }, + sounds = Everness.node_sound_sand_defaults(), + -- MCL + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, +}) + +Everness:register_node('everness:cobweb', { + description = S('Cobweb'), + tiles = { 'everness_cobweb.png' }, + inventory_image = 'everness_cobweb.png', + drawtype = 'plantlike', + paramtype2 = 'meshoptions', + place_param2 = 8, + visual_scale = 1.1, + paramtype = 'light', + move_resistance = 7, + drowning = 2, + walkable = false, + groups = { + -- MTG + crumbly = 3, + liquid = 3, + -- MCL + swordy_cobweb = 1, + shearsy_cobweb = 1, + fake_liquid = 1, + deco_block = 1, + dig_by_piston = 1, + dig_by_water = 1, + destroy_by_lava_flow = 1, + -- ALL + disable_jump = 1, + }, + sounds = Everness.node_sound_leaves_defaults() +}) + +Everness:register_node('everness:cave_flower', { + description = S('Cave Flower'), + short_description = S('Cave Flower'), + drawtype = 'mesh', + mesh = 'everness_cave_flower.obj', + tiles = { 'everness_cave_flower_mesh.png' }, + inventory_image = 'everness_cave_flower_item.png', + wield_image = 'everness_cave_flower_item.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + is_ground_content = false, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + groups = { + -- MTG + snappy = 3, + flora = 1, + bamboo_grass_under = 1, + -- X Farming + compost = 65, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + enderman_takable = 1, + plant = 1, + flower = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + compostability = 65, + -- ALL + flammable = 1, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + light_source = 7, + liquids_pointable = false, + use_texture_alpha = 'clip', +}) + +Everness:register_node('everness:cave_flower_with_particles', { + description = S('Cave Flower with Particles'), + short_description = S('Cave Flower with Particles'), + drawtype = 'mesh', + mesh = 'everness_cave_flower_with_particles.obj', + tiles = { + { name = 'everness_cave_flower_mesh.png' }, + { + name = 'everness_cave_flower_mesh_particles.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 32, + length = 5 + }, + backface_culling = false + } + }, + inventory_image = 'everness_cave_flower_item_particles.png', + wield_image = 'everness_cave_flower_item_particles.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + is_ground_content = false, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, -0.25, 0.5 } + }, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- X Farming + compost = 65, + -- Everness + bamboo_grass_under = 1, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + enderman_takable = 1, + plant = 1, + flower = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + compostability = 65, + -- ALL + flammable = 1, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + light_source = 12, + liquids_pointable = false, + -- opaque, clip, blend + use_texture_alpha = 'blend', +}) + +local lotus_flower_def = { + drawtype = 'mesh', + mesh = 'everness_lotus_flower.obj', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 0, 0.5 }, + }, + node_placement_prediction = '', + groups = { + -- MTG + snappy = 3, + -- X Farming + compost = 30, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + enderman_takable = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + compostability = 30, + -- ALL + flower = 1, + flammable = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + light_source = 3, + liquids_pointable = true, + floodable = true, + use_texture_alpha = 'blend' +} + +for _, color in ipairs({ 'pink', 'purple', 'white' }) do + local def = table.copy(lotus_flower_def) + + def.description = S('Lotus') .. ' ' .. S('Flower') .. ' ' .. S(color) + def.short_description = S('Lotus') .. ' ' .. S('Flower') .. ' ' .. S(color) + def.tiles = { + { name = 'everness_lotus_flower_' .. color .. '_mesh.png' }, + { name = 'everness_lotus_flower_mesh_not_animated.png' } + } + def.inventory_image = 'everness_lotus_flower_' .. color .. '_item.png' + def.wield_image = 'everness_lotus_flower_' .. color .. '_item.png' + + def.on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = core.get_node(pointed_thing.under) + local node_def = core.registered_nodes[node.name] + + if node_def and node_def.on_rightclick then + return node_def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) + end + + if node_def + and node_def.liquidtype == 'source' + and core.get_item_group(node.name, 'water') > 0 + then + local player_name = placer and placer:get_player_name() or '' + + if not core.is_protected(pos, player_name) then + core.set_node(pos, { name = 'everness:lotus_flower_' .. color, param2 = math.random(0, 3) }) + core.get_node_timer(pos):start(1) + + if not core.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + core.chat_send_player(player_name, 'Node is protected') + core.record_protection_violation(pos, player_name) + end + else + itemstack = core.item_place(itemstack, placer, pointed_thing) + end + + return itemstack + end + + def.on_flood = function(pos, oldnode, newnode) + core.add_item(pos, ItemStack('everness:lotus_flower_' .. color .. ' 1')) + -- Remove the node + return false + end + + def.on_timer = function(pos, elapsed) + if core.get_node_light(pos) <= 11 then + core.set_node(pos, { name = 'everness:lotus_flower_' .. color .. '_animated' }) + end + + core.get_node_timer(pos):start(math.random(25, 35)) + end + + -- Animated Def + local def_anim = table.copy(def) + + def_anim.description = S('Lotus') .. ' ' .. S('Flower') .. ' ' .. S(color) .. ' ' .. S('Animated') + def_anim.short_description = S('Lotus') .. ' ' .. S('Flower') .. ' ' .. S(color) .. ' ' .. S('Animated') + def_anim.tiles = { + { name = 'everness_lotus_flower_' .. color .. '_mesh.png' }, + { + name = 'everness_lotus_flower_' .. color .. '_mesh_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 64, + aspect_h = 32, + length = 2 + }, + backface_culling = false + } + } + def_anim.light_source = 6 + def_anim.groups = { + -- MTG + snappy = 3, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + -- ALL + flammable = 1, + not_in_creative_inventory = 1 + } + def_anim.drop = 'everness:lotus_flower_' .. color + + def_anim.on_timer = function(pos, elapsed) + if core.get_node_light(pos) > 11 then + core.set_node(pos, { name = 'everness:lotus_flower_' .. color }) + end + + core.get_node_timer(pos):start(math.random(25, 35)) + end + + Everness:register_node('everness:lotus_flower_' .. color, def) + Everness:register_node('everness:lotus_flower_' .. color .. '_animated', def_anim) +end + +Everness:register_node('everness:lotus_leaf', { + description = S('Lotus') .. ' ' .. S('Leaf'), + short_description = S('Lotus') .. ' ' .. S('Leaf'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_lotus_leaf_y.png', + 'everness_lotus_leaf_y.png^[transformFY' + }, + inventory_image = 'everness_lotus_leaf_item.png', + wield_image = 'everness_lotus_leaf_item.png', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + node_box = { + type = 'fixed', + fixed = { + { -0.4375, -0.4688, -0.4375, 0.4375, -0.4688, 0.4375 }, + { -0.4375, -0.4688, -0.4375, -0.4375, -0.4063, 0.4375 }, + { 0.4375, -0.4688, -0.4375, 0.4375, -0.4063, 0.4375 }, + { -0.4375, -0.4688, -0.4375, 0.4375, -0.4063, -0.4375 }, + { -0.4375, -0.4688, 0.4375, -0.0625, -0.4063, 0.4375 }, + { 0.0625, -0.4688, 0.4375, 0.4375, -0.4063, 0.4375 }, + } + }, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.4688, -0.5, 0.5, -0.375, 0.5 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.4688, -0.5, 0.5, -0.375, 0.5 }, + }, + node_placement_prediction = '', + groups = { + -- MTG + snappy = 3, + -- X Farming + compost = 30, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + enderman_takable = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + -- X Farming + compostability = 30, + -- ALL + flora = 1, + flammable = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + liquids_pointable = true, + floodable = true, + use_texture_alpha = 'clip', + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = core.get_node(pointed_thing.under) + local def = core.registered_nodes[node.name] + + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) + end + + if def + and def.liquidtype == 'source' + and core.get_item_group(node.name, 'water') > 0 + then + local player_name = placer and placer:get_player_name() or '' + + if not core.is_protected(pos, player_name) then + core.set_node(pos, {name = 'everness:lotus_leaf', param2 = math.random(0, 3)}) + + if not core.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + core.chat_send_player(player_name, 'Node is protected') + core.record_protection_violation(pos, player_name) + end + else + itemstack = core.item_place(itemstack, placer, pointed_thing) + end + + return itemstack + end, + + on_flood = function(pos, oldnode, newnode) + core.add_item(pos, ItemStack('everness:lotus_leaf 1')) + -- Remove the node + return false + end +}) + +Everness:register_node('everness:lotus_leaf_2', { + description = S('Lotus') .. ' ' .. S('Leaf'), + short_description = S('Lotus') .. ' ' .. S('Leaf'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_lotus_leaf_2_y.png', + 'everness_lotus_leaf_2_y.png^[transformFY' + }, + inventory_image = 'everness_lotus_leaf_2_item.png', + wield_image = 'everness_lotus_leaf_2_item.png', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + node_box = { + type = 'fixed', + fixed = { + { -0.4375, -0.4688, -0.4375, 0.4375, -0.4688, 0.4375 }, + { -0.4375, -0.4688, -0.4375, -0.4375, -0.4063, 0.4375 }, + { 0.4375, -0.4688, -0.4375, 0.4375, -0.4063, 0.4375 }, + { -0.4375, -0.4688, -0.4375, 0.4375, -0.4063, -0.4375 }, + { -0.4375, -0.4688, 0.4375, -0.0625, -0.4063, 0.4375 }, + { 0.0625, -0.4688, 0.4375, 0.4375, -0.4063, 0.4375 }, + } + }, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.4688, -0.5, 0.5, -0.375, 0.5 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.4688, -0.5, 0.5, -0.375, 0.5 }, + }, + node_placement_prediction = '', + groups = { + -- MTG + snappy = 3, + -- X Farming + compost = 30, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + enderman_takable = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + -- X Farming + compostability = 30, + -- ALL + flora = 1, + flammable = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + liquids_pointable = true, + floodable = true, + use_texture_alpha = 'clip', + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = core.get_node(pointed_thing.under) + local def = core.registered_nodes[node.name] + + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) + end + + if def + and def.liquidtype == 'source' + and core.get_item_group(node.name, 'water') > 0 + then + local player_name = placer and placer:get_player_name() or '' + + if not core.is_protected(pos, player_name) then + core.set_node(pos, {name = 'everness:lotus_leaf_2', param2 = math.random(0, 3)}) + + if not core.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + core.chat_send_player(player_name, 'Node is protected') + core.record_protection_violation(pos, player_name) + end + else + itemstack = core.item_place(itemstack, placer, pointed_thing) + end + + return itemstack + end, + + on_flood = function(pos, oldnode, newnode) + core.add_item(pos, ItemStack('everness:lotus_leaf_2 1')) + -- Remove the node + return false + end +}) + +Everness:register_node('everness:lotus_leaf_3', { + description = S('Lotus') .. ' ' .. S('Leaf') .. ' ' .. S('Dry'), + short_description = S('Lotus') .. ' ' .. S('Leaf') .. ' ' .. S('Dry'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_lotus_leaf_3_y.png', + 'everness_lotus_leaf_3_y.png^[transformFY' + }, + inventory_image = 'everness_lotus_leaf_3_item.png', + wield_image = 'everness_lotus_leaf_3_item.png', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + node_box = { + type = 'fixed', + fixed = { + { -0.4375, -0.4688, -0.4375, 0.4375, -0.4688, 0.4375 }, + { -0.4375, -0.4688, -0.4375, -0.4375, -0.4063, 0.4375 }, + { 0.4375, -0.4688, -0.4375, 0.4375, -0.4063, 0.4375 }, + { -0.4375, -0.4688, -0.4375, 0.4375, -0.4063, -0.4375 }, + { -0.4375, -0.4688, 0.4375, -0.0625, -0.4063, 0.4375 }, + { 0.0625, -0.4688, 0.4375, 0.4375, -0.4063, 0.4375 }, + } + }, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.4688, -0.5, 0.5, -0.375, 0.5 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.4688, -0.5, 0.5, -0.375, 0.5 }, + }, + node_placement_prediction = '', + groups = { + -- MTG + snappy = 3, + -- X Farming + compost = 30, + -- MCL + deco_block = 1, + dig_by_piston = 1, + dig_immediate = 3, + dig_by_water = 1, + destroy_by_lava_flow = 1, + enderman_takable = 1, + place_flowerlike = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + -- X Farming + compostability = 30, + -- ALL + flora = 1, + flammable = 1 + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + liquids_pointable = true, + floodable = true, + use_texture_alpha = 'clip', + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = core.get_node(pointed_thing.under) + local def = core.registered_nodes[node.name] + + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) + end + + if def + and def.liquidtype == 'source' + and core.get_item_group(node.name, 'water') > 0 + then + local player_name = placer and placer:get_player_name() or '' + + if not core.is_protected(pos, player_name) then + core.set_node(pos, {name = 'everness:lotus_leaf_3', param2 = math.random(0, 3)}) + + if not core.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + core.chat_send_player(player_name, 'Node is protected') + core.record_protection_violation(pos, player_name) + end + else + itemstack = core.item_place(itemstack, placer, pointed_thing) + end + + return itemstack + end, + + on_flood = function(pos, oldnode, newnode) + core.add_item(pos, ItemStack('everness:lotus_leaf_3 1')) + -- Remove the node + return false + end +}) + +Everness:register_node('everness:forsaken_fire', { + description = S('Forsaken Fire'), + short_description = S('Forsaken Fire'), + drawtype = 'mesh', + mesh = 'everness_forsaken_fire.obj', + tiles = { + { name = 'everness_forsaken_fire_mesh.png' }, + { + name = 'everness_fire_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 1 + }, + backface_culling = false + } + }, + inventory_image = 'everness_forsaken_fire_item.png', + wield_image = 'everness_forsaken_fire_item.png', + paramtype = 'light', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 0.25, 0.5 } + }, + groups = { + -- MTG + cracky = 3, + level = 2, + -- MCL + pickaxey = 2, + building_block = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 5, + sounds = Everness.node_sound_metal_defaults(), + light_source = 13, + liquids_pointable = false, + -- opaque, clip, blend + use_texture_alpha = 'clip', +}) + +-- +-- Trees +-- + +Everness:register_node('everness:coral_tree', { + description = S('Coral Tree Trunk'), + short_description = S('Coral Tree Trunk'), + tiles = { 'everness_coral_tree.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node +}) + +Everness:register_node('everness:coral_wood', { + description = S('Coral Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_coral_wood.png' }, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:coral_tree_bioluminescent', { + description = S('Coral Tree Bioluminescent'), + short_description = S('Coral Tree Bioluminescent'), + tiles = { 'everness_coral_mushrooms_bioluminescent.png' }, + paramtype = 'light', + sunlight_propagates = true, + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- Everness + falling_leaves = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + light_source = 7 +}) + +Everness:register_node('everness:cursed_dream_stone', { + description = S('Cursed Dream Stone'), + short_description = S('Cursed Dream Stone'), + tiles = { 'everness_cursed_dream_stone.png' }, + paramtype = 'light', + sunlight_propagates = true, + is_ground_content = false, + groups = { + -- MTG + cracky = 2, + -- Everness + falling_leaves = 1, + -- MCL + pickaxey = 1, + building_block = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), + light_source = 7 +}) + +Everness:register_node('everness:dry_tree', { + description = S('Dry Tree Trunk'), + short_description = S('Dry Tree Trunk'), + tiles = { 'everness_dry_tree_top.png', 'everness_dry_tree_top.png', 'everness_dry_tree.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node, +}) + +Everness:register_node('everness:baobab_tree', { + description = S('Baobab Tree Trunk'), + short_description = S('Baobab Tree Trunk'), + tiles = { 'everness_baobab_tree_top.png', 'everness_baobab_tree_top.png', 'everness_baobab_tree_side.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node +}) + +Everness:register_node('everness:sequoia_tree', { + description = S('Sequoia Tree Trunk'), + short_description = S('Sequoia Tree Trunk'), + tiles = { 'everness_sequoia_tree_top.png', 'everness_sequoia_tree_top.png', 'everness_sequoia_tree_side.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node +}) + +Everness:register_node('everness:willow_tree', { + description = S('Willow Tree Trunk'), + short_description = S('Sequoia Tree Trunk'), + tiles = { 'everness_willow_tree_top.png', 'everness_willow_tree_top.png', 'everness_willow_tree_side.png' }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node +}) + +Everness:register_node('everness:willow_wood', { + description = S('Willow Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_willow_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:dry_wood', { + description = S('Dry Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_dry_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:hollow_tree', { + description = S('Hollow Tree Trunk'), + short_description = S('Hollow Tree Trunk'), + drawtype = 'nodebox', + node_box = { + type = 'fixed', + fixed = { + { -0.5000, -0.5000, 0.3125, 0.5000, 0.5000, 0.5000 }, + { 0.3125, -0.5000, -0.5000, 0.5000, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.5000, -0.3125, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.5000, 0.5000, 0.5000, -0.3125 } + } + }, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + tiles = { + 'everness_hollow_tree_top.png', + 'everness_hollow_tree_top.png', + 'everness_hollow_tree_side.png' + }, + use_texture_alpha = 'clip', + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node +}) + +Everness:register_node('everness:crystal_tree', { + description = S('Crystal Tree Trunk'), + short_description = S('Crystal Tree Trunk'), + drawtype = 'nodebox', + node_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + }, + }, + tiles = { 'everness_crystal_tree_top.png', 'everness_crystal_tree_top.png', 'everness_crystal_tree.png' }, + paramtype2 = 'facedir', + use_texture_alpha = 'blend', -- only needed for stairs API + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_glass_defaults(), + on_place = core.rotate_node, +}) + +Everness:register_node('everness:crystal_wood', { + description = S('Crystal Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_crystal_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:mese_tree', { + description = S('Mese Tree Trunk'), + short_description = S('Mese Tree Trunk'), + tiles = { + { name = 'everness_mese_tree_top.png' }, + { name = 'everness_mese_tree_top.png' }, + { + name = 'everness_mese_tree_side_animated.png', + align_style = 'world', + scale = 8, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 8 + } + }, + }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node +}) + +Everness:register_node('everness:palm_tree', { + description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Trunk'), + short_description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Trunk'), + tiles = { 'everness_palm_tree_top.png', 'everness_palm_tree_top.png', 'everness_palm_tree_side.png' }, + paramtype2 = 'facedir', + use_texture_alpha = 'blend', -- only needed for stairs API + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node +}) + +Everness:register_node('everness:palm_leaves', { + description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Leaves'), + short_description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_palm_tree_leaves.png' }, + special_tiles = { 'everness_palm_tree_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/100 chance + items = { 'everness:palm_tree_sapling' }, + rarity = 100, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:palm_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:palm_tree_wood', { + description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Wood') .. ' ' .. S('Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + { + name = 'everness_palm_tree_wood.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:mese_leaves', { + description = S('Mese Tree Leaves'), + short_description = S('Mese Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_mese_leaves.png' }, + special_tiles = { 'everness_mese_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/30 chance + items = { 'everness:mese_tree_sapling' }, + rarity = 60, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:mese_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:baobab_leaves', { + description = S('Baobab Tree Leaves'), + short_description = S('Baobab Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_baobab_tree_leaves.png' }, + special_tiles = { 'everness_baobab_tree_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:baobab_sapling' }, + rarity = 30, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:baobab_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:sequoia_leaves', { + description = S('Sequoia Tree Leaves'), + short_description = S('Sequoia Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_sequoia_tree_leaves.png' }, + special_tiles = { 'everness_sequoia_tree_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:sequoia_tree_sapling' }, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:sequoia_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +-- for marker only +Everness:register_node('everness:baobab_fruit_renewable', { + description = S('Baobab Fruit'), + short_description = S('Baobab Fruit'), + drawtype = 'plantlike', + paramtype2 = 'wallmounted', + visual_scale = 1.69, + tiles = { 'everness_baobab_tree_fruit.png^[transformFY' }, + inventory_image = 'everness_baobab_tree_fruit.png^[transformFY', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + waving = 1, + drop = { + max_items = 1, -- Maximum number of items to drop. + items = { -- Choose max_items randomly from this list. + { + items = { 'everness:baobab_fruit' }, -- Items to drop. + rarity = 1, -- Probability of dropping is 1 / rarity. + } + }, + }, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, 1, 0.25 } + }, + groups = { + -- MTG + fleshy = 3, + dig_immediate = 3, + leafdecay = 3, + leafdecay_drop = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + -- ALL + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + place_param2 = 0, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if oldnode.param2 == 0 then + core.set_node(pos, { name = 'everness:baobab_fruit_mark' }) + core.get_node_timer(pos):start(math.random(300, 1500)) + end + end, +}) + +Everness:register_node('everness:baobab_fruit_mark', { + description = S('Baobab Fruit Marker'), + short_description = S('Baobab Fruit Marker'), + inventory_image = 'everness_baobab_tree_fruit.png^[transformFY^everness_invisible_node_overlay.png', + wield_image = 'everness_baobab_tree_fruit.png^[transformFY^everness_invisible_node_overlay.png', + drawtype = 'airlike', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = '', + groups = { not_in_creative_inventory = 1 }, + on_timer = function(pos, elapsed) + if not core.find_node_near(pos, 1, 'everness:baobab_leaves') then + core.remove_node(pos) + elseif core.get_node_light(pos) < 11 then + core.get_node_timer(pos):start(200) + else + core.set_node(pos, { name = 'everness:baobab_fruit_renewable' }) + end + end +}) + +Everness:register_node('everness:baobab_fruit', { + description = S('Baobab Fruit') .. '\n'.. core.colorize(Everness.colors.brown, S('Hunger') .. ': 2'), + short_description = S('Baobab Fruit'), + drawtype = 'plantlike', + paramtype2 = 'wallmounted', + visual_scale = 1.69, + tiles = { 'everness_baobab_tree_fruit.png^[transformFY' }, + inventory_image = 'everness_baobab_tree_fruit.png^[transformFY', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + waving = 1, + on_use = core.item_eat(2), + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.5, -0.25, 0.25, 1, 0.25 } + }, + groups = { + -- MTG + dig_immediate = 3, + -- X Farming + compost = 65, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 65, + -- ALL + flammable = 2, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), +}) + +Everness:register_node('everness:baobab_sapling', { + description = S('Baobab Sapling'), + short_description = S('Baobab Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_baobab_tree_sapling.png' }, + inventory_image = 'everness_baobab_tree_sapling.png', + wield_image = 'everness_baobab_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:baobab_sapling', + minp_relative = { x = -12, y = 1, z = -12 }, + maxp_relative = { x = 12, y = 39, z = 12 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:willow_leaves', { + description = S('Willow Tree Leaves'), + short_description = S('Willow Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_willow_leaves.png' }, + special_tiles = { 'everness_willow_leaves.png^[transformFX' }, + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:willow_tree_sapling' }, + rarity = 50, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:willow_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:coral_leaves', { + description = S('Coral Tree Leaves'), + short_description = S('Coral Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_coral_leaves.png' }, + special_tiles = { 'everness_coral_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- Everness + falling_leaves = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:coral_tree_sapling' }, + rarity = 30, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:coral_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:dry_branches', { + description = S('Dry Tree Branches'), + short_description = S('Dry Tree Branches'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_dry_branches.png' }, + special_tiles = { 'everness_dry_branches.png' }, + paramtype = 'light', + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- Everness + falling_leaves = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:dry_tree_sapling' }, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:dry_branches' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:crystal_leaves', { + description = S('Crystal Tree Leaves'), + short_description = S('Crystal Tree Leaves'), + drawtype = 'allfaces_optional', + waving = 1, + tiles = { 'everness_crystal_leaves.png' }, + special_tiles = { 'everness_crystal_leaves.png' }, + paramtype = 'light', + is_ground_content = false, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- Everness + falling_leaves = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:crystal_tree_sapling' }, + rarity = 30, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:crystal_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:coral_tree_sapling', { + description = S('Coral Tree Sapling'), + short_description = S('Coral Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_coral_tree_sapling.png' }, + inventory_image = 'everness_coral_tree_sapling.png', + wield_image = 'everness_coral_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:coral_tree_sapling', + minp_relative = { x = -3, y = 1, z = -3 }, + maxp_relative = { x = 3, y = 6, z = 3 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:coral_tree_bioluminescent_sapling', { + description = S('Coral Tree Bioluminescent Sapling'), + short_description = S('Coral Tree Bioluminescent Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_coral_tree_bioluminescent_sapling.png' }, + inventory_image = 'everness_coral_tree_bioluminescent_sapling.png', + wield_image = 'everness_coral_tree_bioluminescent_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:coral_tree_bioluminescent_sapling', + minp_relative = { x = -7, y = 1, z = -7 }, + maxp_relative = { x = 7, y = 17, z = 7 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:dry_tree_sapling', { + description = S('Dry Tree Sapling'), + short_description = S('Dry Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_dry_tree_sapling.png' }, + inventory_image = 'everness_dry_tree_sapling.png', + wield_image = 'everness_dry_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:dry_tree_sapling', + minp_relative = { x = -3, y = 1, z = -3 }, + maxp_relative = { x = 3, y = 8, z = 3 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:cursed_dream_tree_sapling', { + description = S('Cursed Dream Tree Sapling'), + short_description = S('Cursed Dream Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_cursed_dream_tree_sapling.png' }, + inventory_image = 'everness_cursed_dream_tree_sapling.png', + wield_image = 'everness_cursed_dream_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:cursed_dream_tree_sapling', + minp_relative = { x = -8, y = 1, z = -8 }, + maxp_relative = { x = 8, y = 15, z = 8 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:willow_tree_sapling', { + description = S('Willow Tree Sapling'), + short_description = S('Willow Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_willow_tree_sapling.png' }, + inventory_image = 'everness_willow_tree_sapling.png', + wield_image = 'everness_willow_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:willow_tree_sapling', + minp_relative = { x = -19, y = 1, z = -19 }, + maxp_relative = { x = 19, y = 28, z = 19 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:sequoia_tree_sapling', { + description = S('Sequoia Tree Sapling'), + short_description = S('Sequoia Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_sequoia_tree_sapling.png' }, + inventory_image = 'everness_sequoia_tree_sapling.png', + wield_image = 'everness_sequoia_tree_sapling.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 24, + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:sequoia_tree_sapling', + minp_relative = { x = -12, y = 1, z = -12 }, + maxp_relative = { x = 12, y = 75, z = 12 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:crystal_tree_sapling', { + description = S('Crystal Tree Sapling'), + short_description = S('Crystal Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_crystal_tree_sapling.png' }, + inventory_image = 'everness_crystal_tree_sapling.png', + wield_image = 'everness_crystal_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:crystal_tree_sapling', + minp_relative = { x = -6, y = 1, z = -6 }, + maxp_relative = { x = 6, y = 14, z = 6 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:crystal_tree_large_sapling', { + description = S('Crystal Tree Large Sapling'), + short_description = S('Crystal Tree Large Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_crystal_tree_large_sapling.png' }, + inventory_image = 'everness_crystal_tree_large_sapling.png', + wield_image = 'everness_crystal_tree_large_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:crystal_tree_large_sapling', + minp_relative = { x = -10, y = 1, z = -10 }, + maxp_relative = { x = 10, y = 14, z = 10 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +-- Crystal Bush + +Everness:register_node('everness:crystal_bush_stem', { + description = S('Crystal Bush Stem'), + drawtype = 'plantlike', + visual_scale = 1.41, + tiles = { 'everness_crystal_bush_stem.png' }, + inventory_image = 'everness_crystal_bush_stem.png', + wield_image = 'everness_crystal_bush_stem.png', + paramtype = 'light', + sunlight_propagates = true, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 2, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + selection_box = { + type = 'fixed', + fixed = { -7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16 }, + }, +}) + +Everness:register_node('everness:crystal_bush_leaves', { + description = S('Crystal Bush Leaves'), + drawtype = 'allfaces_optional', + tiles = { 'everness_crystal_bush_leaves.png' }, + paramtype = 'light', + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { items = { 'everness:crystal_bush_sapling' }, rarity = 5 }, + { items = { 'everness:crystal_bush_leaves' } } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:crystal_bush_sapling', { + description = S('Crystal Bush Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_crystal_bush_sapling.png' }, + inventory_image = 'everness_crystal_bush_sapling.png', + wield_image = 'everness_crystal_bush_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:crystal_bush_sapling', + minp_relative = { x = -1, y = 0, z = -1 }, + maxp_relative = { x = 1, y = 1, z = 1 }, + interval = 2, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +-- Cursed Bush + +Everness:register_node('everness:cursed_bush_stem', { + description = S('Cursed Bush Stem'), + drawtype = 'plantlike', + visual_scale = 1.21, + tiles = { 'everness_cursed_bush_stem.png' }, + inventory_image = 'everness_cursed_bush_stem.png', + wield_image = 'everness_cursed_bush_stem.png', + paramtype = 'light', + sunlight_propagates = true, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 2, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + selection_box = { + type = 'fixed', + fixed = { -7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16 }, + }, +}) + +Everness:register_node('everness:cursed_bush_leaves', { + description = S('Cursed Bush Leaves'), + drawtype = 'allfaces_optional', + tiles = { 'everness_cursed_bush_leaves.png' }, + paramtype = 'light', + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { items = { 'everness:cursed_bush_sapling' }, rarity = 5 }, + { items = { 'everness:cursed_bush_leaves' } } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:cursed_bush_sapling', { + description = S('Cursed Bush Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_cursed_bush_sapling.png' }, + inventory_image = 'everness_cursed_bush_sapling.png', + wield_image = 'everness_cursed_bush_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:cursed_bush_sapling', + minp_relative = { x = -1, y = 0, z = -1 }, + maxp_relative = { x = 1, y = 1, z = 1 }, + interval = 2, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +-- +-- Plantlife (non-cubic) +-- + +Everness:register_node('everness:flowers_1', { + description = S('Flowers'), + short_description = S('Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers.png', + 'everness_flowers.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers.png', + wield_image = 'everness_flowers.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + bamboo_grass = 1, + flower = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + } + }, + on_place = function(itemstack, placer, pointed_thing) + local stack = ItemStack('everness:flowers_' .. math.random(1, 4)) + local ret = core.item_place(stack, placer, pointed_thing, math.random(0, 3)) + return ItemStack('everness:flowers_1 ' .. itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +Everness:register_node('everness:flowers_2', { + description = S('Flowers'), + short_description = S('Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers.png', + 'everness_flowers.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers.png', + wield_image = 'everness_flowers.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:flowers_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + } + } +}) + +Everness:register_node('everness:flowers_3', { + description = S('Flowers'), + short_description = S('Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers.png', + 'everness_flowers.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers.png', + wield_image = 'everness_flowers.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:flowers_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + { -0.5, -0.375, -0.5, 0, -0.375, 0 }, -- 2 small and 1 medium flowers top (C) + { -0.125, -0.5, -0.1875, -0.0625, -0.375, -0.125 }, -- stem C + { -0.4375, -0.5, -0.25, -0.375, -0.375, -0.1875 }, -- stem C + { -0.3125, -0.5, -0.375, -0.1875, -0.375, -0.375 }, -- stem C + { -0.25, -0.5, -0.4375, -0.25, -0.375, -0.3125 }, -- stem C + } + } +}) + +Everness:register_node('everness:flowers_4', { + description = S('Flowers'), + short_description = S('Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers.png', + 'everness_flowers.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers.png', + wield_image = 'everness_flowers.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:flowers_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { 0, -0.375, -0.5, 0.5, -0.375, -0.0625 }, -- 1 big flower top (B) + { 0.1875, -0.5, -0.3125, 0.25, -0.375, -0.25 }, -- stem B + { -0.5, -0.375, -0.5, 0, -0.375, 0 }, -- 2 small and 1 medium flowers top (C) + { -0.125, -0.5, -0.1875, -0.0625, -0.375, -0.125 }, -- stem C + { -0.4375, -0.5, -0.25, -0.375, -0.375, -0.1875 }, -- stem C + { -0.3125, -0.5, -0.375, -0.1875, -0.375, -0.375 }, -- stem C + { -0.25, -0.5, -0.4375, -0.25, -0.375, -0.3125 }, -- stem C + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + } + } +}) + +-- Magenta Flowers + +Everness:register_node('everness:flowers_magenta_1', { + description = S('Magenta Flowers'), + short_description = S('Magenta Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers_magenta.png', + 'everness_flowers_magenta.png^[transformFY', + 'everness_flowers_magenta_side_x.png', + 'everness_flowers_magenta_side_x.png^[transformFX', + 'everness_flowers_magenta_side_z.png^[transformFX', + 'everness_flowers_magenta_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers_magenta.png', + wield_image = 'everness_flowers_magenta.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + } + }, + on_place = function(itemstack, placer, pointed_thing) + local stack = ItemStack('everness:flowers_magenta_' .. math.random(1, 4)) + local ret = core.item_place(stack, placer, pointed_thing, math.random(0, 3)) + return ItemStack('everness:flowers_magenta_1 ' .. itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +Everness:register_node('everness:flowers_magenta_2', { + description = S('Magenta Flowers'), + short_description = S('Magenta Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers_magenta.png', + 'everness_flowers_magenta.png^[transformFY', + 'everness_flowers_magenta_side_x.png', + 'everness_flowers_magenta_side_x.png^[transformFX', + 'everness_flowers_magenta_side_z.png^[transformFX', + 'everness_flowers_magenta_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers_magenta.png', + wield_image = 'everness_flowers_magenta.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:flowers_magenta_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + } + } +}) + +Everness:register_node('everness:flowers_magenta_3', { + description = S('Magenta Flowers'), + short_description = S('Magenta Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers_magenta.png', + 'everness_flowers_magenta.png^[transformFY', + 'everness_flowers_magenta_side_x.png', + 'everness_flowers_magenta_side_x.png^[transformFX', + 'everness_flowers_magenta_side_z.png^[transformFX', + 'everness_flowers_magenta_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers_magenta.png', + wield_image = 'everness_flowers_magenta.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:flowers_magenta_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + { -0.5, -0.375, -0.5, 0, -0.375, 0 }, -- 2 small and 1 medium flowers top (C) + { -0.125, -0.5, -0.1875, -0.0625, -0.375, -0.125 }, -- stem C + { -0.4375, -0.5, -0.25, -0.375, -0.375, -0.1875 }, -- stem C + { -0.3125, -0.5, -0.375, -0.1875, -0.375, -0.375 }, -- stem C + { -0.25, -0.5, -0.4375, -0.25, -0.375, -0.3125 }, -- stem C + } + } +}) + +Everness:register_node('everness:flowers_magenta_4', { + description = S('Magenta Flowers'), + short_description = S('Magenta Flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_flowers_magenta.png', + 'everness_flowers_magenta.png^[transformFY', + 'everness_flowers_magenta_side_x.png', + 'everness_flowers_magenta_side_x.png^[transformFX', + 'everness_flowers_magenta_side_z.png^[transformFX', + 'everness_flowers_magenta_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_flowers_magenta.png', + wield_image = 'everness_flowers_magenta.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:flowers_magenta_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { 0, -0.375, -0.5, 0.5, -0.375, -0.0625 }, -- 1 big flower top (B) + { 0.1875, -0.5, -0.3125, 0.25, -0.375, -0.25 }, -- stem B + { -0.5, -0.375, -0.5, 0, -0.375, 0 }, -- 2 small and 1 medium flowers top (C) + { -0.125, -0.5, -0.1875, -0.0625, -0.375, -0.125 }, -- stem C + { -0.4375, -0.5, -0.25, -0.375, -0.375, -0.1875 }, -- stem C + { -0.3125, -0.5, -0.375, -0.1875, -0.375, -0.375 }, -- stem C + { -0.25, -0.5, -0.4375, -0.25, -0.375, -0.3125 }, -- stem C + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + } + } +}) + +-- Clover + +Everness:register_node('everness:clover_1', { + description = S('Clover'), + short_description = S('Clover'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_clover.png', + 'everness_clover.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_clover.png', + wield_image = 'everness_clover.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + bamboo_grass = 1, + flower = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + } + }, + on_place = function(itemstack, placer, pointed_thing) + local stack = ItemStack('everness:clover_' .. math.random(1, 4)) + local ret = core.item_place(stack, placer, pointed_thing, math.random(0, 3)) + return ItemStack('everness:clover_1 ' .. itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +Everness:register_node('everness:clover_2', { + description = S('Clover'), + short_description = S('Clover'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_clover.png', + 'everness_clover.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_clover.png', + wield_image = 'everness_clover.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:clover_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + } + } +}) + +Everness:register_node('everness:clover_3', { + description = S('Clover'), + short_description = S('Clover'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_clover.png', + 'everness_clover.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_clover.png', + wield_image = 'everness_clover.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:clover_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + { -0.5, -0.375, -0.5, 0, -0.375, 0 }, -- 2 small and 1 medium flowers top (C) + { -0.125, -0.5, -0.1875, -0.0625, -0.375, -0.125 }, -- stem C + { -0.4375, -0.5, -0.25, -0.375, -0.375, -0.1875 }, -- stem C + { -0.3125, -0.5, -0.375, -0.1875, -0.375, -0.375 }, -- stem C + { -0.25, -0.5, -0.4375, -0.25, -0.375, -0.3125 }, -- stem C + } + } +}) + +Everness:register_node('everness:clover_4', { + description = S('Clover'), + short_description = S('Clover'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_clover.png', + 'everness_clover.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_clover.png', + wield_image = 'everness_clover.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:clover_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { 0, -0.375, -0.5, 0.5, -0.375, -0.0625 }, -- 1 big flower top (B) + { 0.1875, -0.5, -0.3125, 0.25, -0.375, -0.25 }, -- stem B + { -0.5, -0.375, -0.5, 0, -0.375, 0 }, -- 2 small and 1 medium flowers top (C) + { -0.125, -0.5, -0.1875, -0.0625, -0.375, -0.125 }, -- stem C + { -0.4375, -0.5, -0.25, -0.375, -0.375, -0.1875 }, -- stem C + { -0.3125, -0.5, -0.375, -0.1875, -0.375, -0.375 }, -- stem C + { -0.25, -0.5, -0.4375, -0.25, -0.375, -0.3125 }, -- stem C + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + } + } +}) + +-- Mushrooms + +Everness:register_node('everness:luminous_mushroom_1', { + description = S('Luminous Mushroom'), + short_description = S('Luminous Mushroom'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_luminous_mushroom_top.png', + 'everness_luminous_mushroom_bottom.png', + 'everness_luminous_mushroom_side_x.png', + 'everness_luminous_mushroom_side_x.png^[transformFX', + 'everness_luminous_mushroom_side_z.png^[transformFX', + 'everness_luminous_mushroom_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_luminous_mushroom_top.png', + wield_image = 'everness_luminous_mushroom_top.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:luminous_mushroom_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + light_source = 1, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, -1 / 16, 2 / 16, -1 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { -0.3125, -0.5000, -0.3125, -0.2500, 0.000, -0.2500 }, -- mushroom 1 stem + { -0.5000, 0.000, -0.5000, -0.06250, 0.06250, -0.06250 }, -- mushroom 1 top A + { -0.4375, 0.06250, -0.4375, -0.1250, 0.1250, -0.1250 } -- mushroom 1 top B + } + }, + on_place = function(itemstack, placer, pointed_thing) + local stack = ItemStack('everness:luminous_mushroom_' .. math.random(1, 4)) + local ret = core.item_place(stack, placer, pointed_thing, math.random(0, 3)) + return ItemStack('everness:luminous_mushroom_1 ' .. itemstack:get_count() - (1 - ret:get_count())) + end +}) + +Everness:register_node('everness:luminous_mushroom_2', { + description = S('Luminous Mushroom'), + short_description = S('Luminous Mushroom'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_luminous_mushroom_top.png', + 'everness_luminous_mushroom_bottom.png', + 'everness_luminous_mushroom_side_x.png', + 'everness_luminous_mushroom_side_x.png^[transformFX', + 'everness_luminous_mushroom_side_z.png^[transformFX', + 'everness_luminous_mushroom_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_luminous_mushroom_top.png', + wield_image = 'everness_luminous_mushroom_top.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:luminous_mushroom_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + light_source = 2, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, 2 / 16, -1 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { -0.3125, -0.5000, -0.3125, -0.2500, 0.000, -0.2500 }, -- mushroom 1 stem + { -0.5000, 0.000, -0.5000, -0.06250, 0.06250, -0.06250 }, -- mushroom 1 top A + { -0.4375, 0.06250, -0.4375, -0.1250, 0.1250, -0.1250 }, -- mushroom 1 top B + { 0.3125, -0.3125, -0.2500, 0.5000, -0.2500, -0.06250 }, -- mushroom 2 top + { 0.3750, -0.5000, -0.1875, 0.4375, -0.3125, -0.1250 }, -- mushroom 2 stem + { 0.06250, -0.3750, -0.5000, 0.2500, -0.3125, -0.3125 }, -- mushroom 3 top + { 0.1250, -0.5000, -0.4375, 0.1875, -0.3750, -0.3750 } -- mushroom 3 stem + } + } +}) + +Everness:register_node('everness:luminous_mushroom_3', { + description = S('Luminous Mushroom'), + short_description = S('Luminous Mushroom'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_luminous_mushroom_top.png', + 'everness_luminous_mushroom_bottom.png', + 'everness_luminous_mushroom_side_x.png', + 'everness_luminous_mushroom_side_x.png^[transformFX', + 'everness_luminous_mushroom_side_z.png^[transformFX', + 'everness_luminous_mushroom_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_luminous_mushroom_top.png', + wield_image = 'everness_luminous_mushroom_top.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:luminous_mushroom_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + light_source = 3, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, 2 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { -0.3125, -0.5000, -0.3125, -0.2500, 0.000, -0.2500 }, -- mushroom 1 stem + { -0.5000, 0.000, -0.5000, -0.06250, 0.06250, -0.06250 }, -- mushroom 1 top A + { -0.4375, 0.06250, -0.4375, -0.1250, 0.1250, -0.1250 }, -- mushroom 1 top B + { 0.3125, -0.3125, -0.2500, 0.5000, -0.2500, -0.06250 }, -- mushroom 2 top + { 0.3750, -0.5000, -0.1875, 0.4375, -0.3125, -0.1250 }, -- mushroom 2 stem + { 0.06250, -0.3750, -0.5000, 0.2500, -0.3125, -0.3125 }, -- mushroom 3 top + { 0.1250, -0.5000, -0.4375, 0.1875, -0.3750, -0.3750 }, -- mushroom 3 stem + { 0.06250, -0.1875, 0.06250, 0.5000, -0.1250, 0.5000 }, -- mushroom 4 top A + { 0.1250, -0.1250, 0.1250, 0.4375, -0.06250, 0.4375 }, -- mushroom 4 top B + { 0.2500, -0.5000, 0.2500, 0.3125, -0.1875, 0.3125 } -- mushroom 4 stem + } + } +}) + +Everness:register_node('everness:luminous_mushroom_4', { + description = S('Luminous Mushroom'), + short_description = S('Luminous Mushroom'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_luminous_mushroom_top.png', + 'everness_luminous_mushroom_bottom.png', + 'everness_luminous_mushroom_side_x.png', + 'everness_luminous_mushroom_side_x.png^[transformFX', + 'everness_luminous_mushroom_side_z.png^[transformFX', + 'everness_luminous_mushroom_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_luminous_mushroom_top.png', + wield_image = 'everness_luminous_mushroom_top.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:luminous_mushroom_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + light_source = 4, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, 2 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { -0.3125, -0.5000, -0.3125, -0.2500, 0.000, -0.2500 }, -- mushroom 1 stem + { -0.5000, 0.000, -0.5000, -0.06250, 0.06250, -0.06250 }, -- mushroom 1 top A + { -0.4375, 0.06250, -0.4375, -0.1250, 0.1250, -0.1250 }, -- mushroom 1 top B + { 0.3125, -0.3125, -0.2500, 0.5000, -0.2500, -0.06250 }, -- mushroom 2 top + { 0.3750, -0.5000, -0.1875, 0.4375, -0.3125, -0.1250 }, -- mushroom 2 stem + { 0.06250, -0.3750, -0.5000, 0.2500, -0.3125, -0.3125 }, -- mushroom 3 top + { 0.1250, -0.5000, -0.4375, 0.1875, -0.3750, -0.3750 }, -- mushroom 3 stem + { 0.06250, -0.1875, 0.06250, 0.5000, -0.1250, 0.5000 }, -- mushroom 4 top A + { 0.1250, -0.1250, 0.1250, 0.4375, -0.06250, 0.4375 }, -- mushroom 4 top B + { 0.2500, -0.5000, 0.2500, 0.3125, -0.1875, 0.3125 }, -- mushroom 4 stem + { -0.2500, -0.3125, 0.000, 0.000, -0.2500, 0.2500 }, -- mushroom 5 top + { -0.1875, -0.5000, 0.06250, -0.06250, -0.2500, 0.1875 }, -- mushroom 5 stem + { -0.5000, -0.2500, 0.3125, -0.3125, -0.1875, 0.5000 }, -- mushroom 6 top + { -0.4375, -0.5000, 0.3750, -0.3750, -0.2500, 0.4375 }, -- mushroom 6 stem + } + } +}) + +-- Glossy Mushrooms + +Everness:register_node('everness:glossy_mushroom_1', { + description = S('Glossy Mushroom'), + short_description = S('Glossy Mushroom'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_glossy_mushroom_top.png', + 'everness_glossy_mushroom_bottom.png', + 'everness_glossy_mushroom_side_x.png', + 'everness_glossy_mushroom_side_x.png^[transformFX', + 'everness_glossy_mushroom_side_z.png^[transformFX', + 'everness_glossy_mushroom_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_glossy_mushroom_top.png', + wield_image = 'everness_glossy_mushroom_top.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:glossy_mushroom_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + light_source = 1, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, -1 / 16, 2 / 16, -1 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { -0.3125, -0.5000, -0.3125, -0.2500, 0.000, -0.2500 }, -- mushroom 1 stem + { -0.5000, 0.000, -0.5000, -0.06250, 0.06250, -0.06250 }, -- mushroom 1 top A + { -0.4375, 0.06250, -0.4375, -0.1250, 0.1250, -0.1250 } -- mushroom 1 top B + } + }, + on_place = function(itemstack, placer, pointed_thing) + local stack = ItemStack('everness:glossy_mushroom_' .. math.random(1, 4)) + local ret = core.item_place(stack, placer, pointed_thing, math.random(0, 3)) + return ItemStack('everness:glossy_mushroom_1 ' .. itemstack:get_count() - (1 - ret:get_count())) + end +}) + +Everness:register_node('everness:glossy_mushroom_2', { + description = S('Glossy Mushroom'), + short_description = S('Glossy Mushroom'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_glossy_mushroom_top.png', + 'everness_glossy_mushroom_bottom.png', + 'everness_glossy_mushroom_side_x.png', + 'everness_glossy_mushroom_side_x.png^[transformFX', + 'everness_glossy_mushroom_side_z.png^[transformFX', + 'everness_glossy_mushroom_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_glossy_mushroom_top.png', + wield_image = 'everness_glossy_mushroom_top.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:glossy_mushroom_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + light_source = 2, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, 2 / 16, -1 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { -0.3125, -0.5000, -0.3125, -0.2500, 0.000, -0.2500 }, -- mushroom 1 stem + { -0.5000, 0.000, -0.5000, -0.06250, 0.06250, -0.06250 }, -- mushroom 1 top A + { -0.4375, 0.06250, -0.4375, -0.1250, 0.1250, -0.1250 }, -- mushroom 1 top B + { 0.3125, -0.3125, -0.2500, 0.5000, -0.2500, -0.06250 }, -- mushroom 2 top + { 0.3750, -0.5000, -0.1875, 0.4375, -0.3125, -0.1250 }, -- mushroom 2 stem + { 0.06250, -0.3750, -0.5000, 0.2500, -0.3125, -0.3125 }, -- mushroom 3 top + { 0.1250, -0.5000, -0.4375, 0.1875, -0.3750, -0.3750 } -- mushroom 3 stem + } + } +}) + +Everness:register_node('everness:glossy_mushroom_3', { + description = S('Glossy Mushroom'), + short_description = S('Glossy Mushroom'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_glossy_mushroom_top.png', + 'everness_glossy_mushroom_bottom.png', + 'everness_glossy_mushroom_side_x.png', + 'everness_glossy_mushroom_side_x.png^[transformFX', + 'everness_glossy_mushroom_side_z.png^[transformFX', + 'everness_glossy_mushroom_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_glossy_mushroom_top.png', + wield_image = 'everness_glossy_mushroom_top.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:glossy_mushroom_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + light_source = 3, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, 2 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { -0.3125, -0.5000, -0.3125, -0.2500, 0.000, -0.2500 }, -- mushroom 1 stem + { -0.5000, 0.000, -0.5000, -0.06250, 0.06250, -0.06250 }, -- mushroom 1 top A + { -0.4375, 0.06250, -0.4375, -0.1250, 0.1250, -0.1250 }, -- mushroom 1 top B + { 0.3125, -0.3125, -0.2500, 0.5000, -0.2500, -0.06250 }, -- mushroom 2 top + { 0.3750, -0.5000, -0.1875, 0.4375, -0.3125, -0.1250 }, -- mushroom 2 stem + { 0.06250, -0.3750, -0.5000, 0.2500, -0.3125, -0.3125 }, -- mushroom 3 top + { 0.1250, -0.5000, -0.4375, 0.1875, -0.3750, -0.3750 }, -- mushroom 3 stem + { 0.06250, -0.1875, 0.06250, 0.5000, -0.1250, 0.5000 }, -- mushroom 4 top A + { 0.1250, -0.1250, 0.1250, 0.4375, -0.06250, 0.4375 }, -- mushroom 4 top B + { 0.2500, -0.5000, 0.2500, 0.3125, -0.1875, 0.3125 } -- mushroom 4 stem + } + } +}) + +Everness:register_node('everness:glossy_mushroom_4', { + description = S('Glossy Mushroom'), + short_description = S('Glossy Mushroom'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_glossy_mushroom_top.png', + 'everness_glossy_mushroom_bottom.png', + 'everness_glossy_mushroom_side_x.png', + 'everness_glossy_mushroom_side_x.png^[transformFX', + 'everness_glossy_mushroom_side_z.png^[transformFX', + 'everness_glossy_mushroom_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_glossy_mushroom_top.png', + wield_image = 'everness_glossy_mushroom_top.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:glossy_mushroom_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + light_source = 4, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, 2 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { -0.3125, -0.5000, -0.3125, -0.2500, 0.000, -0.2500 }, -- mushroom 1 stem + { -0.5000, 0.000, -0.5000, -0.06250, 0.06250, -0.06250 }, -- mushroom 1 top A + { -0.4375, 0.06250, -0.4375, -0.1250, 0.1250, -0.1250 }, -- mushroom 1 top B + { 0.3125, -0.3125, -0.2500, 0.5000, -0.2500, -0.06250 }, -- mushroom 2 top + { 0.3750, -0.5000, -0.1875, 0.4375, -0.3125, -0.1250 }, -- mushroom 2 stem + { 0.06250, -0.3750, -0.5000, 0.2500, -0.3125, -0.3125 }, -- mushroom 3 top + { 0.1250, -0.5000, -0.4375, 0.1875, -0.3750, -0.3750 }, -- mushroom 3 stem + { 0.06250, -0.1875, 0.06250, 0.5000, -0.1250, 0.5000 }, -- mushroom 4 top A + { 0.1250, -0.1250, 0.1250, 0.4375, -0.06250, 0.4375 }, -- mushroom 4 top B + { 0.2500, -0.5000, 0.2500, 0.3125, -0.1875, 0.3125 }, -- mushroom 4 stem + { -0.2500, -0.3125, 0.000, 0.000, -0.2500, 0.2500 }, -- mushroom 5 top + { -0.1875, -0.5000, 0.06250, -0.06250, -0.2500, 0.1875 }, -- mushroom 5 stem + { -0.5000, -0.2500, 0.3125, -0.3125, -0.1875, 0.5000 }, -- mushroom 6 top + { -0.4375, -0.5000, 0.3750, -0.3750, -0.2500, 0.4375 }, -- mushroom 6 stem + } + } +}) + +-- Staghorn Corals + +core.register_node('everness:staghorn_coral_1', { + description = S('Staghorn Coral (Stage 1)'), + short_description = S('Staghorn Coral (Stage 1)'), + drawtype = 'nodebox', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + -- Face tile mapping: { top, bottom, right, left, back, front } + tiles = { + 'everness_staghorn_coral_nodebox_top.png', -- Top faces (Glowing polyp crown) + 'everness_staghorn_coral_nodebox_bottom.png', -- Bottom faces (Plum root crust) + 'everness_staghorn_coral_nodebox_side.png', -- Sides (Terracotta ribbed columns) + 'everness_staghorn_coral_nodebox_side.png', + 'everness_staghorn_coral_nodebox_side.png', + 'everness_staghorn_coral_nodebox_side.png', + }, + inventory_image = 'everness_staghorn_coral_inv.png', + wield_image = 'everness_staghorn_coral_inv.png', + node_box = { + type = 'fixed', + fixed = { + { -3/16, -8/16, -3/16, 3/16, -6/16, 3/16 }, -- Root collar base + { -1.5/16, -6/16, -1.5/16, 1.5/16, -2/16, 1.5/16 },-- Center shoot + { -4/16, -8/16, -1/16, -2/16, -4/16, 2/16 }, -- West baby horn + { 1/16, -8/16, -4/16, 4/16, -5/16, -1/16 }, -- East baby horn + }, + }, + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, 2 / 16, 8 / 16 }, + }, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 1, + on_place = function(itemstack, placer, pointed_thing) + local stack = ItemStack('everness:staghorn_coral_' .. math.random(1, 3)) + local ret = core.item_place(stack, placer, pointed_thing, math.random(0, 3)) + return ItemStack('everness:staghorn_coral_1 ' .. itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +core.register_node('everness:staghorn_coral_2', { + description = S('Staghorn Coral (Stage 2)'), + short_description = S('Staghorn Coral (Stage 2)'), + drawtype = 'nodebox', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:staghorn_coral_1', + -- Face tile mapping: { top, bottom, right, left, back, front } + tiles = { + 'everness_staghorn_coral_nodebox_top.png', -- Top faces (Glowing polyp crown) + 'everness_staghorn_coral_nodebox_bottom.png', -- Bottom faces (Plum root crust) + 'everness_staghorn_coral_nodebox_side.png', -- Sides (Terracotta ribbed columns) + 'everness_staghorn_coral_nodebox_side.png', + 'everness_staghorn_coral_nodebox_side.png', + 'everness_staghorn_coral_nodebox_side.png', + }, + inventory_image = 'everness_staghorn_coral_inv.png', + wield_image = 'everness_staghorn_coral_inv.png', + node_box = { + type = 'fixed', + fixed = { + { -4/16, -8/16, -4/16, 4/16, -6/16, 4/16 }, -- Root pedestal + { -2/16, -6/16, -2/16, 2/16, 2/16, 2/16 }, -- Center column + { -1.5/16, 2/16, -1.5/16, 1.5/16, 3.5/16, 1.5/16 },-- Center crown apex + { -5/16, -5/16, -1/16, -2/16, -3/16, 2/16 }, -- West branch elbow + { -6/16, -3/16, -1/16, -3/16, 0.5/16, 2/16 }, -- West branch spire + { 1/16, -4/16, -5/16, 4/16, -2/16, -2/16 }, -- East/South branch elbow + { 2/16, -2/16, -6/16, 5/16, 1.5/16,-3/16 }, -- East/South branch spire + } + }, + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, 2 / 16, 8 / 16 }, + }, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 2 +}) + +core.register_node('everness:staghorn_coral_3', { + description = S('Staghorn Coral (Stage 3)'), + short_description = S('Staghorn Coral (Stage 3)'), + drawtype = 'nodebox', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:staghorn_coral_1', + -- Face tile mapping: { top, bottom, right, left, back, front } + tiles = { + 'everness_staghorn_coral_nodebox_top.png', -- Top faces (Glowing polyp crown) + 'everness_staghorn_coral_nodebox_bottom.png', -- Bottom faces (Plum root crust) + 'everness_staghorn_coral_nodebox_side.png', -- Sides (Terracotta ribbed columns) + 'everness_staghorn_coral_nodebox_side.png', + 'everness_staghorn_coral_nodebox_side.png', + 'everness_staghorn_coral_nodebox_side.png', + }, + inventory_image = 'everness_staghorn_coral_inv.png', + wield_image = 'everness_staghorn_coral_inv.png', + node_box = { + type = 'fixed', + fixed = { + { -5/16, -8/16, -5/16, 5/16, -6/16, 5/16 }, -- Root pedestal + { -2.5/16, -6/16, -2.5/16, 2.5/16, 0/16, 2.5/16 },-- Central trunk + { -2/16, 0/16, -2/16, 1.5/16, 6/16, 1.5/16 },-- Tall central spire + { -1.5/16, 6/16, -1.5/16, 1/16, 7.5/16, 1/16 }, -- Tall crown polyp + { 0/16, -2/16, 1/16, 4/16, 0/16, 4/16 }, -- NE branch arch + { 2/16, 0/16, 2/16, 5/16, 5/16, 5/16 }, -- NE tall spire + { 2.5/16, 5/16, 2.5/16, 4.5/16, 6/16, 4.5/16 },-- NE crown polyp + { -5/16, -4/16, -3/16, -2/16, -2/16, 0/16 }, -- SW branch arch + { -6/16, -2/16, -5/16, -3/16, 3.5/16,-2/16 }, -- SW spire + { 1/16, -5/16, -5/16, 4.5/16, 1/16, -2/16 }, -- SE lower horn + { -5/16, -3/16, 1/16, -2/16, 2/16, 4.5/16 },-- NW lower horn + } + }, + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, 2 / 16, 8 / 16 }, + }, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 3 +}) + +-- CLover with Flowers + +Everness:register_node('everness:clover_with_flovers_1', { + description = S('Clover with flowers'), + short_description = S('Clover with flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_clover_with_flowers.png', + 'everness_clover_with_flowers.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_clover_with_flowers.png', + wield_image = 'everness_clover_with_flowers.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + bamboo_grass = 1, + flower = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + } + }, + on_place = function(itemstack, placer, pointed_thing) + local stack = ItemStack('everness:clover_with_flovers_' .. math.random(1, 4)) + local ret = core.item_place(stack, placer, pointed_thing, math.random(0, 3)) + return ItemStack('everness:clover_with_flovers_1 ' .. itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +Everness:register_node('everness:clover_with_flovers_2', { + description = S('Clover with flowers'), + short_description = S('Clover with flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_clover_with_flowers.png', + 'everness_clover_with_flowers.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_clover_with_flowers.png', + wield_image = 'everness_clover_with_flowers.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:clover_with_flovers_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + } + } +}) + +Everness:register_node('everness:clover_with_flovers_3', { + description = S('Clover with flowers'), + short_description = S('Clover with flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_clover_with_flowers.png', + 'everness_clover_with_flowers.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_clover_with_flowers.png', + wield_image = 'everness_clover_with_flowers.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:clover_with_flovers_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + { -0.5, -0.375, -0.5, 0, -0.375, 0 }, -- 2 small and 1 medium flowers top (C) + { -0.125, -0.5, -0.1875, -0.0625, -0.375, -0.125 }, -- stem C + { -0.4375, -0.5, -0.25, -0.375, -0.375, -0.1875 }, -- stem C + { -0.3125, -0.5, -0.375, -0.1875, -0.375, -0.375 }, -- stem C + { -0.25, -0.5, -0.4375, -0.25, -0.375, -0.3125 }, -- stem C + } + } +}) + +Everness:register_node('everness:clover_with_flovers_4', { + description = S('Clover with flowers'), + short_description = S('Clover with flowers'), + drawtype = 'nodebox', + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_clover_with_flowers.png', + 'everness_clover_with_flowers.png^[transformFY', + 'everness_flowers_side_x.png', + 'everness_flowers_side_x.png^[transformFX', + 'everness_flowers_side_z.png^[transformFX', + 'everness_flowers_side_z.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_clover_with_flowers.png', + wield_image = 'everness_clover_with_flowers.png', + paramtype = 'light', + paramtype2 = 'facedir', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:clover_with_flovers_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + flower = 1, + -- Everness + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + not_in_creative_inventory = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -0.5, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + node_box = { + type = 'fixed', + fixed = { + { 0, -0.3125, -0.0625, 0.5, -0.3125, 0.5 }, -- 3 small flowers top (A) + { 0.375, -0.5, 0.0625, 0.4375, -0.3125, 0.125 }, -- stem A + { 0.0625, -0.5, 0, 0.125, -0.3125, 0.0625 }, -- stem A + { 0.1875, -0.5, 0.3125, 0.25, -0.3125, 0.375 }, -- stem A + { 0, -0.375, -0.5, 0.5, -0.375, -0.0625 }, -- 1 big flower top (B) + { 0.1875, -0.5, -0.3125, 0.25, -0.375, -0.25 }, -- stem B + { -0.5, -0.375, -0.5, 0, -0.375, 0 }, -- 2 small and 1 medium flowers top (C) + { -0.125, -0.5, -0.1875, -0.0625, -0.375, -0.125 }, -- stem C + { -0.4375, -0.5, -0.25, -0.375, -0.375, -0.1875 }, -- stem C + { -0.3125, -0.5, -0.375, -0.1875, -0.375, -0.375 }, -- stem C + { -0.25, -0.5, -0.4375, -0.25, -0.375, -0.3125 }, -- stem C + { -0.5, -0.4375, 0, 0, -0.4375, 0.5 }, -- 1 big flower top (D) + { -0.25, -0.5, 0.1875, -0.1875, -0.4375, 0.25 }, -- stem D + } + } +}) + +local crystal_palette_color_names = { + [0] = S('Aurora Violet'), + [1] = S('Aurora Sky Blue'), + [2] = S('Aurora Cyan'), + [3] = S('Aurora Mint'), + [4] = S('Aurora Lavender'), + [5] = S('Aurora Lime'), + [6] = S('Aurora Coral'), + [7] = S('Aurora Magenta'), +} + +-- 1-Node Glass Crystal Cluster +core.register_node('everness:crystal_cluster', { + description = S('Glass Crystal Cluster'), + drawtype = 'nodebox', + paramtype = 'light', + paramtype2 = 'colorfacedir', + palette = 'everness_crystal_palette.png', + use_texture_alpha = 'blend', + sunlight_propagates = true, + light_source = 1, + tiles = { + { name = 'everness_crystal_cluster_top.png', backface_culling = false }, + 'everness_crystal_cluster_base.png', + { name = 'everness_crystal_cluster_side.png', backface_culling = false }, + { name = 'everness_crystal_cluster_side.png', backface_culling = false }, + { name = 'everness_crystal_cluster_side.png', backface_culling = false }, + { name = 'everness_crystal_cluster_side.png', backface_culling = false }, + }, + node_box = { + type = 'fixed', + fixed = { + { -6 / 16, -8 / 16, -6 / 16, 6 / 16, -6 / 16, 6 / 16 }, -- Geode base plate + { -2 / 16, -6 / 16, -2 / 16, 2 / 16, 5 / 16, 2 / 16 }, -- Central tall prism + { -1.5 / 16, 5 / 16, -1.5 / 16, 1.5 / 16, 7 / 16, 1.5 / 16 }, -- Central apex crown + { -5 / 16, -6 / 16, -1 / 16, -2 / 16, 2 / 16, 2 / 16 }, -- West-leaning shard + { -5 / 16, 2 / 16, 0 / 16, -3 / 16, 3.5 / 16, 2 / 16 }, -- West apex + { 0 / 16, -6 / 16, 2 / 16, 3 / 16, 0.5 / 16, 5 / 16 }, -- South-leaning shard + { 0.5 / 16, 0.5 / 16, 2.5 / 16, 2.5 / 16, 2 / 16, 4.5 / 16 }, -- South apex + { 2 / 16, -6 / 16, -4 / 16, 4.5 / 16, -1 / 16, -1.5 / 16 }, -- NE baby shard + { -4 / 16, -6 / 16, 2 / 16, -1.5 / 16, -2 / 16, 4.5 / 16 }, -- SW baby shard + }, + }, + selection_box = { type = 'fixed', fixed = { -0.4, -0.5, -0.4, 0.4, 0.45, 0.4 } }, + preserve_metadata = function(pos, oldnode, oldmeta, drops) + local pal_idx = math.floor((oldnode.param2 or 0) / 32) % 8 + local col = crystal_palette_color_names[pal_idx] + for _, drop in ipairs(drops) do + if drop.set_param2 then + drop:set_param2(oldnode.param2) + end + local meta = drop:get_meta() + meta:set_int('palette_index', pal_idx * 32) + if col then + local full_desc = S('Glass Crystal Cluster') .. ' (' .. col .. ')' + meta:set_string('description', full_desc) + meta:set_string('short_description', full_desc) + end + end + end, + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_crystal_defaults() +}) + +core.register_alias('everness:crystal_cluster_pink', 'everness:crystal_cluster') + +local function register_glass_megalith(idx, desc, nbox, tile_side, tile_top, tile_bot, light) + core.register_node('everness:crystal_megalith_' .. idx, { + description = desc, + drawtype = 'nodebox', + paramtype = 'light', + paramtype2 = 'colorfacedir', + palette = 'everness_crystal_palette.png', + use_texture_alpha = 'blend', + sunlight_propagates = true, + light_source = light, + tiles = { + { name = tile_top, backface_culling = false }, + (idx == 1) and tile_bot or { name = tile_bot, backface_culling = false }, + { name = tile_side, backface_culling = false }, + { name = tile_side, backface_culling = false }, + { name = tile_side, backface_culling = false }, + { name = tile_side, backface_culling = false }, + }, + node_box = { type = 'fixed', fixed = nbox }, + preserve_metadata = function(pos, oldnode, oldmeta, drops) + local pal_idx = math.floor((oldnode.param2 or 0) / 32) % 8 + local col = crystal_palette_color_names[pal_idx] + for _, drop in ipairs(drops) do + if drop.set_param2 then + drop:set_param2(oldnode.param2) + end + local meta = drop:get_meta() + meta:set_int('palette_index', pal_idx * 32) + if col then + local full_desc = desc .. ' (' .. col .. ')' + meta:set_string('description', full_desc) + meta:set_string('short_description', full_desc) + end + end + end, + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + sounds = Everness.node_sound_crystal_defaults() + }) +end + +-- Segment 1: Base Foundation +register_glass_megalith(1, S('Glass Megalith Foundation'), { + { -7 / 16, -8 / 16, -7 / 16, 7 / 16, -5 / 16, 7 / 16 }, + { -6 / 16, -5 / 16, -6 / 16, 6 / 16, 0 / 16, 6 / 16 }, + { -5 / 16, 0 / 16, -5 / 16, 5 / 16, 8 / 16, 5 / 16 }, +}, 'everness_crystal_megalith_side_1.png', 'everness_crystal_megalith_side_2.png', 'everness_crystal_megalith_base.png', 2) + +-- Segment 2: Lower Shaft +register_glass_megalith(2, S('Glass Megalith Lower Shaft'), { + { -5 / 16, -8 / 16, -5 / 16, 5 / 16, 8 / 16, 5 / 16 }, + { -7 / 16, -3 / 16, -2 / 16, -5 / 16, 3 / 16, 2 / 16 }, + { 5 / 16, -1 / 16, -2 / 16, 7 / 16, 5 / 16, 2 / 16 }, +}, 'everness_crystal_megalith_side_2.png', 'everness_crystal_megalith_side_3.png', 'everness_crystal_megalith_side_1.png', 3) + +-- Segment 3: Mid Nexus +register_glass_megalith(3, S('Glass Megalith Mid Nexus'), { + { -4.5 / 16, -8 / 16, -4.5 / 16, 4.5 / 16, 8 / 16, 4.5 / 16 }, + { -6 / 16, -2 / 16, -6 / 16, -4.5 / 16, 4 / 16, -4.5 / 16 }, + { 4.5 / 16, 0 / 16, 4.5 / 16, 6 / 16, 6 / 16, 6 / 16 }, +}, 'everness_crystal_megalith_side_3.png', 'everness_crystal_megalith_side_4.png', 'everness_crystal_megalith_side_2.png', 4) + +-- Segment 4: Upper Spire +register_glass_megalith(4, S('Glass Megalith Upper Spire'), { + { -3.5 / 16, -8 / 16, -3.5 / 16, 3.5 / 16, 8 / 16, 3.5 / 16 }, + { -4.5 / 16, -4 / 16, 1 / 16, -3.5 / 16, 2 / 16, 3 / 16 }, +}, 'everness_crystal_megalith_side_4.png', 'everness_crystal_megalith_side_5.png', 'everness_crystal_megalith_side_3.png', 5) + +-- Segment 5: Summit Needle +register_glass_megalith(5, S('Glass Megalith Summit Needle'), { + { -3 / 16, -8 / 16, -3 / 16, 3 / 16, -1 / 16, 3 / 16 }, + { -2 / 16, -1 / 16, -2 / 16, 2 / 16, 4 / 16, 2 / 16 }, + { -1 / 16, 4 / 16, -1 / 16, 1 / 16, 7.5 / 16, 1 / 16 }, +}, 'everness_crystal_megalith_side_5.png', 'everness_crystal_megalith_top.png', 'everness_crystal_megalith_side_4.png', 6) + +Everness:register_node('everness:coral_burdock_1', { + description = S('Coral Burdock'), + short_description = S('Coral Burdock'), + drawtype = 'plantlike', + waving = 1, + visual_scale = 1.69, + tiles = { 'everness_coral_burdock_1.png' }, + inventory_image = 'everness_coral_burdock_1.png', + wield_image = 'everness_coral_burdock_1.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16 }, + }, + on_place = function(itemstack, placer, pointed_thing) + -- place a random burdock node + local stack = ItemStack('everness:coral_burdock_' .. math.random(1, 2)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack('everness:coral_burdock_1 ' .. itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +Everness:register_node('everness:coral_burdock_2', { + description = S('Coral Burdock'), + short_description = S('Coral Burdock'), + drawtype = 'plantlike', + waving = 1, + visual_scale = 1.69, + tiles = { 'everness_coral_burdock_2.png' }, + inventory_image = 'everness_coral_burdock_2.png', + wield_image = 'everness_coral_burdock_2.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16 }, + }, + drop = 'everness:coral_burdock_1', +}) + +Everness:register_node('everness:coral_bush', { + description = S('Coral Bush'), + short_description = S('Coral Bush'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_bush.png' }, + inventory_image = 'everness_coral_bush.png', + wield_image = 'everness_coral_bush.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 0, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + } +}) + +Everness:register_node('everness:coral_shrub', { + description = S('Coral Shrub'), + short_description = S('Coral Shrub'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_shrub.png' }, + inventory_image = 'everness_coral_shrub.png', + wield_image = 'everness_coral_shrub.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 4, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:coral_grass_orange', { + description = S('Orange Coral Grass'), + short_description = S('Orange Coral Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_grass_orange.png' }, + inventory_image = 'everness_coral_grass_orange.png', + wield_image = 'everness_coral_grass_orange.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16 }, + }, + light_source = 6 +}) + +Everness:register_node('everness:globulagus', { + description = S('Globulagus'), + short_description = S('Globulagus'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_grass_globulagus.png' }, + inventory_image = 'everness_coral_grass_globulagus.png', + wield_image = 'everness_coral_grass_globulagus.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16 }, + }, + light_source = 7 +}) + +Everness:register_node('everness:coral_grass_tall', { + description = S('Tall Coral Grass'), + short_description = S('Tall Coral Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_grass_tall.png' }, + inventory_image = 'everness_coral_grass_tall.png', + wield_image = 'everness_coral_grass_tall.png', + visual_scale = 1.69, + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16 }, + }, + light_source = 7 +}) + +Everness:register_node('everness:crystal_purple', { + description = S('Purple Crystal'), + short_description = S('Purple Crystal'), + drawtype = 'plantlike', + waving = 0, + tiles = { 'everness_crystal_purple.png' }, + inventory_image = 'everness_crystal_purple.png', + wield_image = 'everness_crystal_purple.png', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + groups = { + -- MTG + cracky = 3, + crystal_grass_under = 1, + -- MCL + handy = 1, + deco_block = 1, + -- glass = 1, + -- building_block = 1, + material_glass = 1, + -- ALL + flora = 1, + attached_node = 1, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_crystal_defaults(), + light_source = 7, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:crystal_orange', { + description = S('Orange Crystal'), + short_description = S('Orange Crystal'), + drawtype = 'plantlike', + waving = 0, + tiles = { 'everness_crystal_orange.png' }, + inventory_image = 'everness_crystal_orange.png', + wield_image = 'everness_crystal_orange.png', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + groups = { + -- MTG + cracky = 3, + crystal_grass_under = 1, + -- MCL + handy = 1, + deco_block = 1, + -- glass = 1, + -- building_block = 1, + material_glass = 1, + -- ALL + flora = 1, + attached_node = 1, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_crystal_defaults(), + light_source = 7, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:crystal_cyan', { + description = S('Cyan Crystal'), + short_description = S('Cyan Crystal'), + drawtype = 'plantlike', + waving = 0, + tiles = { 'everness_crystal_cyan.png' }, + inventory_image = 'everness_crystal_cyan.png', + wield_image = 'everness_crystal_cyan.png', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + groups = { + -- MTG + cracky = 3, + crystal_grass_under = 1, + -- MCL + handy = 1, + deco_block = 1, + -- glass = 1, + -- building_block = 1, + material_glass = 1, + -- ALL + flora = 1, + attached_node = 1, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_crystal_defaults(), + light_source = 12, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:coral_plant_bioluminescent', { + description = S('Coral Plant Bioluminescent'), + short_description = S('Coral Plant Bioluminescent'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_plant_bioluminescent.png' }, + inventory_image = 'everness_coral_plant_bioluminescent.png', + wield_image = 'everness_coral_plant_bioluminescent.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 9 +}) + +Everness:register_node('everness:blooming_cooksonia', { + description = S('Blooming Cooksonia'), + short_description = S('Blooming Cooksonia'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_blooming_cooksonia.png' }, + inventory_image = 'everness_blooming_cooksonia.png', + wield_image = 'everness_blooming_cooksonia.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + frosted_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 9 +}) + +Everness:register_node('everness:creeping_moss_spores', { + description = S('Creeping Moss Spores'), + short_description = S('Creeping Moss Spores'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_creeping_moss_spores.png' }, + inventory_image = 'everness_creeping_moss_spores.png', + wield_image = 'everness_creeping_moss_spores.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 26, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + frosted_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 9 +}) + +Everness:register_node('everness:frosted_icicle', { + description = S('Frosted Icicle'), + short_description = S('Frosted Icicle'), + drawtype = 'plantlike', + waving = 0, + tiles = { 'everness_frosted_icicle.png' }, + inventory_image = 'everness_frosted_icicle.png', + wield_image = 'everness_frosted_icicle.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = { + -- MTG + oddly_breakable_by_hand = 3, + -- MCL + handy = 1, + deco_block = 1, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_ice_defaults(), + light_source = 9 +}) + +Everness:register_node('everness:frosted_icicle_floor', { + description = S('Frosted Icicle Floor'), + short_description = S('Frosted Icicle Floor'), + drawtype = 'plantlike', + waving = 0, + tiles = { 'everness_frosted_icicle.png^[transformFY' }, + inventory_image = 'everness_frosted_icicle.png^[transformFY', + wield_image = 'everness_frosted_icicle.png^[transformFY', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 24, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = { + -- MTG + snappy = 3, + frosted_grass_under = 1, + -- MCL + handy = 1, + deco_block = 1, + -- ALL + attached_node = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_ice_defaults(), + light_source = 9, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 1, 0.5 }, + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 1, 0.5 }, + }, +}) + +Everness:register_node('everness:coral_grass_1', { + description = S('Coral Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_grass_1.png' }, + -- Use texture of a taller grass stage in inventory + inventory_image = 'everness_coral_grass_3.png', + wield_image = 'everness_coral_grass_3.png', + paramtype = 'light', + paramtype2 = 'degrotate', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 1, + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node with random rotation + local stack = ItemStack('everness:coral_grass_' .. math.random(1, 5)) + local ret = core.item_place(stack, placer, pointed_thing, math.random(0, 239)) + return ItemStack('everness:coral_grass_1 ' .. + itemstack:get_count() - (1 - ret:get_count())) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + core.swap_node(pos, { name = itemstack:get_name(), param2 = math.random(0, 239) }) + end, +}) + +for i = 2, 5 do + Everness:register_node('everness:coral_grass_' .. i, { + description = S('Coral Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_coral_grass_' .. i .. '.png' }, + inventory_image = 'everness_coral_grass_' .. i .. '.png', + wield_image = 'everness_coral_grass_' .. i .. '.png', + paramtype = 'light', + paramtype2 = 'degrotate', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:coral_grass_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + coral_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + not_in_creative_inventory = 1, + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = i, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + core.swap_node(pos, { name = itemstack:get_name(), param2 = math.random(0, 239) }) + end, + }) +end + +Everness:register_node('everness:dry_grass_1', { + description = S('Baobab Savanna Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_dry_grass_1.png' }, + inventory_image = 'everness_dry_grass_3.png', + wield_image = 'everness_dry_grass_3.png', + paramtype = 'light', + paramtype2 = 'degrotate', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + everness_dry_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + on_place = function(itemstack, placer, pointed_thing) + -- place a random dry grass node with random rotation + local stack = ItemStack('everness:dry_grass_' .. math.random(1, 4)) + local ret = core.item_place(stack, placer, pointed_thing, math.random(0, 239)) + return ItemStack('everness:dry_grass_1 ' .. + itemstack:get_count() - (1 - ret:get_count())) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + core.swap_node(pos, { name = itemstack:get_name(), param2 = math.random(0, 239) }) + end, +}) + +for i = 2, 4 do + Everness:register_node('everness:dry_grass_' .. i, { + description = S('Baobab Savanna Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_dry_grass_' .. i .. '.png' }, + inventory_image = 'everness_dry_grass_' .. i .. '.png', + wield_image = 'everness_dry_grass_' .. i .. '.png', + paramtype = 'light', + paramtype2 = 'degrotate', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + everness_dry_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + not_in_creative_inventory = 1 + }, + drop = 'everness:dry_grass_1', + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -1 / 16, 6 / 16 }, + }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + core.swap_node(pos, { name = itemstack:get_name(), param2 = math.random(0, 239) }) + end, + }) +end + +Everness:register_node('everness:red_castor_1', { + description = S('Red Castor'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_red_castor_1.png' }, + -- Use texture of a taller grass stage in inventory + inventory_image = 'everness_red_castor_3.png', + wield_image = 'everness_red_castor_3.png', + paramtype = 'light', + paramtype2 = 'degrotate', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + cursed_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 1, + damage_per_second = 1, + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node with random rotation + local stack = ItemStack('everness:red_castor_' .. math.random(1, 4)) + local ret = core.item_place(stack, placer, pointed_thing, math.random(0, 239)) + return ItemStack('everness:red_castor_1 ' .. + itemstack:get_count() - (1 - ret:get_count())) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + core.swap_node(pos, { name = itemstack:get_name(), param2 = math.random(0, 239) }) + end, +}) + +for i = 2, 4 do + Everness:register_node('everness:red_castor_' .. i, { + description = S('Red Castor'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_red_castor_' .. i .. '.png' }, + inventory_image = 'everness_red_castor_' .. i .. '.png', + wield_image = 'everness_red_castor_' .. i .. '.png', + paramtype = 'light', + paramtype2 = 'degrotate', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:red_castor_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + cursed_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + not_in_creative_inventory = 1, + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = i, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + damage_per_second = i, + after_place_node = function(pos, placer, itemstack, pointed_thing) + core.swap_node(pos, { name = itemstack:get_name(), param2 = math.random(0, 239) }) + end, + }) +end + +Everness:register_node('everness:crystal_mushrooms', { + description = S('Crystal Mushrooms') .. '\n'.. core.colorize(Everness.colors.brown, S('Hunger') .. ': 1'), + tiles = { 'everness_crystal_mushrooms.png' }, + inventory_image = 'everness_crystal_mushrooms.png', + wield_image = 'everness_crystal_mushrooms.png', + drawtype = 'plantlike', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 40, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + mushroom = 1, + food_mushroom = 1, + -- Everness + crystal_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_use = core.item_eat(1), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + light_source = 3, +}) + +Everness:register_node('everness:twisted_crystal_grass', { + description = S('Twisted Crystal Grass'), + short_description = S('Twisted Crystal Grass'), + drawtype = 'plantlike', + tiles = { 'everness_twisted_crystal_grass.png' }, + inventory_image = 'everness_twisted_crystal_grass.png', + wield_image = 'everness_twisted_crystal_grass.png', + paramtype = 'light', + paramtype2 = 'degrotate', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + crystal_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 7, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + waving = 1, + after_place_node = function(pos, placer, itemstack, pointed_thing) + core.swap_node(pos, { name = itemstack:get_name(), param2 = math.random(0, 239) }) + end, +}) + +-- Twisted Crystal Spire (2-Node Spiraling Mesh) +Everness:register_node('everness:twisted_crystal_spire', { + description = S('Twisted Crystal Spire'), + short_description = S('Twisted Crystal Spire'), + drawtype = 'mesh', + mesh = 'everness_twisted_crystal_spire.obj', + tiles = { + { + name = 'everness_twisted_crystal_spire.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 64, + length = 3.0, + }, + backface_culling = false + } + }, + inventory_image = 'everness_twisted_crystal_spire_item.png', + wield_image = 'everness_twisted_crystal_spire_item.png', + paramtype = 'light', + paramtype2 = 'degrotate', + use_texture_alpha = 'clip', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + crystal_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 8, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 1.5, 6 / 16 }, + }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + core.swap_node(pos, { name = itemstack:get_name(), param2 = math.random(0, 239) }) + end, +}) + +Everness:register_node('everness:crystal_grass_1', { + description = S('Crystal Grass'), + drawtype = 'plantlike', + tiles = { 'everness_crystal_grass_1.png' }, + -- Use texture of a taller grass stage in inventory + inventory_image = 'everness_crystal_grass_2.png', + wield_image = 'everness_crystal_grass_2.png', + paramtype = 'light', + paramtype2 = 'degrotate', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + crystal_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_thin_glass_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 1, + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node with random rotation + local stack = ItemStack('everness:crystal_grass_' .. math.random(1, 3)) + local ret = core.item_place(stack, placer, pointed_thing, math.random(0, 239)) + return ItemStack('everness:crystal_grass_1 ' .. + itemstack:get_count() - (1 - ret:get_count())) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + core.swap_node(pos, { name = itemstack:get_name(), param2 = math.random(0, 239) }) + end, +}) + +for i = 2, 3 do + Everness:register_node('everness:crystal_grass_' .. i, { + description = S('Coral Grass'), + drawtype = 'plantlike', + tiles = { 'everness_crystal_grass_' .. i .. '.png' }, + inventory_image = 'everness_crystal_grass_' .. i .. '.png', + wield_image = 'everness_crystal_grass_' .. i .. '.png', + paramtype = 'light', + paramtype2 = 'degrotate', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:crystal_grass_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + crystal_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + not_in_creative_inventory = 1, + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_thin_glass_defaults(), + light_source = i, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + core.swap_node(pos, { name = itemstack:get_name(), param2 = math.random(0, 239) }) + end, + }) +end + +Everness:register_node('everness:marsh_grass', { + description = S('Marsh Grass'), + drawtype = 'plantlike', + waving = 1, + visual_scale = 1.69, + tiles = { 'everness_marsh_grass.png' }, + inventory_image = 'everness_marsh_grass.png', + wield_image = 'everness_marsh_grass.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + cursed_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16 }, + }, +}) + +-- Forsaken desert plants + +Everness:register_node('everness:forsaken_desert_plant_1', { + description = S('Forsaken Plant'), + short_description = S('Forsaken Plant'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_forsaken_desert_plant_1.png' }, + inventory_image = 'everness_forsaken_desert_plant_1.png', + wield_image = 'everness_forsaken_desert_plant_1.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 11, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:forsaken_desert_plant_2', { + description = S('Forsaken Plant'), + short_description = S('Forsaken Plant'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_forsaken_desert_plant_2.png' }, + inventory_image = 'everness_forsaken_desert_plant_2.png', + wield_image = 'everness_forsaken_desert_plant_2.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:forsaken_desert_plant_3', { + description = S('Forsaken Plant'), + short_description = S('Forsaken Plant'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_forsaken_desert_plant_3.png' }, + inventory_image = 'everness_forsaken_desert_plant_3.png', + wield_image = 'everness_forsaken_desert_plant_3.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:cactus_blue', { + description = S('Blue Cactus'), + tiles = { + 'everness_cactus_blue_top.png', + 'everness_cactus_blue_top.png', + 'everness_cactus_blue_side.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + paramtype2 = 'facedir', + light_source = 7, + groups = { + -- MTG + choppy = 3, + -- X Farming + compost = 50, + -- MCL + handy = 1, + deco_block = 1, + dig_by_piston = 1, + plant = 1, + enderman_takable = 1, + compostability = 50 + }, + _mcl_blast_resistance = 0.4, + _mcl_hardness = 0.4, + damage_per_second = 1, + drawtype = 'nodebox', + node_box = { + type = 'fixed', + fixed = { + { -0.25, -0.5, -0.25, 0.25, 0.5, 0.25 }, + { -0.25, -0.5, -0.5, -0.25, 0.5, 0.5 }, + { 0.25, -0.5, -0.5, 0.25, 0.5, 0.5 }, + { -0.5, -0.5, -0.25, 0.5, 0.5, -0.25 }, + { -0.5, -0.5, 0.25, 0.5, 0.5, 0.25 }, + { -0.5, 0.5, -0.5, 0.5, 0.5, 0.5 } + }, + }, + collision_box = { + type = 'fixed', + fixed = { -0.19, -0.5, -0.19, 0.19, 0.39, 0.19 }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.3125, -0.5000, -0.3125, 0.3125, 0.5000, 0.3125 }, + }, + }, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node, +}) + +Everness:register_node('everness:cave_barrel_cactus', { + description = S('Cave Barrel Cactus'), + paramtype = 'light', + light_source = 7, + groups = { + -- MTG + choppy = 3, + -- X Farming + compost = 50, + -- MCL + handy = 1, + deco_block = 1, + dig_by_piston = 1, + plant = 1, + enderman_takable = 1, + compostability = 50 + }, + _mcl_blast_resistance = 0.4, + _mcl_hardness = 0.4, + drawtype = 'mesh', + mesh = 'everness_barrel_cactus.obj', + tiles = { 'everness_cave_barrel_cactus_mesh.png' }, + inventory_image = 'everness_cave_barrel_cactus_item.png', + wield_image = 'everness_cave_barrel_cactus_item.png', + is_ground_content = false, + walkable = true, + use_texture_alpha = 'clip', + sounds = Everness.node_sound_wood_defaults() +}) + +Everness:register_node('everness:venus_trap', { + description = S('Venus Trap Plant'), + paramtype = 'light', + paramtype2 = 'facedir', + groups = { + -- MTG + choppy = 3, + -- X Farming + compost = 50, + -- MCL + handy = 1, + deco_block = 1, + dig_by_piston = 1, + plant = 1, + enderman_takable = 1, + compostability = 50 + }, + _mcl_blast_resistance = 0.4, + _mcl_hardness = 0.4, + drawtype = 'mesh', + mesh = 'everness_venus_trap.obj', + tiles = { 'everness_venus_trap_mesh.png' }, + inventory_image = 'everness_venus_trap_item.png', + wield_image = 'everness_venus_trap_item.png', + is_ground_content = false, + walkable = false, + damage_per_second = 2, + use_texture_alpha = 'clip', + sounds = Everness.node_sound_leaves_defaults() +}) + +Everness:register_node('everness:illumi_root', { + description = S('Illumi Root'), + short_description = S('Illumi Root'), + drawtype = 'plantlike', + tiles = { 'everness_illumi_root.png' }, + inventory_image = 'everness_illumi_root.png', + wield_image = 'everness_illumi_root.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + light_source = 7, + visual_scale = 1.69, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, +}) + +Everness:register_node('everness:crystal_waterlily', { + description = S('Crystal Waterlily'), + drawtype = 'nodebox', + paramtype = 'light', + paramtype2 = 'facedir', + tiles = { + 'everness_crystal_lily_leaf_small.png', + 'everness_crystal_lily_leaf_small.png', + 'everness_crystal_lily_flower_small.png' + }, + inventory_image = 'everness_crystal_lily_flower_small.png', + wield_image = 'everness_crystal_lily_flower_small.png', + use_texture_alpha = 'clip', + liquids_pointable = true, + walkable = true, + buildable_to = true, + floodable = true, + groups = { + -- MTG + snappy = 3, + flower = 1, + flammable = 1, + flora = 1, + -- X Farming + compost = 65, + -- MCL + deco_block = 1, + plant = 1, + compostability = 65, + destroy_by_lava_flow = 1, + dig_immediate = 3, + dig_by_water = 1, + dig_by_piston = 1, + }, + sounds = Everness.node_sound_leaves_defaults(), + node_placement_prediction = '', + node_box = { + type = 'fixed', + fixed = { + { 0, -31 / 64, -0.5, 0, 0.5, 0.5 }, + { -0.5, -31 / 64, 0, 0.5, 0.5, 0 }, + { -0.5, -31 / 64, -0.5, 0.5, -31 / 64, 0.5 } + } + }, + selection_box = { + type = 'fixed', + fixed = { -7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16 } + }, + collision_box = { + type = 'fixed', + fixed = { -7 / 16, -0.5, -7 / 16, 7 / 16, -15 / 32, 7 / 16 } + }, + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = core.get_node(pointed_thing.under) + local def = core.registered_nodes[node.name] + + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, itemstack, pointed_thing) + end + + if def and def.liquidtype == 'source' and + core.get_item_group(node.name, 'water') > 0 + then + local player_name = placer and placer:get_player_name() or '' + + if not core.is_protected(pos, player_name) then + core.set_node(pos, { name = 'everness:crystal_waterlily' }) + + if not core.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + core.chat_send_player(player_name, 'Node is protected') + core.record_protection_violation(pos, player_name) + end + end + + return itemstack + end +}) + +-- Forsaken Tundra Plants + +Everness:register_node('everness:cactus_orange', { + description = S('Orange Cactus'), + tiles = { + 'everness_cactus_top.png', + 'everness_cactus_top.png', + 'everness_cactus_side.png' + }, + use_texture_alpha = 'clip', + paramtype = 'light', + paramtype2 = 'facedir', + light_source = 4, + groups = { + -- MTG + choppy = 3, + -- X Farming + compost = 50, + -- MCL + handy = 1, + deco_block = 1, + dig_by_piston = 1, + plant = 1, + enderman_takable = 1, + compostability = 50 + }, + _mcl_blast_resistance = 0.4, + _mcl_hardness = 0.4, + damage_per_second = 1, + drawtype = 'nodebox', + node_box = { + type = 'fixed', + fixed = { + { -0.25, -0.5, -0.25, 0.25, 0.5, 0.25 }, + { -0.25, -0.5, -0.5, -0.25, 0.5, 0.5 }, + { 0.25, -0.5, -0.5, 0.25, 0.5, 0.5 }, + { -0.5, -0.5, -0.25, 0.5, 0.5, -0.25 }, + { -0.5, -0.5, 0.25, 0.5, 0.5, 0.25 }, + { -0.5, 0.5, -0.5, 0.5, 0.5, 0.5 } + }, + }, + collision_box = { + type = 'fixed', + fixed = { -0.19, -0.5, -0.19, 0.19, 0.39, 0.19 }, + }, + selection_box = { + type = 'fixed', + fixed = { + { -0.3125, -0.5000, -0.3125, 0.3125, 0.5000, 0.3125 }, + }, + }, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node, +}) + +Everness:register_node('everness:agave_leaf_1', { + description = S('Agave Leaf'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_agave_leaf_1.png' }, + -- Use texture of a taller grass stage in inventory + inventory_image = 'everness_agave_leaf_2.png', + wield_image = 'everness_agave_leaf_2.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + forsaken_tundra_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 5, + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack('everness:agave_leaf_' .. math.random(1, 3)) + local ret = core.item_place(stack, placer, pointed_thing) + return ItemStack('everness:agave_leaf_1 ' .. + itemstack:get_count() - (1 - ret:get_count())) + end, +}) + +for i = 2, 3 do + Everness:register_node('everness:agave_leaf_' .. i, { + description = S('Agave Leaf'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_agave_leaf_' .. i .. '.png' }, + inventory_image = 'everness_agave_leaf_' .. i .. '.png', + wield_image = 'everness_agave_leaf_' .. i .. '.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = 'everness:agave_leaf_1', + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + forsaken_tundra_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + not_in_creative_inventory = 1, + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 4 + i, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16 }, + }, + }) +end + +-- Mese Fruit + +Everness:register_node('everness:mese_tree_fruit', { + description = S('Mese Fruit'), + drawtype = 'nodebox', + tiles = { + 'everness_mese_tree_fruit_top.png', + 'everness_mese_tree_fruit_top.png', + 'everness_mese_tree_fruit_side.png', + }, + use_texture_alpha = 'clip', + inventory_image = 'everness_mese_tree_fruit_item.png', + wield_image = 'everness_mese_tree_fruit_item.png', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + buildable_to = false, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + leafdecay_drop = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + -- attached_node = 1, + flammable = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + sounds = Everness.node_sound_leaves_defaults(), + node_box = { + type = 'fixed', + fixed = { + -- bottom + { -8 / 16, -7 / 16, -8 / 16, 8 / 16, -7 / 16, 8 / 16 }, + -- body (middle) + { -4 / 16, -8 / 16, -4 / 16, 4 / 16, -1 / 16, 4 / 16 }, + -- top + { -3 / 16, -1 / 16, -3 / 16, 3 / 16, 0, 3 / 16 } + } + }, + selection_box = { + type = 'fixed', + fixed = { -8 / 16, -8 / 16, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, + }, + light_source = 14, + after_place_node = function(pos, placer, itemstack, pointed_thing) + core.get_meta(pos):set_int('everness_prevent_leafdecay', 1) + end +}) + +Everness:register_node('everness:mese_tree_sapling', { + description = S('Mese Tree Sapling'), + short_description = S('Mese Tree Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_mese_tree_sapling.png' }, + inventory_image = 'everness_mese_tree_sapling.png', + wield_image = 'everness_mese_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:mese_tree_sapling', + minp_relative = { x = -3, y = 1, z = -3 }, + maxp_relative = { x = 3, y = 11, z = 3 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:palm_tree_sapling', { + description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Sapling'), + short_description = S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_palm_tree_sapling.png' }, + inventory_image = 'everness_palm_tree_sapling.png', + wield_image = 'everness_palm_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 4 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos) + Everness.grow_sapling(pos, { 'sand', 'everness_sand' }) + end, + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:palm_tree_sapling', + minp_relative = { x = -7, y = 1, z = -7 }, + maxp_relative = { x = 7, y = 13, z = 7 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +-- Cursed Lands Plants + +Everness:register_node('everness:egg_plant', { + description = S('Egg plant'), + drawtype = 'nodebox', + tiles = { + 'everness_egg_plant_top.png', + 'everness_egg_plant_bottom.png', + 'everness_egg_plant_side.png', + }, + use_texture_alpha = 'clip', + -- Use texture of a taller grass stage in inventory + inventory_image = 'everness_egg_plant_item.png', + wield_image = 'everness_egg_plant_item.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + cursed_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + node_box = { + type = 'fixed', + fixed = { + { -0.5, -0.4375, -0.5, 0.5, -0.4375, 0.5 }, + { -0.25, -0.5, -0.25, 0.25, -0.06250, 0.25 }, + { -0.1875, -0.06250, -0.1875, 0.1875, 0, 0.1875 } + } + }, + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 8, + damage_per_second = 1, + move_resistance = 7, +}) + +Everness:register_node('everness:ivis_moss', { + description = S('Ivis Moss'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_ivis_moss.png' }, + inventory_image = 'everness_ivis_moss.png', + wield_image = 'everness_ivis_moss.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + cursed_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 7, + paramtype2 = 'degrotate', + after_place_node = function(pos, placer, itemstack, pointed_thing) + core.swap_node(pos, { name = itemstack:get_name(), param2 = math.random(0, 239) }) + end, +}) + +Everness:register_node('everness:ngrass_1', { + description = S('Ngrass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_ngrass_1.png' }, + inventory_image = 'everness_ngrass_1.png', + wield_image = 'everness_ngrass_1.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + cursed_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 5, +}) + +Everness:register_node('everness:ngrass_2', { + description = S('Ngrass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_ngrass_2.png' }, + inventory_image = 'everness_ngrass_2.png', + wield_image = 'everness_ngrass_2.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + cursed_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16 }, + }, + light_source = 6 +}) + +-- Bamboo + +-- small bamboo +Everness:register_node('everness:bamboo_1', { + description = S('Bamboo'), + -- +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_bamboo_small_top.png', + 'everness_bamboo_small_top.png^[transformFY', + 'everness_bamboo_small_1.png^[transformFX', + 'everness_bamboo_small_1.png', + 'everness_bamboo_small_1.png', + 'everness_bamboo_small_1.png^[transformFX' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'colorfacedir', + palette = 'everness_bamboo_palette.png', + node_box = { + type = 'fixed', + -- offset 4, size 2x2 + fixed = { + { -0.2500, -0.5000, -0.2500, -0.1250, 0.5000, -0.1250 }, + { -0.1875, -0.5000, -0.5000, -0.1875, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.1875, 0.5000, 0.5000, -0.1875 } + }, + }, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/30 chance + items = { 'everness:bamboo_sprout' }, + rarity = 30, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:bamboo_item' }, + } + } + }, + groups = { + -- MTG + snappy = 3, + bamboo = 1, + bamboo_small = 1, + bamboo_grass = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + axey = 1, + choppy = 1, + dig_by_piston = 1, + plant = 1, + non_mycelium_plant = 1, + -- ALL + flammable = 2 + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1.5, + selection_box = { + type = 'fixed', + fixed = { -0.3125, -0.5000, -0.3125, -0.06250, 0.5000, -0.06250 }, + }, + collision_box = { + type = 'fixed', + fixed = { -0.2500, -0.5000, -0.2500, -0.1250, 0.5000, -0.1250 } + }, + sounds = Everness.node_sound_bamboo_defaults(), + after_place_node = function(...) + Everness:place_bamboo(...) + end, + after_dig_node = function(...) + Everness:dig_up_bamboo(...) + end, + on_timer = function(...) + Everness:grow_bamboo(...) + end, +}) + +Everness:register_node('everness:bamboo_2', { + description = S('Bamboo'), + -- +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_bamboo_small_top.png', + 'everness_bamboo_small_top.png^[transformFY', + 'everness_bamboo_small_2.png^[transformFX', + 'everness_bamboo_small_2.png', + 'everness_bamboo_small_2.png', + 'everness_bamboo_small_2.png^[transformFX' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'colorfacedir', + palette = 'everness_bamboo_palette.png', + node_box = { + type = 'fixed', + -- offset 4, size 2x2 + fixed = { + { -0.2500, -0.5000, -0.2500, -0.1250, 0.5000, -0.1250 }, + { -0.1875, -0.5000, -0.5000, -0.1875, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.1875, 0.5000, 0.5000, -0.1875 } + }, + }, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/30 chance + items = { 'everness:bamboo_sprout' }, + rarity = 30, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:bamboo_item' }, + } + } + }, + groups = { + -- MTG + snappy = 3, + bamboo = 1, + bamboo_small = 1, + bamboo_grass = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + axey = 1, + choppy = 1, + dig_by_piston = 1, + plant = 1, + non_mycelium_plant = 1, + -- ALL + flammable = 2 + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1.5, + selection_box = { + type = 'fixed', + fixed = { -0.3125, -0.5000, -0.3125, -0.06250, 0.5000, -0.06250 }, + }, + collision_box = { + type = 'fixed', + fixed = { -0.2500, -0.5000, -0.2500, -0.1250, 0.5000, -0.1250 } + }, + sounds = Everness.node_sound_bamboo_defaults(), + after_place_node = function(...) + Everness:place_bamboo(...) + end, + after_dig_node = function(...) + Everness:dig_up_bamboo(...) + end, + on_timer = function(...) + Everness:grow_bamboo(...) + end, +}) + +-- large bamboo + +Everness:register_node('everness:bamboo_3', { + description = S('Bamboo'), + -- +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_bamboo_large_top.png', + 'everness_bamboo_large_bottom.png^[transformFY', + 'everness_bamboo_large_1.png^[transformFX', + 'everness_bamboo_large_1.png', + 'everness_bamboo_large_1.png', + 'everness_bamboo_large_1.png^[transformFX' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'colorfacedir', + palette = 'everness_bamboo_palette.png', + node_box = { + type = 'fixed', + -- offset 4, size 4x4 + fixed = { + { -0.2500, -0.5000, -0.2500, 0.000, 0.5000, 0.000 }, + { -0.1250, -0.5000, -0.5000, -0.1250, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.1250, 0.5000, 0.5000, -0.1250 } + } + }, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:bamboo_sprout' }, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:bamboo_item' }, + } + } + }, + groups = { + -- MTG + snappy = 3, + bamboo = 1, + bamboo_large = 1, + bamboo_grass = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + axey = 1, + choppy = 1, + dig_by_piston = 1, + plant = 1, + non_mycelium_plant = 1, + -- ALL + flammable = 2 + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1.5, + selection_box = { + type = 'fixed', + fixed = { -0.3125, -0.5000, -0.3125, 0.06250, 0.5000, 0.06250 }, + }, + sounds = Everness.node_sound_bamboo_defaults(), + after_place_node = function(...) + Everness:place_bamboo(...) + end, + after_dig_node = function(...) + Everness:dig_up_bamboo(...) + end, + on_timer = function(...) + Everness:grow_bamboo(...) + end, +}) + +Everness:register_node('everness:bamboo_4', { + description = S('Bamboo'), + -- +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_bamboo_large_top.png', + 'everness_bamboo_large_bottom.png^[transformFY', + 'everness_bamboo_large_2.png^[transformFX', + 'everness_bamboo_large_2.png', + 'everness_bamboo_large_2.png', + 'everness_bamboo_large_2.png^[transformFX' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'colorfacedir', + palette = 'everness_bamboo_palette.png', + node_box = { + type = 'fixed', + -- offset 4, size 4x4 + fixed = { + { -0.2500, -0.5000, -0.2500, 0.000, 0.5000, 0.000 }, + { -0.1250, -0.5000, -0.5000, -0.1250, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.1250, 0.5000, 0.5000, -0.1250 } + } + }, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:bamboo_sprout' }, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:bamboo_item' }, + } + } + }, + groups = { + -- MTG + snappy = 3, + bamboo = 1, + bamboo_large = 1, + bamboo_grass = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + axey = 1, + choppy = 1, + dig_by_piston = 1, + plant = 1, + non_mycelium_plant = 1, + -- ALL + flammable = 2 + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1.5, + selection_box = { + type = 'fixed', + fixed = { -0.3125, -0.5000, -0.3125, 0.06250, 0.5000, 0.06250 }, + }, + sounds = Everness.node_sound_bamboo_defaults(), + after_place_node = function(...) + Everness:place_bamboo(...) + end, + after_dig_node = function(...) + Everness:dig_up_bamboo(...) + end, + on_timer = function(...) + Everness:grow_bamboo(...) + end, +}) + +Everness:register_node('everness:bamboo_5', { + description = S('Bamboo'), + -- +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_bamboo_large_top.png', + 'everness_bamboo_large_bottom.png^[transformFY', + 'everness_bamboo_large_3.png^[transformFX', + 'everness_bamboo_large_3.png', + 'everness_bamboo_large_3.png', + 'everness_bamboo_large_3.png^[transformFX' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'colorfacedir', + palette = 'everness_bamboo_palette.png', + node_box = { + type = 'fixed', + -- offset 4, size 4x4 + fixed = { + { -0.2500, -0.5000, -0.2500, 0.000, 0.5000, 0.000 }, + { -0.1250, -0.5000, -0.5000, -0.1250, 0.5000, 0.5000 }, + { -0.5000, -0.5000, -0.1250, 0.5000, 0.5000, -0.1250 } + } + }, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = { 'everness:bamboo_sprout' }, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:bamboo_item' }, + } + } + }, + groups = { + -- MTG + snappy = 3, + bamboo = 1, + bamboo_large = 1, + bamboo_grass = 1, + not_in_creative_inventory = 1, + -- MCL + handy = 1, + axey = 1, + choppy = 1, + dig_by_piston = 1, + plant = 1, + non_mycelium_plant = 1, + -- ALL + flammable = 2 + }, + _mcl_blast_resistance = 1, + _mcl_hardness = 1.5, + selection_box = { + type = 'fixed', + fixed = { -0.3125, -0.5000, -0.3125, 0.06250, 0.5000, 0.06250 }, + }, + sounds = Everness.node_sound_bamboo_defaults(), + after_place_node = function(...) + Everness:place_bamboo(...) + end, + after_dig_node = function(...) + Everness:dig_up_bamboo(...) + end, + on_timer = function(...) + Everness:grow_bamboo(...) + end, +}) + +Everness:register_node('everness:bamboo_sprout', { + description = S('Bamboo Sprout'), + tiles = { 'everness_bamboo_sprout.png' }, + inventory_image = 'everness_bamboo_sprout.png', + wield_image = 'everness_bamboo_sprout.png', + drawtype = 'plantlike', + groups = { + -- MTG + seed = 1, + snappy = 3, + flammable = 2, + -- Everness + bamboo = 1, + bamboo_grass = 1, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + paramtype = 'light', + paramtype2 = 'meshoptions', + walkable = false, + sunlight_propagates = true, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, -5 / 16, 0.5 }, + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + Everness:tick_bamboo_again(pos) + end, + on_timer = function(...) + Everness:grow_bamboo(...) + end, +}) + +Everness:register_node('everness:coconut', { + description = S('Coconut'), + -- +Y, -Y, +X, -X, +Z, -Z + tiles = { + 'everness_coconut_top.png', + 'everness_coconut_bottom.png^[transformFY', + 'everness_coconut_side.png^[transformFX', + 'everness_coconut_side.png', + 'everness_coconut_side_z.png', + 'everness_coconut_side_z.png^[transformFX' + }, + use_texture_alpha = 'clip', + drawtype = 'nodebox', + paramtype = 'light', + sunlight_propagates = true, + paramtype2 = 'facedir', + node_box = { + type = 'fixed', + fixed = { + { -0.25, -0.5, -0.5, 0.25, 0, 0 } + } + }, + selection_box = { + type = 'fixed', + fixed = { + { + -4 / 16 - 1 / 16, + - 8 / 16 - 1 / 16, + -8 / 16 - 1 / 16, + 4 / 16 + 1 / 16, + 0 + 1 / 16, + 0 + 1 / 16 + }, + }, + }, + collision_box = { + type = 'fixed', + fixed = { -4 / 16, - 8 / 16, -8 / 16, 4 / 16, 0, 0 }, + }, + drop = { + max_items = 1, -- Maximum number of items to drop. + items = { -- Choose max_items randomly from this list. + { + items = { 'everness:coconut_fruit' }, -- Items to drop. + rarity = 1, -- Probability of dropping is 1 / rarity. + } + }, + }, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_wood_defaults() +}) + +-- Forsaken Tundra Plants + +Everness:register_node('everness:bloodspore_plant', { + description = S('Blood Spoore Plant'), + short_description = S('Blood Spoore Plant'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_bloodspore_plant.png' }, + inventory_image = 'everness_bloodspore_plant.png', + wield_image = 'everness_bloodspore_plant.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + forsaken_tundra_grass = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 7 +}) + +Everness:register_node('everness:bloodspore_plant_small', { + description = S('Blood Spoore Plant Small'), + short_description = S('Blood Spoore Plant Small'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_bloodspore_plant_small.png' }, + inventory_image = 'everness_bloodspore_plant_small.png', + wield_image = 'everness_bloodspore_plant_small.png', + paramtype = 'light', + paramtype2 = 'meshoptions', + place_param2 = 8, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + normal_grass = 1, + -- Everness + forsaken_tundra_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 3, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 7 +}) + +Everness:register_node('everness:termite_block', { + description = S('Termite Block'), + tiles = { 'everness_termite_block.png' }, + drawtype = 'glasslike', + paramtype = 'light', + move_resistance = 7, + drowning = 2, + walkable = false, + climbable = false, + post_effect_color = { r = 47, g = 28, b = 18, a = 255 }, + damage_per_second = 1, + groups = { + -- MTG + crumbly = 3, + disable_jump = 1, + -- MCL + handy = 1, + shovely = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), +}) + +Everness:register_node('everness:bamboo_block', { + description = S('Bamboo Block'), + tiles = { + 'everness_bamboo_block_top.png', + 'everness_bamboo_block_top.png', + 'everness_bamboo_block_side.png' + }, + paramtype2 = 'facedir', + groups = { + -- MTG + choppy = 3, + -- MCL + handy = 1, + axey = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_bamboo_defaults({ + dug = { name = 'everness_bamboo_hit', gain = 1.25 } + }), + on_place = core.rotate_node, +}) + +Everness:register_node('everness:bamboo_dry_block', { + description = S('Bamboo Block'), + tiles = { + 'everness_dry_bamboo_block_top.png', + 'everness_dry_bamboo_block_top.png', + 'everness_dry_bamboo_block_side.png' + }, + paramtype2 = 'facedir', + groups = { + -- MTG + choppy = 3, + -- MCL + handy = 1, + axey = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_bamboo_defaults({ + dug = { name = 'everness_bamboo_hit', gain = 1.25 } + }), + on_place = core.rotate_node, +}) + +Everness:register_node('everness:bamboo_wood', { + description = S('Bamboo Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_dry_bamboo_block_side.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + fire_encouragement = 5, + fire_flammability = 20, + building_block = 1, + material_wood = 1, + -- ALL + flammable = 2, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:bamboo_mosaic_wood', { + description = S('Bamboo Mosaic'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_bamboo_mosaic.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 2, + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 2, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:baobab_wood', { + description = S('Baobab Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_baobab_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:sequoia_wood', { + description = S('Sequoia Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_sequoia_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:mese_wood', { + description = S('Mese Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { 'everness_mese_wood.png' }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +-- +-- Corals +-- + +local function coral_on_place(itemstack, placer, pointed_thing, params) + if pointed_thing.type ~= 'node' or not placer then + return itemstack + end + + local _params = params or {} + local ignore_water = _params.ignore_water or false + local node_under_name = _params.node_under_name or 'everness:coral_skeleton' + local player_name = placer:get_player_name() + local pos_under = pointed_thing.under + local pos_above = pointed_thing.above + local node_under = core.get_node(pos_under) + local def_under = core.registered_nodes[node_under.name] + + if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then + return def_under.on_rightclick(pos_under, node_under, + placer, itemstack, pointed_thing) or itemstack + end + + if node_under.name ~= node_under_name + or (core.get_item_group(core.get_node(pos_above).name, 'water') == 0 and not ignore_water) + then + return itemstack + end + + if core.is_protected(pos_under, player_name) or + core.is_protected(pos_above, player_name) then + + Everness.log_player_action(placer, + 'tried to place', itemstack:get_name(), + 'at protected position', pos_under) + + core.record_protection_violation(pos_under, player_name) + return itemstack + end + + node_under.name = itemstack:get_name() + core.set_node(pos_under, { name = node_under.name, param2 = _params.param2 or node_under.param2}) + if not core.is_creative_enabled(player_name) then + itemstack:take_item() + end + + return itemstack +end + +Everness:register_node('everness:coral_corals', { + description = S('Coral Corals'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + tiles = { 'everness_coral_skeleton.png' }, + special_tiles = { { name = 'everness_coral_corals.png', tileable_vertical = true } }, + inventory_image = 'everness_coral_corals.png', + wield_image = 'everness_coral_corals.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_skeleton', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = coral_on_place, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:coral_skeleton' }) + end, +}) + +Everness:register_node('everness:coral_jellyfish', { + description = S('Coral Corals'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + tiles = { 'everness_coral_skeleton.png' }, + special_tiles = { { name = 'everness_coral_jellyfish.png', tileable_vertical = true } }, + inventory_image = 'everness_coral_jellyfish.png', + wield_image = 'everness_coral_jellyfish.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_skeleton', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = coral_on_place, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:coral_skeleton' }) + end, +}) + +Everness:register_node('everness:coral_frosted', { + description = S('Coral Frosted'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + tiles = { 'everness_coral_skeleton.png' }, + special_tiles = { { name = 'everness_frosted_coral.png', tileable_vertical = true } }, + inventory_image = 'everness_frosted_coral.png', + wield_image = 'everness_frosted_coral.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_skeleton', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = coral_on_place, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:coral_skeleton' }) + end, +}) + +Everness:register_node('everness:coral_starfish', { + description = S('Coral Starfish'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + tiles = { 'everness_coral_skeleton.png' }, + special_tiles = { { name = 'everness_starfish.png', tileable_vertical = true } }, + inventory_image = 'everness_starfish.png', + wield_image = 'everness_starfish.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_skeleton', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = coral_on_place, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:coral_skeleton' }) + end, +}) + +Everness:register_node('everness:sand_with_spine_kelp', { + description = S('Spine Kelp'), + drawtype = 'plantlike_rooted', + waving = 1, + tiles = { 'everness_cursed_stone.png' }, + special_tiles = { { name = 'everness_spine_kelp.png', tileable_vertical = true } }, + inventory_image = 'everness_spine_kelp.png', + wield_image = 'everness_spine_kelp.png', + paramtype = 'light', + paramtype2 = 'leveled', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -2 / 16, 0.5, -2 / 16, 2 / 16, 3.5, 2 / 16 }, + }, + }, + node_dig_prediction = 'everness:cursed_stone', + node_placement_prediction = '', + sounds = Everness.node_sound_sand_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + + on_place = function(itemstack, placer, pointed_thing) + -- Call on_rightclick if the pointed node defines it + if pointed_thing.type == 'node' and placer and + not placer:get_player_control().sneak then + local node_ptu = core.get_node(pointed_thing.under) + local def_ptu = core.registered_nodes[node_ptu.name] + if def_ptu and def_ptu.on_rightclick then + return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer, + itemstack, pointed_thing) + end + end + + local pos = pointed_thing.under + if core.get_node(pos).name ~= 'everness:cursed_stone' then + return itemstack + end + + local height = math.random(4, 6) + local pos_top = { x = pos.x, y = pos.y + height, z = pos.z } + local node_top = core.get_node(pos_top) + local def_top = core.registered_nodes[node_top.name] + local player_name = placer:get_player_name() + + if def_top and def_top.liquidtype == 'source' and + core.get_item_group(node_top.name, 'water') > 0 then + if not core.is_protected(pos, player_name) and + not core.is_protected(pos_top, player_name) then + core.set_node(pos, { name = 'everness:sand_with_spine_kelp', + param2 = height * 16 }) + if not core.is_creative_enabled(player_name) then + itemstack:take_item() + end + else + core.chat_send_player(player_name, 'Node is protected') + core.record_protection_violation(pos, player_name) + end + end + + return itemstack + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:cursed_stone' }) + end +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_plant_1', { + description = S('Coral Bulbs'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_deep_ocean_coral_plant_1.png', tileable_vertical = true } }, + inventory_image = 'everness_deep_ocean_coral_plant_1.png', + wield_image = 'everness_deep_ocean_coral_plant_1.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_forest_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + return coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:coral_forest_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:coral_forest_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_plant_2', { + description = S('Coral Tree'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_deep_ocean_coral_plant_2.png', tileable_vertical = true } }, + inventory_image = 'everness_deep_ocean_coral_plant_2.png', + wield_image = 'everness_deep_ocean_coral_plant_2.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_forest_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + return coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:coral_forest_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:coral_forest_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_plant_3', { + description = S('Coral Palm'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_deep_ocean_coral_plant_3.png', tileable_vertical = true } }, + inventory_image = 'everness_deep_ocean_coral_plant_3.png', + wield_image = 'everness_deep_ocean_coral_plant_3.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:coral_forest_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + return coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:coral_forest_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:coral_forest_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_coral_plant_anemone', { + description = S('Coral Anemone'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_cursed_lands_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_cursed_lands_deep_ocean_coral_anemone.png', tileable_vertical = true } }, + inventory_image = 'everness_cursed_lands_deep_ocean_coral_anemone.png', + wield_image = 'everness_cursed_lands_deep_ocean_coral_anemone.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:cursed_lands_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + return coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:cursed_lands_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:cursed_lands_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_coral_plant_darkilluma', { + description = S('Coral Darkilluma'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_cursed_lands_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_cursed_lands_deep_ocean_coral_darkilluma.png', tileable_vertical = true } }, + inventory_image = 'everness_cursed_lands_deep_ocean_coral_darkilluma.png', + wield_image = 'everness_cursed_lands_deep_ocean_coral_darkilluma.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:cursed_lands_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + return coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:cursed_lands_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:cursed_lands_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_coral_plant_demon', { + description = S('Coral Demon'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_cursed_lands_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_cursed_lands_deep_ocean_coral_demon.png', tileable_vertical = true } }, + inventory_image = 'everness_cursed_lands_deep_ocean_coral_demon.png', + wield_image = 'everness_cursed_lands_deep_ocean_coral_demon.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:cursed_lands_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + return coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:cursed_lands_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:cursed_lands_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_coral_plant_1', { + description = S('Crystal Forest Deep Ocean Coral Plant Cyan'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_crystal_forest_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_crystal_forest_deep_ocean_coral_plant_1.png', tileable_vertical = true } }, + inventory_image = 'everness_crystal_forest_deep_ocean_coral_plant_1.png', + wield_image = 'everness_crystal_forest_deep_ocean_coral_plant_1.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:crystal_forest_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + return coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:crystal_forest_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:crystal_forest_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_coral_plant_2', { + description = S('Crystal Forest Deep Ocean Coral Plant Orange'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_crystal_forest_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_crystal_forest_deep_ocean_coral_plant_2.png', tileable_vertical = true } }, + inventory_image = 'everness_crystal_forest_deep_ocean_coral_plant_2.png', + wield_image = 'everness_crystal_forest_deep_ocean_coral_plant_2.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:crystal_forest_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + return coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:crystal_forest_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:crystal_forest_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_coral_plant_3', { + description = S('Crystal Forest Deep Ocean Coral Plant Pink'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 12, + tiles = { 'everness_crystal_forest_deep_ocean_sand.png' }, + special_tiles = { { name = 'everness_crystal_forest_deep_ocean_coral_plant_3.png', tileable_vertical = true } }, + inventory_image = 'everness_crystal_forest_deep_ocean_coral_plant_3.png', + wield_image = 'everness_crystal_forest_deep_ocean_coral_plant_3.png', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1, + coral = 1, + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -4 / 16, 0.5, -4 / 16, 4 / 16, 1.5, 4 / 16 }, + }, + }, + node_dig_prediction = 'everness:crystal_forest_deep_ocean_sand', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + return coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:crystal_forest_deep_ocean_sand' + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:crystal_forest_deep_ocean_sand' }) + end, +}) + +Everness:register_node('everness:crystal_coral_dark', { + description = S('Crystal Coral Dark'), + tiles = { 'everness_crystal_coral_dark_block.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_coral_light', { + description = S('Crystal Coral Light'), + tiles = { 'everness_crystal_coral_light_block.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_1', { + description = S('Coral Forest Deep Ocean Coral Pink'), + tiles = { 'everness_deep_ocean_coral_1.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_coral_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_2', { + description = S('Coral Forest Deep Ocean Coral Cyan'), + tiles = { 'everness_deep_ocean_coral_2.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_coral_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_3', { + description = S('Coral Forest Deep Ocean Coral Green'), + tiles = { 'everness_deep_ocean_coral_3.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_coral_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_forest_deep_ocean_coral_4', { + description = S('Coral Forest Deep Ocean Coral Red'), + tiles = { 'everness_deep_ocean_coral_4.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_coral_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_coral_alcyonacea', { + description = S('Coral Alcyonacea'), + tiles = { 'everness_cursed_lands_deep_ocean_coral_alcyonacea.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_cursed_lands_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_coral_ostracod', { + description = S('Coral Ostracod'), + tiles = { 'everness_cursed_lands_deep_ocean_coral_ostracod.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_cursed_lands_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_lands_deep_ocean_coral_octocurse', { + description = S('Coral Octocurse'), + tiles = { 'everness_cursed_lands_deep_ocean_coral_octocurse.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_cursed_lands_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_coral_1', { + description = S('Crystal Forest Deep Ocean Coral Green'), + tiles = { 'everness_crystal_forest_deep_ocean_coral_1.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_crystal_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_coral_2', { + description = S('Crystal Forest Deep Ocean Coral Orange'), + tiles = { 'everness_crystal_forest_deep_ocean_coral_2.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_crystal_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:crystal_forest_deep_ocean_coral_3', { + description = S('Crystal Forest Deep Ocean Coral Cyan'), + tiles = { 'everness_crystal_forest_deep_ocean_coral_3.png' }, + groups = { + -- MTG + cracky = 3, + -- Everness + everness_crystal_forest_deep_ocean_coral = 1, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:coral_skeleton', { + description = S('Coral Skeleton'), + tiles = { 'everness_coral_skeleton.png' }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + coral = 1, + }, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 6, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_water_weed_1', { + description = S('Mineral Water Weed'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + tiles = { 'everness_mineral_stone.png^[sheet:2x2:1,1' }, + special_tiles = { { name = 'everness_mineral_water_weed_1.png', tileable_vertical = true } }, + inventory_image = 'everness_mineral_water_weed_1.png', + wield_image = 'everness_mineral_water_weed_1.png', + paramtype2 = 'wallmounted', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1 + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -1 / 2 + 1 / 16, 0.5, -1 / 2 + 1 / 16, 1 / 2 - 1 / 16, 1, 1 / 2 - 1 / 16 } + }, + }, + node_dig_prediction = 'everness:mineral_stone', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + local fdir = placer and core.dir_to_wallmounted(placer:get_look_dir()) or 0 + + return coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:mineral_stone', + param2 = fdir + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:mineral_stone' }) + end, +}) + +Everness:register_node('everness:mineral_water_weed_2', { + description = S('Mineral Water Weed'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + tiles = { 'everness_mineral_stone.png^[sheet:2x2:1,1' }, + special_tiles = { { name = 'everness_mineral_water_weed_2.png', tileable_vertical = true } }, + inventory_image = 'everness_mineral_water_weed_2.png', + wield_image = 'everness_mineral_water_weed_2.png', + paramtype2 = 'wallmounted', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1 + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -1 / 2 + 1 / 16, 0.5, -1 / 2 + 1 / 16, 1 / 2 - 1 / 16, 1, 1 / 2 - 1 / 16 } + }, + }, + node_dig_prediction = 'everness:mineral_stone', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + local fdir = placer and core.dir_to_wallmounted(placer:get_look_dir()) or 0 + + return coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:mineral_stone', + param2 = fdir + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:mineral_stone' }) + end, +}) + +Everness:register_node('everness:mineral_water_weed_3', { + description = S('Mineral Water Weed'), + drawtype = 'plantlike_rooted', + waving = 1, + paramtype = 'light', + light_source = 7, + tiles = { 'everness_mineral_stone.png^[sheet:2x2:1,1' }, + special_tiles = { { name = 'everness_mineral_water_weed_3.png', tileable_vertical = true } }, + inventory_image = 'everness_mineral_water_weed_3.png', + wield_image = 'everness_mineral_water_weed_3.png', + paramtype2 = 'wallmounted', + groups = { + -- MTG + snappy = 3, + -- MCL + dig_immediate = 3, + deco_block = 1 + }, + _mcl_hardness = 0, + _mcl_blast_resistance = 0, + _mcl_silk_touch_drop = true, + selection_box = { + type = 'fixed', + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + { -1 / 2 + 1 / 16, 0.5, -1 / 2 + 1 / 16, 1 / 2 - 1 / 16, 1, 1 / 2 - 1 / 16 } + }, + }, + node_dig_prediction = 'everness:mineral_stone', + node_placement_prediction = '', + sounds = Everness.node_sound_stone_defaults({ + dig = { name = 'everness_plant_hit', gain = 0.2 }, + dug = { name = 'everness_grass_footstep', gain = 0.25 }, + }), + on_place = function(itemstack, placer, pointed_thing) + local fdir = placer and core.dir_to_wallmounted(placer:get_look_dir()) or 0 + + return coral_on_place( + itemstack, + placer, + pointed_thing, + { + ignore_water = true, + node_under_name = 'everness:mineral_stone', + param2 = fdir + } + ) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + core.set_node(pos, { name = 'everness:mineral_stone' }) + end, +}) + +-- +-- Meshes +-- + +-- Skull with candle + +Everness:register_node('everness:skull_with_candle', { + description = S('Skull with Candle'), + short_description = S('Skull with Candle'), + drawtype = 'mesh', + mesh = 'everness_skull_with_candle.obj', + tiles = { + { + name = 'everness_candle_flame_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 8, + aspect_h = 8, + length = 2 + }, + backface_culling = false + }, + }, + inventory_image = 'everness_scull_with_candle_inventory.png', + wield_image = 'everness_scull_with_candle_inventory.png', + paramtype = 'light', + paramtype2 = 'facedir', + is_ground_content = false, + walkable = true, + selection_box = { + type = 'fixed', + fixed = { -1 / 2 + 3 / 16, -1 / 2, -1 / 2 + 3 / 16, 1 / 2 - 3 / 16, 1 / 2, 1 / 2 - 3 / 16 } + }, + collision_box = { + type = 'fixed', + fixed = { -1 / 2 + 3 / 16, -1 / 2, -1 / 2 + 3 / 16, 1 / 2 - 3 / 16, 0.1, 1 / 2 - 3 / 16 } + }, + groups = { + -- MTG + choppy = 2, + dig_immediate = 3, + torch = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + attached_node = 1 + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + sunlight_propagates = true, + light_source = 12, + liquids_pointable = false, + use_texture_alpha = 'clip', +}) + +-- Forsythia Bush + +Everness:register_node('everness:forsythia_bush', { + description = S('Forsythia Bush'), + short_description = S('Forsythia Bush'), + drawtype = 'mesh', + mesh = 'everness_forsythia_mesh.obj', + tiles = { 'everness_forsythia_mesh.png' }, + inventory_image = 'everness_forsythia_item.png', + wield_image = 'everness_forsythia_item.png', + paramtype = 'light', + is_ground_content = false, + walkable = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + use_texture_alpha = 'clip', +}) + +-- Rose Bush + +Everness:register_node('everness:rose_bush', { + description = S('Rose Bush'), + short_description = S('Rose Bush'), + drawtype = 'mesh', + mesh = 'everness_forsythia_mesh.obj', + tiles = { 'everness_rose_bush_mesh.png' }, + inventory_image = 'everness_rose_bush_item.png', + wield_image = 'everness_rose_bush_item.png', + paramtype = 'light', + is_ground_content = false, + walkable = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + use_texture_alpha = 'clip', +}) + +-- Glowing Pillar + +Everness:register_node('everness:glowing_pillar', { + description = S('Glowing Pillar'), + short_description = S('Glowing Pillar'), + drawtype = 'mesh', + mesh = 'everness_glowing_pillar.obj', + tiles = { + 'everness_glowing_pillar_roots.png', + 'everness_glowing_pillar_luminophor.png', + 'everness_glowing_pillar_leaves.png', + }, + inventory_image = 'everness_glowing_pillar_item.png', + wield_image = 'everness_glowing_pillar_item.png', + paramtype = 'light', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + forsaken_tundra_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + selection_box = { + type = 'fixed', + fixed = { -0.63, -0.5, -0.63, 0.63, 3.23, 0.63 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 } + }, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + use_texture_alpha = 'clip', + light_source = 12, +}) + +-- Blue Vine Lantern + +Everness:register_node('everness:blue_vine_lantern', { + description = S('Blue Vine Lantern'), + short_description = S('Blue Vine Lantern'), + drawtype = 'mesh', + mesh = 'everness_glowing_pillar.obj', + tiles = { + 'everness_blue_vine_lantern_roots.png', + 'everness_blue_vine_lantern.png', + 'everness_blue_vine_lantern_leaves.png', + }, + inventory_image = 'everness_blue_vine_lantern_item.png', + wield_image = 'everness_blue_vine_lantern_item.png', + paramtype = 'light', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + bamboo_grass_under = 1, + lantern = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + selection_box = { + type = 'fixed', + fixed = { -0.63, -0.5, -0.63, 0.63, 3.23, 0.63 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 } + }, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + use_texture_alpha = 'clip', + light_source = 12, +}) + +-- Amaranita Lantern + +Everness:register_node('everness:amaranita_lantern', { + description = S('Amaranita Lantern'), + short_description = S('Amaranita Lantern'), + drawtype = 'mesh', + mesh = 'everness_glowing_pillar.obj', + tiles = { + 'everness_amaranita_lantern_roots.png', + 'everness_amaranita_lantern_light.png', + 'everness_amaranita_lantern_fur.png', + }, + inventory_image = 'everness_amaranita_lantern_item.png', + wield_image = 'everness_amaranita_lantern_item.png', + paramtype = 'light', + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + frosted_grass_under = 1, + lantern = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + selection_box = { + type = 'fixed', + fixed = { -0.63, -0.5, -0.63, 0.63, 3.23, 0.63 } + }, + collision_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 } + }, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + use_texture_alpha = 'clip', + light_source = 12, +}) + +Everness:register_node('everness:lumecorn', { + description = S('Lumecorn'), + short_description = S('Lumecorn'), + drawtype = 'mesh', + mesh = 'everness_lumecorn.obj', + tiles = { + { + name = 'everness_lumecorn_root.png', + backface_culling = false + }, + { + name = 'everness_lumecorn_leaf.png', + backface_culling = false + }, + { + name = 'everness_lumecorn_light.png', + backface_culling = false + }, + }, + inventory_image = 'everness_lumecorn_item.png', + wield_image = 'everness_lumecorn_item.png', + paramtype = 'light', + waving = 1, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + coral_grass_under = 1, + lantern = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + selection_box = { + type = 'fixed', + fixed = { -0.63, -0.5, -0.63, 0.63, 3.23, 0.63 } + }, + sounds = Everness.node_sound_leaves_defaults(), + sunlight_propagates = true, + use_texture_alpha = 'clip', + light_source = 12, +}) + +-- +-- Tools / 'Advanced' crafting / Non-'natural' +-- + +Everness:register_node('everness:glass', { + description = S('Everness Glass'), + drawtype = 'glasslike_framed_optional', + tiles = { 'everness_glass.png', 'everness_glass_detail.png' }, + use_texture_alpha = 'clip', -- only needed for stairs API + paramtype = 'light', + sunlight_propagates = true, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + glass = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_glass_defaults(), +}) + +Everness:register_node('everness:tinted_glass_red', { + description = S('Tinted Glass Red'), + drawtype = 'glasslike_framed_optional', + tiles = { 'everness_tinted_glass_base.png^[colorize:#3A0907:122', 'everness_tinted_glass_detail.png^[colorize:#3A0907:122' }, + use_texture_alpha = 'blend', -- 'clip' needed for stairs API + -- paramtype = 'light', + is_ground_content = false, + sunlight_propagates = false, + sounds = Everness.node_sound_glass_defaults(), + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + glass = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, +}) + +Everness:register_lbm({ + label = 'Grows bamboo', + name = 'everness:bamboo', + nodenames = { 'group:bamboo' }, + run_at_every_load = false, + action = function(pos, node) + Everness:tick_bamboo_again(pos) + end, +}) + +Everness:register_lbm({ + label = 'Makes clouds from sulfur stone', + name = 'everness:sulfur_stone', + nodenames = { 'everness:sulfur_stone' }, + run_at_every_load = true, + action = function(pos, node) + Everness:tick_sulfur_stone(pos) + end, +}) + +Everness:register_node('everness:pyrite_lantern', { + description = S('Pyrite Lantern'), + drawtype = 'glasslike', + tiles = { 'everness_pyrite_lantern.png' }, + paramtype = 'light', + sunlight_propagates = true, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + lantern = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_glass_defaults(), + light_source = 12, +}) + +Everness:register_node('everness:pyrite_glass', { + description = S('Pyrite Glass'), + drawtype = 'glasslike_framed_optional', + tiles = { 'everness_pyrite_glass.png' }, + use_texture_alpha = 'clip', + paramtype = 'light', + sunlight_propagates = true, + is_ground_content = false, + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + glass = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_glass_defaults(), +}) + +Everness:register_node('everness:lumabus_vine_lantern', { + description = S('Lumabus Vine Lantern'), + drawtype = 'mesh', + mesh = 'everness_lumabus.obj', + tiles = { + 'everness_lumabus_bulb_purple.png', + { + name = 'everness_lumabus_leaves.png', + backface_culling = false + } + }, + use_texture_alpha = 'clip', + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + lantern = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_glass_defaults(), + light_source = 7, + paramtype2 = 'wallmounted', + selection_box = { + type = 'fixed', + fixed = { -1 / 2 + 3 / 16, -1 / 2, -1 / 2 + 3 / 16, 1 / 2 - 3 / 16, 1 / 2 - 6 / 16, 1 / 2 - 3 / 16 } + }, +}) + +Everness:register_node('everness:eye_vine_lantern', { + description = S('Eye Vine Lantern'), + paramtype = 'light', + tiles = { + 'everness_eye_vine_end_top.png', + 'everness_eye_vine_end_bottom.png', + 'everness_eye_vine_end_side.png', + }, + drawtype = 'normal', + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + lantern = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1 + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + sounds = Everness.node_sound_leaves_defaults(), + light_source = 7, + paramtype2 = 'facedir', + on_place = core.rotate_node, +}) + +Everness:register_node('everness:cursed_pumpkin_lantern', { + description = S('Cursed Pumpkin Lantern'), + short_description = S('Cursed Pumpkin Lantern'), + tiles = { + 'everness_cursed_pumpkin_top.png', + 'everness_cursed_pumpkin_bottom.png', + 'everness_cursed_pumpkin_side.png', + 'everness_cursed_pumpkin_side.png', + 'everness_cursed_pumpkin_side.png', + 'everness_cursed_pumpkin_front.png' + }, + paramtype = 'light', + paramtype2 = 'facedir', + sounds = Everness.node_sound_wood_defaults(), + is_ground_content = false, + light_source = 12, + groups = { + -- MTG + snappy = 3, + lantern = 1, + fall_damage_add_percent = -30, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1, + -- ALL + flammable = 4, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, +}) + +Everness:register_node('everness:floating_crystal', { + description = S('Floating Crystal'), + drawtype = 'plantlike', + tiles = { + { + name = 'everness_floating_crystal_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3 + }, + } + }, + waving = 3, + paramtype = 'light', + sunlight_propagates = true, + buildable_to = true, + walkable = false, + groups = { + -- MTG + snappy = 3, + not_in_creative_inventory = 1, + -- MLC + handy = 1, + building_block = 1, + material_glass = 1, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + selection_box = { + type = 'fixed', + fixed = { -0.25, -0.25, -0.25, 0.25, 0.25, 0.25 }, + }, + drop = '', + sounds = Everness.node_sound_thin_glass_defaults(), + on_rotate = function() + return false + end, + light_source = 12, + on_timer = function(pos, elapsed) + core.remove_node(pos) + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local meta = core.get_meta(pos) + + if meta:get_int('activated') == 1 then + return itemstack + end + + meta:set_int('activated', 1) + + core.sound_play( + 'everness_thin_glass_footstep', + { + gain = 0.7, + max_hear_distance = 16, + pos = pos + }, + true + ) + + -- Initial values + local position = vector.new(pos.x, pos.y, pos.z) + local position_prev = vector.new(pos.x, pos.y, pos.z) + + -- For 'number' of crystals do.. + for i = 1, math.random(2, 6), 1 do + -- Only air positions + local positions = core.find_nodes_in_area( + { x = position.x - 3, y = position.y - 1, z = position.z - 3 }, + { x = position.x + 3, y = position.y + 1, z = position.z + 3 }, + { 'air' } + ) + + if #positions == 0 then + -- No positions available/found + break + end + + -- Get light for `positions` + local positions_with_light = {} + + for k, v in ipairs(positions) do + table.insert(positions_with_light, { + pos = v, + light = core.get_node_light(v) + }) + end + + table.shuffle(positions_with_light) + + -- Sort with the lowest light first + table.sort(positions_with_light, function(a, b) + return a.light < b.light + end) + + local temp_pos + + -- Find next position + for j, v in ipairs(positions_with_light) do + temp_pos = v.pos + local blocking_sight = false + local ray = core.raycast(position_prev, temp_pos, false, false) + + for pt in ray do + if pt.type == 'node' then + local node_under = core.get_node(pt.under) + local node_def = core.registered_nodes[node_under.name] + + if node_def then + if node_def.walkable then + blocking_sight = node_def.walkable + break + end + end + end + end + + if vector.distance(position_prev, temp_pos) > 1 + and not vector.equals(position_prev, temp_pos) + and not blocking_sight + then + break + else + temp_pos = nil + end + end + + if not temp_pos then + -- No suitable next position found + break + end + + position_prev = position + position = temp_pos + + core.after(i - 1, function(v_position, v_position_prev) + if core.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + core.add_particlespawner({ + amount = 50, + time = 1, + size = { + min = 0.5, + max = 1, + }, + exptime = 2, + pos = v_position_prev, + texture = { + name = 'everness_particle.png^[colorize:#FFEE83:255', + alpha_tween = { + 1, 0.5, + style = 'fwd', + reps = 1 + }, + scale_tween = { + 1, 0.5, + style = 'fwd', + reps = 1 + } + }, + radius = { min = 0.2, max = 0.4 }, + attract = { + kind = 'point', + strength = 1, + origin = v_position, + }, + glow = 12 + }) + end + + core.after(1, function(v_position2, v_position_prev2) + core.set_node(v_position2, { name = 'everness:floating_crystal' }) + core.get_node_timer(v_position2):start(math.random(85, 95)) + end, v_position, v_position_prev) + end, position, position_prev) + end + + return itemstack + end +}) + +Everness:register_node('everness:coral_forest_deep_ocean_lantern', { + description = S('Coral Forest Deep Ocean Lantern'), + tiles = { + { name = 'everness_coral_forest_deep_ocean_lantern_top.png' }, + { name = 'everness_coral_forest_deep_ocean_lantern_bottom.png' }, + { + name = 'everness_coral_forest_deep_ocean_lantern_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 2, + }, + }, + }, + sunlight_propagates = true, + is_ground_content = false, + sounds = Everness.node_sound_glass_defaults(), + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + lantern = 1, + -- MCL + handy = 1, + building_block = 1, + material_glass = 1, + }, + _mcl_blast_resistance = 0.3, + _mcl_hardness = 0.3, + paramtype = 'light', + light_source = 14, +}) + +-- +-- Liquids +-- + +Everness:register_node('everness:mineral_water_source', { + description = S('Mineral Water Source'), + drawtype = 'liquid', + waving = 3, + tiles = { + { + name = 'everness_mineral_water_source_animated.png', + backface_culling = false, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + { + name = 'everness_mineral_water_source_animated.png', + backface_culling = true, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + use_texture_alpha = 'blend', + paramtype = 'light', + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = '', + drowning = 1, + liquidtype = 'source', + liquid_alternative_flowing = 'everness:mineral_water_flowing', + liquid_alternative_source = 'everness:mineral_water_source', + liquid_viscosity = 1, + post_effect_color = { a = 103, r = 15, g = 212, b = 203 }, + groups = { + water = 3, + liquid = 3, + cools_lava = 1 + }, + liquid_renewable = false, + liquid_range = 2, + sounds = Everness.node_sound_water_defaults(), +}) + +Everness:register_node('everness:mineral_water_flowing', { + description = S('Flowing Mineral Water'), + drawtype = 'flowingliquid', + tiles = {'everness_mineral_water.png'}, + special_tiles = { + { + name = 'everness_mineral_water_flowing_animated.png', + backface_culling = false, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + { + name = 'everness_mineral_water_flowing_animated.png', + backface_culling = true, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + }, + use_texture_alpha = 'blend', + paramtype = 'light', + paramtype2 = 'flowingliquid', + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = '', + drowning = 1, + liquidtype = 'flowing', + liquid_alternative_flowing = 'everness:mineral_water_flowing', + liquid_alternative_source = 'everness:mineral_water_source', + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = { a = 103, r = 15, g = 212, b = 203 }, + groups = { + water = 3, + liquid = 3, + not_in_creative_inventory = 1, + cools_lava = 1 + }, + sounds = Everness.node_sound_water_defaults(), +}) + +core.register_node('everness:lava_source', { + description = S('Lava Source'), + drawtype = 'liquid', + tiles = { + { + name = 'everness_lava_source_animated.png', + backface_culling = false, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6, + }, + align_style = 'world', + scale = 2 + }, + { + name = 'everness_lava_source_animated.png', + backface_culling = true, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6, + }, + align_style = 'world', + scale = 2 + }, + }, + paramtype = 'light', + light_source = 13, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = '', + drowning = 1, + liquidtype = 'source', + liquid_alternative_flowing = 'everness:lava_flowing', + liquid_alternative_source = 'everness:lava_source', + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = { a = 191, r = 255, g = 64, b = 0 }, + groups = { + lava = 3, + liquid = 2, + igniter = 1 + }, + liquid_range = 2, +}) + +core.register_node('everness:lava_flowing', { + description = S('Flowing Lava'), + drawtype = 'flowingliquid', + tiles = { + { + name = 'everness_lava_flowing_animated.png', + align_style = 'world', + scale = 2 + } + }, + special_tiles = { + { + name = 'everness_lava_flowing_animated.png', + backface_culling = false, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + align_style = 'world', + scale = 2 + }, + { + name = 'everness_lava_flowing_animated.png', + backface_culling = true, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + align_style = 'world', + scale = 2 + }, + }, + paramtype = 'light', + paramtype2 = 'flowingliquid', + light_source = 13, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = '', + drowning = 1, + liquidtype = 'flowing', + liquid_alternative_flowing = 'everness:lava_flowing', + liquid_alternative_source = 'everness:lava_source', + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = { a = 191, r = 255, g = 64, b = 0 }, + groups = { + lava = 3, + liquid = 2, + igniter = 1, + not_in_creative_inventory = 1 + }, + liquid_range = 2, +}) + +Everness:register_node('everness:water_geyser', { + description = S('Water') .. ' ' .. S('Geyser'), + drawtype = 'mesh', + mesh = 'everness_water_geyser.obj', + tiles = { + 'everness_mineral_stone.png^[multiply:#E0D3DC:127' + }, + paramtype = 'light', + wield_image = 'everness_water_geyser_item.png', + inventory_image = 'everness_water_geyser_item.png', + stack_max = 1, + groups = { + -- MTG + cracky = 2, + oddly_breakable_by_hand = 3, + -- MCL + pickaxey = 1, + handy = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + drop = 'everness:water_geyser', + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + walkable = false, + climbable = false, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:water_geyser_active', { + description = S('Water') .. ' ' .. S('Geyser') .. ' ' .. S('Active'), + drawtype = 'mesh', + mesh = 'everness_water_geyser.obj', + tiles = { + 'everness_mineral_stone.png^[colorize:#E0D3DC:127' + }, + paramtype = 'light', + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + -- MCL + pickaxey = 1, + handy = 1, + building_block = 1, + -- ALL + not_in_creative_inventory = 1 + }, + drop = 'everness:water_geyser', + walkable = false, + climbable = false, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + move_resistance = 2, + damage_per_second = 1, + sounds = Everness.node_sound_stone_defaults(), + on_timer = function(pos, elapsed) + local n = core.get_node(pos) + + if n and n.name == 'everness:water_geyser_active' then + core.swap_node(pos, { name = 'everness:water_geyser' }) + end + + return false + end, + on_destruct = function(pos) + local meta = core.get_meta(pos) + local particle_id = meta:get_int('particle_id') + + if particle_id > 0 then + core.delete_particlespawner(particle_id) + meta:set_int('particle_id', 0) + end + end +}) + +for i, v in ipairs({ 'blank', 'flowers', 'lines', 'tribal' }) do + Everness:register_node('everness:ceramic_pot_' .. v, { + description = S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v) .. '. ' .. S('If destroyed by archelogical pick axe, it will drop ceramic sherds instead of ceramic pot item.'), + short_description = S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v), + drawtype = 'mesh', + mesh = 'everness_ceramic_pot.obj', + tiles = { 'everness_ceramic_pot_' .. v .. '_mesh.png' }, + is_ground_content = false, + paramtype = 'light', + sunlight_propagates = true, + use_texture_alpha = 'clip', + paramtype2 = '4dir', + stack_max = 1, + groups = { + -- MTG + cracky = 3, + oddly_breakable_by_hand = 3, + -- MCL + pickaxey = 1, + handy = 1, + building_block = 1, + material_stone = 1, + deco_block = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_ceramic_defaults(), + drop = { + max_items = 1, + items = { + { + tool_groups = { 'archeological_drop' }, + items = { + 'everness:ceramic_pot_sherd_blank', + 'everness:ceramic_pot_sherd_blank', + 'everness:ceramic_pot_sherd_blank', + 'everness:ceramic_pot_sherd_blank', + 'everness:ceramic_pot_sherd_' .. v, + } + }, + { + items = { 'everness:ceramic_pot_' .. v } + } + } + }, + on_construct = function(pos) + local meta = core.get_meta(pos) + local inv = meta:get_inventory() + meta:set_string('infotext', S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v)) + meta:set_string('owner', '') + inv:set_size('main', 1) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + local meta = core.get_meta(pos) + + meta:set_string('owner', placer:get_player_name() or '') + end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local p_name = clicker:get_player_name() + + if core.is_protected(pos, p_name) then + return itemstack + end + + local meta = core.get_meta(pos) + local inv = meta:get_inventory() + local inv_stack = inv:get_stack('main', 1) + local label_copy = { + S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v) + } + + if meta:get_string('owner') ~= '' then + label_copy[#label_copy + 1] = ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')' + end + + label_copy[#label_copy + 1] = '\n' .. inv_stack:get_description() + + label_copy = table.concat(label_copy, '') + + core.show_formspec(p_name, 'everness:ceramic_pot_' .. v, Everness.get_pot_formspec(pos, label_copy, 'everness_ceramic_pot_' .. v .. '_mesh.png')) + + core.sound_play('everness_ceramic_hit', { gain = 1.0, pos = pos, max_hear_distance = 10 }, true) + end, + on_blast = function(pos, intensity) + if core.is_protected(pos, '') then + return + end + + local drops = {} + local inv = core.get_meta(pos):get_inventory() + local n = #drops + + for j = 1, inv:get_size('main') do + local stack = inv:get_stack('main', j) + if stack:get_count() > 0 then + drops[n + 1] = stack:to_table() + n = n + 1 + end + end + + drops[#drops + 1] = 'everness:ceramic_pot_' .. v + core.remove_node(pos) + return drops + end, + on_destruct = function(pos) + local inv = core.get_meta(pos):get_inventory() + + for j = 1, inv:get_size('main') do + local stack = inv:get_stack('main', j) + + if stack:get_count() > 0 then + local obj = core.add_item(pos, stack) + + if obj then + obj:get_luaentity().collect = true + obj:set_acceleration({ x = 0, y = -10, z = 0 }) + obj:set_velocity({ + x = 0, + y = 5, + z = 0 + }) + end + end + end + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if core.is_protected(pos, player:get_player_name()) then + return 0 + end + + return stack:get_count() + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if core.is_protected(pos, player:get_player_name()) then + return 0 + end + + return stack:get_count() + end, + + on_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = core.get_meta(pos) + local inv = meta:get_inventory() + local inv_stack = inv:get_stack('main', 1) + local label_copy = { + S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v) + } + + if meta:get_string('owner') ~= '' then + label_copy[#label_copy + 1] = ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')' + end + + label_copy[#label_copy + 1] = '\n' .. inv_stack:get_description() + + label_copy = table.concat(label_copy, '') + + core.show_formspec(player:get_player_name(), 'everness:ceramic_pot_' .. v, Everness.get_pot_formspec(pos, label_copy, 'everness_ceramic_pot_' .. v .. '_mesh.png')) + end, + + on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = core.get_meta(pos) + local inv = meta:get_inventory() + local inv_stack = inv:get_stack('main', 1) + local label_copy = { + S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v) + } + + if meta:get_string('owner') ~= '' then + label_copy[#label_copy + 1] = ' (' .. S('owned by') .. ' ' .. meta:get_string('owner') .. ')' + end + + label_copy[#label_copy + 1] = '\n' .. inv_stack:get_description() + + label_copy = table.concat(label_copy, '') + + core.show_formspec(player:get_player_name(), 'everness:ceramic_pot_' .. v, Everness.get_pot_formspec(pos, label_copy, 'everness_ceramic_pot_' .. v .. '_mesh.png')) + end + }) + + Everness:register_craftitem('everness:ceramic_pot_sherd_' .. v, { + description = S('Ceramic') .. ' ' .. S('Pot') .. ' ' .. S(v) .. ' ' .. S('Sherd'), + inventory_image = 'everness_ceramic_pot_' .. v .. '_sherd.png', + }) + + if v ~= 'blank' then + -- recipes for 'blank' are in `crafting.lua` + core.register_craft({ + output = 'everness:ceramic_pot_' .. v, + recipe = { + { '', 'everness:ceramic_pot_sherd_blank', ''}, + { 'everness:ceramic_pot_sherd_blank', 'everness:ceramic_pot_sherd_' .. v, 'everness:ceramic_pot_sherd_blank'}, + { '', 'everness:ceramic_pot_sherd_blank', ''}, + } + }) + + core.register_craft({ + output = 'everness:ceramic_pot_' .. v, + type = 'shapeless', + recipe = { 'everness:ceramic_pot_blank', 'everness:ceramic_pot_sherd_' .. v } + }) + end +end + +local fence_collision_extra = core.settings:get_bool('enable_fence_tall') and 3/8 or 0 + +Everness:register_node('everness:sand_castle_wall', { + description = S('Sand') .. ' ' .. S('Castle') .. ' ' .. S('Wall'), + drawtype = 'nodebox', + node_box = { + type = 'connected', + fixed = { + -- Main pillar + { -0.2500, -0.5000, -0.2500, 0.2500, 0.3750, 0.2500 }, + -- Main pillar tops + { -0.2500, 0.3750, -0.2500, -0.1875, 0.4375, 0.2500 }, + { 0.1875, 0.3750, -0.2500, 0.2500, 0.4375, 0.2500 }, + { -0.1875, 0.3750, -0.2500, 0.1875, 0.4375, -0.1875 }, + { -0.1875, 0.3750, 0.1875, 0.1875, 0.4375, 0.2500 }, + { -0.2500, 0.4375, 0.1875, -0.1875, 0.5000, 0.2500 }, + { -0.1250, 0.4375, 0.1875, -0.06250, 0.5000, 0.2500 }, + { 0.06250, 0.4375, 0.1875, 0.1250, 0.5000, 0.2500 }, + { 0.1875, 0.4375, 0.1875, 0.2500, 0.5000, 0.2500 }, + { 0.1875, 0.4375, -0.2500, 0.2500, 0.5000, -0.1875 }, + { 0.1875, 0.4375, -0.1250, 0.2500, 0.5000, -0.06250 }, + { 0.1875, 0.4375, 0.06250, 0.2500, 0.5000, 0.1250 }, + { -0.2500, 0.4375, -0.2500, -0.1875, 0.5000, -0.1875 }, + { -0.2500, 0.4375, -0.1250, -0.1875, 0.5000, -0.06250 }, + { -0.2500, 0.4375, 0.06250, -0.1875, 0.5000, 0.1250 }, + { -0.1250, 0.4375, -0.2500, -0.06250, 0.5000, -0.1875 }, + { 0.06250, 0.4375, -0.2500, 0.1250, 0.5000, -0.1875 }, + }, + connect_front = { + -- Connected side + { -0.1875, -0.5000, -0.5000, 0.1875, 0.3125, -0.2500 }, + -- Connected side tops + { -0.1875, 0.3750, -0.5000, -0.1250, 0.4375, -0.4375 }, + { -0.1875, 0.3750, -0.3750, -0.1250, 0.4375, -0.3125 }, + { -0.1875, 0.3125, -0.5000, -0.1250, 0.3750, -0.2500 }, + { 0.1250, 0.3750, -0.3750, 0.1875, 0.4375, -0.3125 }, + { 0.1250, 0.3750, -0.5000, 0.1875, 0.4375, -0.4375 }, + { 0.1250, 0.3125, -0.5000, 0.1875, 0.3750, -0.2500 }, + }, + + connect_back = { + -- Connected side + { -0.1875, -0.5000, 0.2500, 0.1875, 0.3125, 0.5000 }, + -- Connected side tops + { -0.1875, 0.3750, 0.4375, -0.1250, 0.4375, 0.5000 }, + { -0.1875, 0.3750, 0.3125, -0.1250, 0.4375, 0.3750 }, + { -0.1875, 0.3125, 0.2500, -0.1250, 0.3750, 0.5000 }, + { 0.1250, 0.3750, 0.3125, 0.1875, 0.4375, 0.3750 }, + { 0.1250, 0.3750, 0.4375, 0.1875, 0.4375, 0.5000 }, + { 0.1250, 0.3125, 0.2500, 0.1875, 0.3750, 0.5000 }, + }, + + connect_left = { + -- Connected side + { -0.2500, 0.3125, 0.1875, -0.5000, -0.5000, -0.1875 }, + -- Connected side tops + { -0.4375, 0.4375, -0.1250, -0.5000, 0.3750, -0.1875 }, + { -0.3125, 0.4375, -0.1250, -0.3750, 0.3750, -0.1875 }, + { -0.2500, 0.3750, -0.1250, -0.5000, 0.3125, -0.1875 }, + { -0.3125, 0.4375, 0.1875, -0.3750, 0.3750, 0.1250 }, + { -0.4375, 0.4375, 0.1875, -0.5000, 0.3750, 0.1250 }, + { -0.2500, 0.3750, 0.1875, -0.5000, 0.3125, 0.1250 }, + }, + connect_right = { + -- Connected side + { 0.2500, -0.5000, -0.1875, 0.5000, 0.3125, 0.1875 }, + -- Connected side tops + { 0.4375, 0.3750, 0.1250, 0.5000, 0.4375, 0.1875 }, + { 0.3125, 0.3750, 0.1250, 0.3750, 0.4375, 0.1875 }, + { 0.2500, 0.3125, 0.1250, 0.5000, 0.3750, 0.1875 }, + { 0.3125, 0.3750, -0.1875, 0.3750, 0.4375, -0.1250 }, + { 0.4375, 0.3750, -0.1875, 0.5000, 0.4375, -0.1250 }, + { 0.2500, 0.3125, -0.1875, 0.5000, 0.3750, -0.1250 }, + }, + }, + selection_box = { + type = 'connected', + fixed = { -1/4, -1/2, -1/4, 1/4, 1/2 + fence_collision_extra, 1/4 }, + connect_front = { -1/4, -1/2, -1/2, 1/4, 1/2 + fence_collision_extra, -1/4 }, + connect_left = { -1/2, -1/2, -1/4, -1/4, 1/2 + fence_collision_extra, 1/4 }, + connect_back = { -1/4, -1/2, 1/4, 1/4, 1/2 + fence_collision_extra, 1/2 }, + connect_right = { 1/4, -1/2, -1/4, 1/2, 1/2 + fence_collision_extra, 1/4 }, + }, + collision_box = { + type = 'connected', + fixed = { -1/4, -1/2, -1/4, 1/4, 1/2 + fence_collision_extra, 1/4 }, + connect_front = { -1/4, -1/2, -1/2, 1/4, 1/2 + fence_collision_extra, -1/4 }, + connect_left = { -1/2, -1/2, -1/4, -1/4, 1/2 + fence_collision_extra, 1/4 }, + connect_back = { -1/4, -1/2, 1/4, 1/4, 1/2 + fence_collision_extra, 1/2 }, + connect_right = { 1/4, -1/2, -1/4, 1/2, 1/2 + fence_collision_extra, 1/4 }, + }, + connects_to = { + 'group:wall', + 'group:stone', + 'group:fence', + 'group:everness_sandstone' + }, + paramtype = 'light', + is_ground_content = false, + tiles = { 'everness_mineral_sandstone.png' }, + walkable = true, + groups = { + cracky = 3, + stone = 2, + -- MCL + pickaxey = 1, + deco_block = 1, + }, + -- MCL + _mcl_hardness = 2, + _mcl_blast_resistance = 6, + sounds = Everness.node_sound_stone_defaults(), +}) + +local cursed_bone_groups = { + cracky = 3, + oddly_breakable_by_hand = 3, + -- MCL + pickaxey = 1, + deco_block = 1, +} + +local cursed_bone_palette_color_names = { + [0] = S('Purple'), + [1] = S('Green'), + [2] = S('Red'), + [3] = S('Blue'), + [4] = S('Yellow'), + [5] = S('Magenta'), + [6] = S('Cyan'), + [7] = S('White'), +} + +Everness:register_node('everness:cursed_bone_1', { + description = S('Cursed Skeleton Hands'), + short_description = S('Cursed Skeleton Hands'), + drawtype = 'mesh', + mesh = 'everness_cursed_hands.obj', + paramtype = 'light', + paramtype2 = "colordegrotate", + palette = "everness_cursed_energy_palette.png", + use_texture_alpha = "clip", + walkable = false, + light_source = 7, + tiles = { + { name = 'everness_cursed_hands.png', color = "white" }, + { + name = 'everness_cursed_energy_core_animated.png', + color = "white", + animation = { + type = 'vertical_frames', + aspect_w = 32, + aspect_h = 32, + length = 1.5, + }, + backface_culling = false, + }, + { + name = 'everness_cursed_energy_glow_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 32, + aspect_h = 32, + length = 1.5, + }, + backface_culling = false, + } + }, + selection_box = { + type = "fixed", + fixed = { -0.4, -0.5, -0.4, 0.4, 0.9, 0.4 } + }, + collision_box = { + type = "fixed", + fixed = { -0.4, -0.5, -0.4, 0.4, 0.9, 0.4 } + }, + preserve_metadata = function(pos, oldnode, oldmeta, drops) + local pal_idx = math.floor((oldnode.param2 or 0) / 32) % 8 + local col = cursed_bone_palette_color_names[pal_idx] + for _, drop in ipairs(drops) do + if drop.set_param2 then + drop:set_param2(oldnode.param2) + end + local meta = drop:get_meta() + -- In Luanti/Minetest, itemstack palette_index uses the full 0..255 scale (pal_idx * 32 for 8-color palettes) + meta:set_int('palette_index', pal_idx * 32) + if col then + local full_desc = S('Cursed Skeleton Hands') .. ' (' .. col .. ')' + meta:set_string('description', full_desc) + meta:set_string('short_description', full_desc) + end + end + end, + groups = cursed_bone_groups, + sounds = Everness.node_sound_stone_defaults(), + on_place = function(itemstack, placer, pointed_thing) + local param2 = 0 + if placer then + local dir = placer:get_look_dir() + local rotation_index = math.floor(math.deg(math.atan2(dir.x, -dir.z)) / 15 + 0.5) % 24 + local meta = itemstack:get_meta() + local color_index + if meta:get_string('palette_index') ~= '' then + local raw_pal = meta:get_int('palette_index') + if raw_pal >= 8 then + color_index = math.floor(raw_pal / 32) % 8 + else + color_index = raw_pal % 8 + end + elseif itemstack.get_param2 and itemstack:get_param2() > 0 then + color_index = math.floor(itemstack:get_param2() / 32) % 8 + else + color_index = math.random(0, 7) + end + param2 = (color_index * 32) + rotation_index + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end, +}) + +Everness:register_node('everness:cursed_bone_2', { + description = S('Cursed Rib Cage'), + short_description = S('Cursed Rib Cage'), + drawtype = 'mesh', + mesh = 'everness_cursed_ribs.obj', + paramtype = 'light', + paramtype2 = "degrotate", + walkable = false, + tiles = { 'everness_cursed_ribs.png' }, + selection_box = { + type = "fixed", + fixed = { -0.3125, -0.5, -0.4375, 0.3125, 0.125, 0.4375 } + }, + collision_box = { + type = "fixed", + fixed = { -0.3125, -0.5, -0.4375, 0.3125, 0.125, 0.4375 } + }, + on_place = function(itemstack, placer, pointed_thing) + local param2 = 0 + if placer then + local dir = placer:get_look_dir() + local base_param2 = math.floor(math.deg(math.atan2(-dir.x, dir.z)) / 1.5 + 0.5) + local offset = math.random(-13, 13) + param2 = (base_param2 + offset) % 240 + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end, + groups = cursed_bone_groups, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:cursed_bone_3', { + description = S('Cursed Skull on Stick'), + short_description = S('Cursed Skull on Stick'), + drawtype = 'mesh', + mesh = 'everness_cursed_skull_pole.obj', + paramtype = 'light', + paramtype2 = "degrotate", + tiles = { 'everness_cursed_skull_pole.png' }, + light_source = 1, + selection_box = { + type = "fixed", + fixed = { -0.3125, -0.5, -0.3125, 0.3125, 1.5, 0.3125 } + }, + collision_box = { + type = "fixed", + fixed = { -0.3125, -0.5, -0.3125, 0.3125, 1.5, 0.3125 } + }, + on_place = function(itemstack, placer, pointed_thing) + local param2 = 0 + if placer then + local dir = placer:get_look_dir() + -- Use -dir.x to convert clockwise player yaw to counter-clockwise degrotate + local base_param2 = math.floor(math.deg(math.atan2(-dir.x, dir.z)) / 1.5 + 0.5) + -- 20 degrees random offset = 13 units (since 1 unit = 1.5 degrees) + local offset = math.random(-13, 13) + param2 = (base_param2 + offset) % 240 + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end, + groups = cursed_bone_groups, + sounds = Everness.node_sound_stone_defaults(), +}) diff --git a/mods/everness/nodes_farming.lua b/mods/everness/nodes_farming.lua new file mode 100644 index 0000000..75fb55a --- /dev/null +++ b/mods/everness/nodes_farming.lua @@ -0,0 +1,545 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +core.override_item('everness:coral_dirt', { + soil = { + base = 'everness:coral_dirt', + dry = 'everness:coral_dirt_soil', + wet = 'everness:coral_dirt_soil_wet' + } +}) + +core.override_item('everness:dirt_with_coral_grass', { + soil = { + base = 'everness:dirt_with_coral_grass', + dry = 'everness:coral_dirt_soil', + wet = 'everness:coral_dirt_soil_wet' + } +}) + +core.override_item('everness:dirt_1', { + soil = { + base = 'everness:dirt_1', + dry = 'everness:dirt_1_soil', + wet = 'everness:dirt_1_soil_wet' + } +}) + +core.override_item('everness:dirt_with_grass_1', { + soil = { + base = 'everness:dirt_with_grass_1', + dry = 'everness:dirt_1_soil', + wet = 'everness:dirt_1_soil_wet' + } +}) + +core.override_item('everness:dry_dirt', { + soil = { + base = 'everness:dry_dirt', + dry = 'everness:dry_dirt_soil', + wet = 'everness:dry_dirt_soil_wet' + } +}) + +core.override_item('everness:dry_dirt_with_dry_grass', { + soil = { + base = 'everness:dry_dirt_with_dry_grass', + dry = 'everness:dry_dirt_soil', + wet = 'everness:dry_dirt_soil_wet' + } +}) + +core.override_item('everness:dirt_with_grass_extras_1', { + soil = { + base = 'everness:dirt_with_grass_extras_1', + dry = 'everness:dirt_1_soil', + wet = 'everness:dirt_1_soil_wet' + } +}) + +core.override_item('everness:dirt_with_grass_extras_2', { + soil = { + base = 'everness:dirt_with_grass_extras_2', + dry = 'everness:dirt_1_soil', + wet = 'everness:dirt_1_soil_wet' + } +}) + +core.override_item('everness:crystal_dirt', { + soil = { + base = 'everness:crystal_dirt', + dry = 'everness:crystal_dirt_soil', + wet = 'everness:crystal_dirt_soil_wet' + } +}) + +core.override_item('everness:dirt_with_crystal_grass', { + soil = { + base = 'everness:dirt_with_crystal_grass', + dry = 'everness:crystal_dirt_soil', + wet = 'everness:crystal_dirt_soil_wet' + } +}) + +core.override_item('everness:crystal_cave_dirt', { + soil = { + base = 'everness:crystal_cave_dirt', + dry = 'everness:crystal_cave_dirt_soil', + wet = 'everness:crystal_cave_dirt_soil_wet' + } +}) + +core.override_item('everness:crystal_cave_dirt_with_moss', { + soil = { + base = 'everness:crystal_cave_dirt_with_moss', + dry = 'everness:crystal_cave_dirt_soil', + wet = 'everness:crystal_cave_dirt_soil_wet' + } +}) + +core.override_item('everness:cursed_dirt', { + soil = { + base = 'everness:cursed_dirt', + dry = 'everness:cursed_dirt_soil', + wet = 'everness:cursed_dirt_soil_wet' + } +}) + +core.override_item('everness:dirt_with_cursed_grass', { + soil = { + base = 'everness:dirt_with_cursed_grass', + dry = 'everness:cursed_dirt_soil', + wet = 'everness:cursed_dirt_soil_wet' + } +}) + +-- normal soil +Everness:register_node('everness:coral_dirt_soil', { + description = S('Coral Dirt Soil'), + tiles = { + 'everness_coral_dirt.png^(everness_coral_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#A05F3A80)', + 'everness_coral_dirt.png' + }, + drop = 'everness:coral_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 2, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:coral_dirt', + dry = 'everness:coral_dirt_soil', + wet = 'everness:coral_dirt_soil_wet' + } +}) + +Everness:register_node('everness:dirt_1_soil', { + description = S('Dirt Soil'), + tiles = { + 'everness_dirt.png^(everness_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#51341E80)', + 'everness_dirt.png' + }, + drop = 'everness:dirt_1', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 2, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:dirt_1', + dry = 'everness:dirt_1_soil', + wet = 'everness:dirt_1_soil_wet' + } +}) + +Everness:register_node('everness:crystal_dirt_soil', { + description = S('Crystal Dirt Soil'), + tiles = { + 'everness_crystal_dirt.png^(everness_crystal_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#75506980)', + 'everness_crystal_dirt.png' + }, + drop = 'everness:crystal_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 2, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:crystal_dirt', + dry = 'everness:crystal_dirt_soil', + wet = 'everness:crystal_dirt_soil_wet' + } +}) + +Everness:register_node('everness:crystal_cave_dirt_soil', { + description = S('Crystal Cave Dirt Soil'), + tiles = { + 'everness_crystal_cave_dirt.png^(everness_crystal_cave_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#CCB17E80)', + 'everness_crystal_cave_dirt.png' + }, + drop = 'everness:crystal_cave_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 2, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:crystal_cave_dirt', + dry = 'everness:crystal_cave_dirt_soil', + wet = 'everness:crystal_cave_dirt_soil_wet' + } +}) + +Everness:register_node('everness:cursed_dirt_soil', { + description = S('Cursed Dirt Soil'), + tiles = { + 'everness_cursed_dirt.png^(everness_cursed_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#625B4B80)', + 'everness_cursed_dirt.png' + }, + drop = 'everness:cursed_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 2, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:cursed_dirt', + dry = 'everness:cursed_dirt_soil', + wet = 'everness:cursed_dirt_soil_wet' + } +}) + +Everness:register_node('everness:dry_dirt_soil', { + description = S('Dry Dirt Soil'), + tiles = { + 'everness_dry_dirt.png^(everness_dry_dirt.png^[mask:everness_farming_soil_overlay.png^[multiply:#9F754780)', + 'everness_dry_dirt.png' + }, + drop = 'everness:dry_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 2, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:dry_dirt', + dry = 'everness:dry_dirt_soil', + wet = 'everness:dry_dirt_soil_wet' + } +}) + +-- wet soil +Everness:register_node('everness:coral_dirt_soil_wet', { + description = S('Coral Dirt Wet Soil'), + tiles = { + 'everness_coral_dirt.png^(everness_coral_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#A05F3A80)', + 'everness_coral_dirt.png^(everness_coral_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#A05F3A80)', + }, + drop = 'everness:coral_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 3, + wet = 1, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:coral_dirt', + dry = 'everness:coral_dirt_soil', + wet = 'everness:coral_dirt_soil_wet' + } +}) + +Everness:register_node('everness:dirt_1_soil_wet', { + description = S('Coral Dirt Wet Soil'), + tiles = { + 'everness_dirt.png^(everness_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#51341E80)', + 'everness_dirt.png^(everness_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#51341E80)', + }, + drop = 'everness:dirt_1', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 3, + wet = 1, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:dirt_1', + dry = 'everness:dirt_1_soil', + wet = 'everness:dirt_1_soil_wet' + } +}) + +Everness:register_node('everness:crystal_dirt_soil_wet', { + description = S('Crystal Dirt Wet Soil'), + tiles = { + 'everness_crystal_dirt.png^(everness_crystal_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#75506980)', + 'everness_crystal_dirt.png^(everness_crystal_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#75506980)', + }, + drop = 'everness:crystal_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 3, + wet = 1, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:crystal_dirt', + dry = 'everness:crystal_dirt_soil', + wet = 'everness:crystal_dirt_soil_wet' + } +}) + +Everness:register_node('everness:crystal_cave_dirt_soil_wet', { + description = S('Crystal Cave Dirt Wet Soil'), + tiles = { + 'everness_crystal_cave_dirt.png^(everness_crystal_cave_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#CCB17E80)', + 'everness_crystal_cave_dirt.png^(everness_crystal_cave_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#CCB17E80)', + }, + drop = 'everness:crystal_cave_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 3, + wet = 1, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:crystal_cave_dirt', + dry = 'everness:crystal_cave_dirt_soil', + wet = 'everness:crystal_cave_dirt_soil_wet' + } +}) + +Everness:register_node('everness:cursed_dirt_soil_wet', { + description = S('Cursed Dirt Wet Soil'), + tiles = { + 'everness_cursed_dirt.png^(everness_cursed_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#625B4B80)', + 'everness_cursed_dirt.png^(everness_cursed_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#625B4B80)', + }, + drop = 'everness:cursed_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 3, + wet = 1, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:cursed_dirt', + dry = 'everness:cursed_dirt_soil', + wet = 'everness:cursed_dirt_soil_wet' + } +}) + +Everness:register_node('everness:dry_dirt_soil_wet', { + description = S('Cursed Dirt Wet Soil'), + tiles = { + 'everness_dry_dirt.png^(everness_dry_dirt.png^[mask:everness_farming_soil_wet_overlay.png^[multiply:#9F754780)', + 'everness_dry_dirt.png^(everness_dry_dirt.png^[mask:everness_farming_soil_wet_side_overlay.png^[multiply:#9F754780)', + }, + drop = 'everness:dry_dirt', + groups = { + -- MTG + crumbly = 3, + not_in_creative_inventory = 1, + soil = 3, + wet = 1, + grassland = 1, + field = 1, + -- MCL + handy = 1, + shovely = 1, + dirt = 1, + soil_sapling = 2, + soil_sugarcane = 1, + cultivatable = 2, + enderman_takable = 1, + building_block = 1, + }, + _mcl_blast_resistance = 0.5, + _mcl_hardness = 0.5, + sounds = Everness.node_sound_dirt_defaults(), + soil = { + base = 'everness:dry_dirt', + dry = 'everness:dry_dirt_soil', + wet = 'everness:dry_dirt_soil_wet' + } +}) diff --git a/mods/everness/nodes_mineral_waters_under.lua b/mods/everness/nodes_mineral_waters_under.lua new file mode 100644 index 0000000..28358c5 --- /dev/null +++ b/mods/everness/nodes_mineral_waters_under.lua @@ -0,0 +1,685 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +Everness:register_node('everness:mineral_cave_stone', { + description = S('Mineral Cave Stone'), + tiles = { + { + name = 'everness_mineral_stone_under_top.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_stone_under_top.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_stone_under.png', + align_style = 'world', + scale = 2 + } + }, + drop = 'everness:mineral_cave_cobblestone', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_cave_cobblestone', { + description = S('Mineral Cave Cobblestone'), + is_ground_content = false, + tiles = { + { + name = 'everness_mineral_cobblestone_under.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 2, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_lava_stone', { + description = S('Mineral Lava Stone with lava'), + is_ground_content = false, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_lava_stone_animated.png', + align_style = 'world', + scale = 2, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6.4, + }, + }, + { + name = 'everness_mineral_lava_stone_bottom.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_lava_stone_side.png', + align_style = 'world', + scale = 2 + } + }, + drop = 'everness:mineral_lava_stone_dry', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + light_source = 3, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_lava_stone_dry', { + description = S('Mineral Lava Stone without lava'), + is_ground_content = false, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_lava_stone_bottom.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_lava_stone_with_moss', { + description = S('Mineral Lava Stone with moss'), + is_ground_content = false, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_cave_moss.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_cave_moss.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_cave_moss_side.png', + align_style = 'world', + scale = 2 + }, + }, + drop = 'everness:mineral_lava_stone_dry', + groups = { + -- MTG + cracky = 3, + -- Everness + everness_spreading_dirt_type_under = 1, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + light_source = 3, + sounds = Everness.node_sound_stone_defaults(), +}) + +for i = 1, 7 do + local last = i == 7 + + Everness:register_node('everness:volcanic_spike_' .. i, { + description = S('Volcanic Spike') .. ' ' .. i, + tiles = { 'everness_volcanic_rock.png' }, + sounds = Everness.node_sound_stone_defaults(), + drawtype = 'nodebox', + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1, + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + is_ground_content = false, + node_box = { + type = 'fixed', + fixed = { + { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + } + } + }, + selection_box = { + type = 'fixed', + fixed = { + (-8 + i - 1) / 16, + -8 / 16, + (-8 + i - 1) / 16, + (8 - i + 1) / 16, + 8 / 16, + (8 - i + 1) / 16 + } + }, + collision_box = { + type = 'fixed', + fixed = { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + }, + }, + move_resistance = last and 7 or 0, + damage_per_second = last and 4 or 0, + drowning = last and 1 or 0, + walkable = not last, + climbable = last, + }) + + Everness:register_node('everness:mineral_cave_stone_spike_' .. i, { + description = S('Mineral Lava Stone Spike') .. ' ' .. i, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_stone_under_top.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_stone_under_top.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_stone_under.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), + drawtype = 'nodebox', + is_ground_content = false, + node_box = { + type = 'fixed', + fixed = { + { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + } + } + }, + selection_box = { + type = 'fixed', + fixed = { + (-8 + i - 1) / 16, + -8 / 16, + (-8 + i - 1) / 16, + (8 - i + 1) / 16, + 8 / 16, + (8 - i + 1) / 16 + } + }, + collision_box = { + type = 'fixed', + fixed = { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + }, + }, + move_resistance = last and 7 or 0, + damage_per_second = last and 4 or 0, + drowning = last and 1 or 0, + walkable = not last, + climbable = last, + }) + + Everness:register_node('everness:mineral_lava_stone_spike_' .. i, { + description = S('Mineral Lava Stone Spike') .. ' ' .. i, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_lava_stone_animated.png', + align_style = 'world', + scale = 2, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6.4, + }, + }, + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), + drawtype = 'nodebox', + is_ground_content = false, + node_box = { + type = 'fixed', + fixed = { + { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + } + } + }, + selection_box = { + type = 'fixed', + fixed = { + (-8 + i - 1) / 16, + -8 / 16, + (-8 + i - 1) / 16, + (8 - i + 1) / 16, + 8 / 16, + (8 - i + 1) / 16 + } + }, + collision_box = { + type = 'fixed', + fixed = { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + }, + }, + light_source = 12, + move_resistance = last and 7 or 0, + damage_per_second = last and 4 or 0, + drowning = last and 1 or 0, + walkable = not last, + climbable = last, + }) +end + +Everness:register_node('everness:lava_tree', { + description = S('Lava Tree Trunk'), + short_description = S('Lava Tree Trunk'), + tiles = { + { name = 'everness_lava_tree_top.png' }, + { name = 'everness_lava_tree_top.png' }, + { + name = 'everness_lava_tree.png', + align_style = 'world', + scale = 2, + }, + }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node +}) + +Everness:register_node('everness:lava_tree_with_lava', { + description = S('Lava Tree Trunk with Lava Veins'), + short_description = S('Lava Tree Trunk with Lava Veins'), + tiles = { + { name = 'everness_lava_tree_top.png' }, + { name = 'everness_lava_tree_top.png' }, + { + name = 'everness_lava_tree_animated.png', + align_style = 'world', + scale = 8, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 8, + }, + }, + }, + paramtype2 = 'facedir', + is_ground_content = false, + groups = { + -- MTG + choppy = 2, + oddly_breakable_by_hand = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 5, + -- ALL + tree = 1, + flammable = 2, + }, + _mcl_blast_resistance = 2, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), + on_place = core.rotate_node, + light_source = 3, +}) + +Everness:register_node('everness:lava_tree_wood', { + description = S('Lava Tree Wood Planks'), + paramtype2 = 'facedir', + place_param2 = 0, + tiles = { + { + name = 'everness_lava_tree_wood.png', + align_style = 'world', + scale = 2 + }, + }, + is_ground_content = false, + groups = { + -- MTG + choppy = 3, + oddly_breakable_by_hand = 2, + -- Everness + everness_wood = 1, + -- MCL + handy = 1, + axey = 1, + building_block = 1, + material_wood = 1, + fire_encouragement = 5, + fire_flammability = 20, + -- ALL + flammable = 3, + wood = 1, + }, + _mcl_blast_resistance = 3, + _mcl_hardness = 2, + sounds = Everness.node_sound_wood_defaults(), +}) + +Everness:register_node('everness:lava_tree_sapling', { + description = S('Lava') .. ' ' .. S('Tree') .. ' ' .. S('Sapling'), + short_description = S('Lava') .. ' ' .. S('Tree') .. ' ' .. S('Sapling'), + drawtype = 'plantlike', + tiles = { 'everness_lava_tree_sapling.png' }, + inventory_image = 'everness_lava_tree_sapling.png', + wield_image = 'everness_lava_tree_sapling.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + selection_box = { + type = 'fixed', + fixed = { -4 / 16, -0.5, -4 / 16, 4 / 16, 4 / 16, 4 / 16 } + }, + groups = { + -- MTG + snappy = 2, + flammable = 2, + -- X Farming + compost = 30, + -- MCL + plant = 1, + non_mycelium_plant = 1, + deco_block = 1, + dig_by_water = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + dig_immediate = 3, + attached_node = 1, + sapling = 1, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + on_timer = function(pos) + Everness.grow_sapling(pos) + end, + on_construct = function(pos) + core.get_node_timer(pos):start(math.random(300, 1500)) + end, + on_place = function(itemstack, placer, pointed_thing) + local on_place_props = { + sapling_name = 'everness:lava_tree_sapling', + minp_relative = { x = -7, y = 1, z = -7 }, + maxp_relative = { x = 7, y = 13, z = 7 }, + interval = 4, + } + + return Everness:sapling_on_place(itemstack, placer, pointed_thing, on_place_props) + end, +}) + +Everness:register_node('everness:lava_tree_leaves', { + description = S('Lava') .. ' ' .. S('Tree') .. ' ' .. S('Leaves'), + short_description = S('Lava') .. ' ' .. S('Tree') .. ' ' .. S('Leaves'), + drawtype = 'allfaces_optional', + tiles = { + { + name = 'everness_lava_tree_leaves.png', + align_style = 'world', + scale = 2, + }, + }, + special_tiles = { + { + name = 'everness_lava_tree_leaves.png', + align_style = 'world', + scale = 2, + }, + }, + paramtype = 'light', + is_ground_content = false, + sunlight_propagates = true, + groups = { + -- MTG + snappy = 3, + leafdecay = 3, + -- X Farming + compost = 30, + -- MCL + handy = 1, + hoey = 1, + shearsy = 1, + swordy = 1, + dig_by_piston = 1, + fire_encouragement = 30, + fire_flammability = 60, + deco_block = 1, + compostability = 30, + -- ALL + flammable = 2, + leaves = 1, + }, + _mcl_shears_drop = true, + _mcl_blast_resistance = 0.2, + _mcl_hardness = 0.2, + _mcl_silk_touch_drop = true, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/100 chance + items = { 'everness:lava_tree_sapling' }, + rarity = 100, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = { 'everness:lava_tree_leaves' }, + } + } + }, + sounds = Everness.node_sound_leaves_defaults(), + after_place_node = function(pos, placer, itemstack, pointed_thing) + return Everness:after_place_leaves(pos, placer, itemstack, pointed_thing) + end +}) + +Everness:register_node('everness:mineral_cave_moss_grass', { + description = S('Mineral Cave Moss Grass'), + short_description = S('Mineral Cave Moss Grass'), + drawtype = 'plantlike', + waving = 1, + tiles = { 'everness_mineral_cave_moss_grass.png' }, + inventory_image = 'everness_mineral_cave_moss_grass.png', + wield_image = 'everness_mineral_cave_moss_grass.png', + paramtype = 'light', + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = { + -- MTG + snappy = 3, + flora = 1, + -- Everness + mineral_waters_grass_under = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + shearsy = 1, + deco_block = 1, + plant = 1, + non_mycelium_plant = 1, + fire_encouragement = 60, + fire_flammability = 100, + dig_by_water = 1, + destroy_by_lava_flow = 1, + compostability = 30, + -- ALL + attached_node = 1, + flammable = 2, + }, + _mcl_blast_resistance = 0, + _mcl_hardness = 0, + sounds = Everness.node_sound_leaves_defaults(), + selection_box = { + type = 'fixed', + fixed = { -6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16 }, + }, + light_source = 7 +}) diff --git a/mods/everness/panes.lua b/mods/everness/panes.lua new file mode 100644 index 0000000..eb92848 --- /dev/null +++ b/mods/everness/panes.lua @@ -0,0 +1,105 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +xpanes.register_pane('pyrite_pane', { + description = S('Pyrite Glass Pane'), + textures = { 'everness_pyrite_glass.png', '', 'everness_xpanes_edge_pyrite.png' }, + use_texture_alpha = 'clip', + inventory_image = 'everness_pyrite_glass.png', + wield_image = 'everness_pyrite_glass.png', + sounds = Everness.node_sound_glass_defaults(), + groups = { snappy = 2, cracky = 3, oddly_breakable_by_hand = 3 }, + recipe = { + { 'everness:pyrite_glass', 'everness:pyrite_glass', 'everness:pyrite_glass' }, + { 'everness:pyrite_glass', 'everness:pyrite_glass', 'everness:pyrite_glass' } + } +}) + +xpanes.register_pane('cursed_bar', { + description = S('Cursed Steel Bars'), + textures = {'everness_cursed_bar.png', '', 'everness_cursed_bar_top.png'}, + inventory_image = 'everness_cursed_bar.png', + wield_image = 'everness_cursed_bar.png', + groups = { cracky = 2 }, + sounds = Everness.node_sound_metal_defaults(), + recipe = { + { 'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot' }, + { 'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot' }, + { 'everness:cursed_lands_deep_ocean_sandstone_block', 'everness:cursed_lands_deep_ocean_sandstone_block', 'everness:cursed_lands_deep_ocean_sandstone_block' } + } +}) + +-- Register steel bar doors and trapdoors + +if core.get_modpath('doors') or core.global_exists('doors') then + + doors.register('everness:door_cursed_steel_bar', { + tiles = { + { + name = 'everness_door_cursed_steel_bar.png', + backface_culling = true + } + }, + description = S('Cursed Steel Bar Door'), + inventory_image = 'everness_door_cursed_steel_bar_item.png', + protected = true, + groups = { + node = 1, + cracky = 1, + level = 2 + }, + sounds = Everness.node_sound_metal_defaults(), + sound_open = 'xpanes_steel_bar_door_open', + sound_close = 'xpanes_steel_bar_door_close', + gain_open = 0.15, + gain_close = 0.13, + recipe = { + {'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'}, + {'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'}, + {'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'}, + }, + }) + + doors.register_trapdoor('everness:trapdoor_cursed_steel_bar', { + description = S('Steel Bar Trapdoor'), + inventory_image = 'everness_trapdoor_cursed_steel_bar.png', + wield_image = 'everness_trapdoor_cursed_steel_bar.png', + tile_front = 'everness_trapdoor_cursed_steel_bar.png', + tile_side = 'everness_trapdoor_cursed_steel_bar_side.png', + protected = true, + groups = { + node = 1, + cracky = 1, + level = 2, + door = 1 + }, + sounds = Everness.node_sound_metal_defaults(), + sound_open = 'xpanes_steel_bar_door_open', + sound_close = 'xpanes_steel_bar_door_close', + gain_open = 0.15, + gain_close = 0.13, + }) + + core.register_craft({ + output = 'everness:trapdoor_cursed_steel_bar', + recipe = { + {'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'}, + {'xpanes:cursed_bar_flat', 'xpanes:cursed_bar_flat'}, + } + }) +end diff --git a/mods/everness/privileges.lua b/mods/everness/privileges.lua new file mode 100644 index 0000000..1ee6439 --- /dev/null +++ b/mods/everness/privileges.lua @@ -0,0 +1,85 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local function update_sfinv(name) + core.after(0, function() + local player = core.get_player_by_name(name) + + if player then + if sfinv.get_page(player) == 'everness:encyclopedia' then + sfinv.set_page(player, sfinv.get_homepage_name(player)) + else + sfinv.set_player_inventory_formspec(player) + end + end + end) +end + +local function update_ui(name) + core.after(0, function() + local player = core.get_player_by_name(name) + + if player then + if unified_inventory.current_page[name] == 'everness:encyclopedia' then + unified_inventory.current_page[name] = 'craft' + end + + unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[name]) + end + end) +end + +core.register_privilege('everness_encyclopedia', { + -- Privilege description + description = 'Collection of registered items and functions with some information about them. Used for testing not for gameplay. Works only with SFINV!', + + -- Whether to grant the privilege to singleplayer. + give_to_singleplayer = false, + + -- Whether to grant the privilege to the server admin. + -- Uses value of 'give_to_singleplayer' by default. + give_to_admin = false, + + -- Called when given to player 'name' by 'granter_name'. + -- 'granter_name' will be nil if the priv was granted by a mod. + on_grant = function(name, granter_name) + if core.get_modpath('sfinv') and sfinv.enabled then + update_sfinv(name) + elseif core.get_modpath('unified_inventory') then + update_ui(name) + else + core.chat_send_player(name, 'Compatible inventory not found. Everness encyclopedia will not be shown.') + end + end, + + -- Called when taken from player 'name' by 'revoker_name'. + -- 'revoker_name' will be nil if the priv was revoked by a mod. + + -- Note that the above two callbacks will be called twice if a player is + -- responsible, once with the player name, and then with a nil player + -- name. + -- Return true in the above callbacks to stop register_on_priv_grant or + -- revoke being called. + on_revoke = function(name, revoker_name) + if core.get_modpath('sfinv') and sfinv.enabled then + update_sfinv(name) + elseif core.get_modpath('unified_inventory') then + update_ui(name) + else + core.chat_send_player(name, 'Compatible inventory not found. Everness encyclopedia will not be shown.') + end + end, +}) diff --git a/mods/everness/schematics/everness_baobab_log.mts b/mods/everness/schematics/everness_baobab_log.mts new file mode 100644 index 0000000..210d852 Binary files /dev/null and b/mods/everness/schematics/everness_baobab_log.mts differ diff --git a/mods/everness/schematics/everness_baobab_tree.mts b/mods/everness/schematics/everness_baobab_tree.mts new file mode 100644 index 0000000..32f881b Binary files /dev/null and b/mods/everness/schematics/everness_baobab_tree.mts differ diff --git a/mods/everness/schematics/everness_baobab_tree_from_sapling.mts b/mods/everness/schematics/everness_baobab_tree_from_sapling.mts new file mode 100644 index 0000000..3238895 Binary files /dev/null and b/mods/everness/schematics/everness_baobab_tree_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_cemetery.mts b/mods/everness/schematics/everness_cemetery.mts new file mode 100644 index 0000000..037b291 Binary files /dev/null and b/mods/everness/schematics/everness_cemetery.mts differ diff --git a/mods/everness/schematics/everness_coral_bones_tree.mts b/mods/everness/schematics/everness_coral_bones_tree.mts new file mode 100644 index 0000000..7173ebc Binary files /dev/null and b/mods/everness/schematics/everness_coral_bones_tree.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_cyan.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_cyan.mts new file mode 100644 index 0000000..a51d9fc Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_cyan.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_green.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_green.mts new file mode 100644 index 0000000..1fa53e9 Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_green.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_pink.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_pink.mts new file mode 100644 index 0000000..833635a Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_pink.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_red.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_red.mts new file mode 100644 index 0000000..967b949 Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_red.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_cyan.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_cyan.mts new file mode 100644 index 0000000..7f2fee3 Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_cyan.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_green.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_green.mts new file mode 100644 index 0000000..684209e Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_green.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_pink.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_pink.mts new file mode 100644 index 0000000..602b316 Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_pink.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_red.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_red.mts new file mode 100644 index 0000000..92b0f83 Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_coral_reef_red.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_deep_ocean_house.mts b/mods/everness/schematics/everness_coral_forest_deep_ocean_house.mts new file mode 100644 index 0000000..5ad6c9b Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_deep_ocean_house.mts differ diff --git a/mods/everness/schematics/everness_coral_forest_ocean_fishing_dock.mts b/mods/everness/schematics/everness_coral_forest_ocean_fishing_dock.mts new file mode 100644 index 0000000..18025e8 Binary files /dev/null and b/mods/everness/schematics/everness_coral_forest_ocean_fishing_dock.mts differ diff --git a/mods/everness/schematics/everness_coral_tree.mts b/mods/everness/schematics/everness_coral_tree.mts new file mode 100644 index 0000000..8af6d27 Binary files /dev/null and b/mods/everness/schematics/everness_coral_tree.mts differ diff --git a/mods/everness/schematics/everness_coral_tree_bioluminescent.mts b/mods/everness/schematics/everness_coral_tree_bioluminescent.mts new file mode 100644 index 0000000..d178c5e Binary files /dev/null and b/mods/everness/schematics/everness_coral_tree_bioluminescent.mts differ diff --git a/mods/everness/schematics/everness_coral_tree_bioluminescent_from_sapling.mts b/mods/everness/schematics/everness_coral_tree_bioluminescent_from_sapling.mts new file mode 100644 index 0000000..ddbe5a1 Binary files /dev/null and b/mods/everness/schematics/everness_coral_tree_bioluminescent_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_coral_tree_from_sapling.mts b/mods/everness/schematics/everness_coral_tree_from_sapling.mts new file mode 100644 index 0000000..6d1119e Binary files /dev/null and b/mods/everness/schematics/everness_coral_tree_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_coral_volcano.mts b/mods/everness/schematics/everness_coral_volcano.mts new file mode 100644 index 0000000..2837bae Binary files /dev/null and b/mods/everness/schematics/everness_coral_volcano.mts differ diff --git a/mods/everness/schematics/everness_coral_volcano_x_clay.mts b/mods/everness/schematics/everness_coral_volcano_x_clay.mts new file mode 100644 index 0000000..3680cf8 Binary files /dev/null and b/mods/everness/schematics/everness_coral_volcano_x_clay.mts differ diff --git a/mods/everness/schematics/everness_crystal_bush.mts b/mods/everness/schematics/everness_crystal_bush.mts new file mode 100644 index 0000000..a8def3a Binary files /dev/null and b/mods/everness/schematics/everness_crystal_bush.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_1.mts b/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_1.mts new file mode 100644 index 0000000..67ae3cc Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_1.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_2.mts b/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_2.mts new file mode 100644 index 0000000..a8491f6 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_2.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_3.mts b/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_3.mts new file mode 100644 index 0000000..5b23469 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_deep_ocean_coral_3.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_deep_ocean_ruins.mts b/mods/everness/schematics/everness_crystal_forest_deep_ocean_ruins.mts new file mode 100644 index 0000000..12a4f22 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_deep_ocean_ruins.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_ocean_shrine.mts b/mods/everness/schematics/everness_crystal_forest_ocean_shrine.mts new file mode 100644 index 0000000..79693d4 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_ocean_shrine.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_ruins_1.mts b/mods/everness/schematics/everness_crystal_forest_ruins_1.mts new file mode 100644 index 0000000..d12481a Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_ruins_1.mts differ diff --git a/mods/everness/schematics/everness_crystal_forest_ruins_2.mts b/mods/everness/schematics/everness_crystal_forest_ruins_2.mts new file mode 100644 index 0000000..d19eeef Binary files /dev/null and b/mods/everness/schematics/everness_crystal_forest_ruins_2.mts differ diff --git a/mods/everness/schematics/everness_crystal_purple_cluster.mts b/mods/everness/schematics/everness_crystal_purple_cluster.mts new file mode 100644 index 0000000..46614b9 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_purple_cluster.mts differ diff --git a/mods/everness/schematics/everness_crystal_tree.mts b/mods/everness/schematics/everness_crystal_tree.mts new file mode 100644 index 0000000..d9f3887 Binary files /dev/null and b/mods/everness/schematics/everness_crystal_tree.mts differ diff --git a/mods/everness/schematics/everness_crystal_tree_large.mts b/mods/everness/schematics/everness_crystal_tree_large.mts new file mode 100644 index 0000000..3272f5c Binary files /dev/null and b/mods/everness/schematics/everness_crystal_tree_large.mts differ diff --git a/mods/everness/schematics/everness_cursed_bush.mts b/mods/everness/schematics/everness_cursed_bush.mts new file mode 100644 index 0000000..960208d Binary files /dev/null and b/mods/everness/schematics/everness_cursed_bush.mts differ diff --git a/mods/everness/schematics/everness_cursed_cabin.mts b/mods/everness/schematics/everness_cursed_cabin.mts new file mode 100644 index 0000000..cf445ad Binary files /dev/null and b/mods/everness/schematics/everness_cursed_cabin.mts differ diff --git a/mods/everness/schematics/everness_cursed_dream_tree.mts b/mods/everness/schematics/everness_cursed_dream_tree.mts new file mode 100644 index 0000000..70673e5 Binary files /dev/null and b/mods/everness/schematics/everness_cursed_dream_tree.mts differ diff --git a/mods/everness/schematics/everness_cursed_dream_tree_from_sapling.mts b/mods/everness/schematics/everness_cursed_dream_tree_from_sapling.mts new file mode 100644 index 0000000..0f14235 Binary files /dev/null and b/mods/everness/schematics/everness_cursed_dream_tree_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_cursed_lands_deep_ocean_island.mts b/mods/everness/schematics/everness_cursed_lands_deep_ocean_island.mts new file mode 100644 index 0000000..de4473c Binary files /dev/null and b/mods/everness/schematics/everness_cursed_lands_deep_ocean_island.mts differ diff --git a/mods/everness/schematics/everness_cursed_lands_deep_ocean_skull.mts b/mods/everness/schematics/everness_cursed_lands_deep_ocean_skull.mts new file mode 100644 index 0000000..f7a59a2 Binary files /dev/null and b/mods/everness/schematics/everness_cursed_lands_deep_ocean_skull.mts differ diff --git a/mods/everness/schematics/everness_dry_tree.mts b/mods/everness/schematics/everness_dry_tree.mts new file mode 100644 index 0000000..f7927cd Binary files /dev/null and b/mods/everness/schematics/everness_dry_tree.mts differ diff --git a/mods/everness/schematics/everness_dry_tree_from_sapling.mts b/mods/everness/schematics/everness_dry_tree_from_sapling.mts new file mode 100644 index 0000000..b501380 Binary files /dev/null and b/mods/everness/schematics/everness_dry_tree_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_forsaken_desert_temple.mts b/mods/everness/schematics/everness_forsaken_desert_temple.mts new file mode 100644 index 0000000..86e9613 Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_desert_temple.mts differ diff --git a/mods/everness/schematics/everness_forsaken_desert_temple_2.mts b/mods/everness/schematics/everness_forsaken_desert_temple_2.mts new file mode 100644 index 0000000..7243a0e Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_desert_temple_2.mts differ diff --git a/mods/everness/schematics/everness_forsaken_desert_temple_3.mts b/mods/everness/schematics/everness_forsaken_desert_temple_3.mts new file mode 100644 index 0000000..e6e00a4 Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_desert_temple_3.mts differ diff --git a/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_alcyonacea.mts b/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_alcyonacea.mts new file mode 100644 index 0000000..ef300fb Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_alcyonacea.mts differ diff --git a/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_octocurse.mts b/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_octocurse.mts new file mode 100644 index 0000000..5188a62 Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_octocurse.mts differ diff --git a/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_ostracod.mts b/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_ostracod.mts new file mode 100644 index 0000000..37d36ee Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_lands_deep_ocean_coral_ostracod.mts differ diff --git a/mods/everness/schematics/everness_forsaken_tundra_rocks.mts b/mods/everness/schematics/everness_forsaken_tundra_rocks.mts new file mode 100644 index 0000000..9207bfc Binary files /dev/null and b/mods/everness/schematics/everness_forsaken_tundra_rocks.mts differ diff --git a/mods/everness/schematics/everness_forsythia_on_moss.mts b/mods/everness/schematics/everness_forsythia_on_moss.mts new file mode 100644 index 0000000..8c6b1ba Binary files /dev/null and b/mods/everness/schematics/everness_forsythia_on_moss.mts differ diff --git a/mods/everness/schematics/everness_frosted_icesheet_igloo.mts b/mods/everness/schematics/everness_frosted_icesheet_igloo.mts new file mode 100644 index 0000000..8602a82 Binary files /dev/null and b/mods/everness/schematics/everness_frosted_icesheet_igloo.mts differ diff --git a/mods/everness/schematics/everness_frosted_icicle_large_ceiling.mts b/mods/everness/schematics/everness_frosted_icicle_large_ceiling.mts new file mode 100644 index 0000000..adf6e0b Binary files /dev/null and b/mods/everness/schematics/everness_frosted_icicle_large_ceiling.mts differ diff --git a/mods/everness/schematics/everness_frosted_icicle_large_floor.mts b/mods/everness/schematics/everness_frosted_icicle_large_floor.mts new file mode 100644 index 0000000..809cb30 Binary files /dev/null and b/mods/everness/schematics/everness_frosted_icicle_large_floor.mts differ diff --git a/mods/everness/schematics/everness_frosted_lands_fossils.mts b/mods/everness/schematics/everness_frosted_lands_fossils.mts new file mode 100644 index 0000000..fda815f Binary files /dev/null and b/mods/everness/schematics/everness_frosted_lands_fossils.mts differ diff --git a/mods/everness/schematics/everness_frosted_lands_stalagmite.mts b/mods/everness/schematics/everness_frosted_lands_stalagmite.mts new file mode 100644 index 0000000..af701df Binary files /dev/null and b/mods/everness/schematics/everness_frosted_lands_stalagmite.mts differ diff --git a/mods/everness/schematics/everness_frosted_lands_volcanic_rock.mts b/mods/everness/schematics/everness_frosted_lands_volcanic_rock.mts new file mode 100644 index 0000000..f178e78 Binary files /dev/null and b/mods/everness/schematics/everness_frosted_lands_volcanic_rock.mts differ diff --git a/mods/everness/schematics/everness_giant_sequoia_tree.mts b/mods/everness/schematics/everness_giant_sequoia_tree.mts new file mode 100644 index 0000000..957c814 Binary files /dev/null and b/mods/everness/schematics/everness_giant_sequoia_tree.mts differ diff --git a/mods/everness/schematics/everness_giant_sequoia_tree_from_sapling.mts b/mods/everness/schematics/everness_giant_sequoia_tree_from_sapling.mts new file mode 100644 index 0000000..7bdb617 Binary files /dev/null and b/mods/everness/schematics/everness_giant_sequoia_tree_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_haunted_house.mts b/mods/everness/schematics/everness_haunted_house.mts new file mode 100644 index 0000000..238b446 Binary files /dev/null and b/mods/everness/schematics/everness_haunted_house.mts differ diff --git a/mods/everness/schematics/everness_hollow_tree.mts b/mods/everness/schematics/everness_hollow_tree.mts new file mode 100644 index 0000000..cee8c93 Binary files /dev/null and b/mods/everness/schematics/everness_hollow_tree.mts differ diff --git a/mods/everness/schematics/everness_hollow_tree_large.mts b/mods/everness/schematics/everness_hollow_tree_large.mts new file mode 100644 index 0000000..fdf85e2 Binary files /dev/null and b/mods/everness/schematics/everness_hollow_tree_large.mts differ diff --git a/mods/everness/schematics/everness_japanese_shrine.mts b/mods/everness/schematics/everness_japanese_shrine.mts new file mode 100644 index 0000000..e65a8bc Binary files /dev/null and b/mods/everness/schematics/everness_japanese_shrine.mts differ diff --git a/mods/everness/schematics/everness_jungle_temple.mts b/mods/everness/schematics/everness_jungle_temple.mts new file mode 100644 index 0000000..ba2addf Binary files /dev/null and b/mods/everness/schematics/everness_jungle_temple.mts differ diff --git a/mods/everness/schematics/everness_large_bamboo.mts b/mods/everness/schematics/everness_large_bamboo.mts new file mode 100644 index 0000000..04ee49a Binary files /dev/null and b/mods/everness/schematics/everness_large_bamboo.mts differ diff --git a/mods/everness/schematics/everness_lava_tree.mts b/mods/everness/schematics/everness_lava_tree.mts new file mode 100644 index 0000000..c0d1885 Binary files /dev/null and b/mods/everness/schematics/everness_lava_tree.mts differ diff --git a/mods/everness/schematics/everness_marsh_grass.mts b/mods/everness/schematics/everness_marsh_grass.mts new file mode 100644 index 0000000..4054449 Binary files /dev/null and b/mods/everness/schematics/everness_marsh_grass.mts differ diff --git a/mods/everness/schematics/everness_mese_tree.mts b/mods/everness/schematics/everness_mese_tree.mts new file mode 100644 index 0000000..9828b61 Binary files /dev/null and b/mods/everness/schematics/everness_mese_tree.mts differ diff --git a/mods/everness/schematics/everness_mineral_waters_tower.mts b/mods/everness/schematics/everness_mineral_waters_tower.mts new file mode 100644 index 0000000..b7d67e4 Binary files /dev/null and b/mods/everness/schematics/everness_mineral_waters_tower.mts differ diff --git a/mods/everness/schematics/everness_palm_tree.mts b/mods/everness/schematics/everness_palm_tree.mts new file mode 100644 index 0000000..368f718 Binary files /dev/null and b/mods/everness/schematics/everness_palm_tree.mts differ diff --git a/mods/everness/schematics/everness_palm_tree_from_sapling.mts b/mods/everness/schematics/everness_palm_tree_from_sapling.mts new file mode 100644 index 0000000..ad10edb Binary files /dev/null and b/mods/everness/schematics/everness_palm_tree_from_sapling.mts differ diff --git a/mods/everness/schematics/everness_quartz_fountain.mts b/mods/everness/schematics/everness_quartz_fountain.mts new file mode 100644 index 0000000..3e85d65 Binary files /dev/null and b/mods/everness/schematics/everness_quartz_fountain.mts differ diff --git a/mods/everness/schematics/everness_quartz_temple.mts b/mods/everness/schematics/everness_quartz_temple.mts new file mode 100644 index 0000000..d08f47c Binary files /dev/null and b/mods/everness/schematics/everness_quartz_temple.mts differ diff --git a/mods/everness/schematics/everness_ruins_1.mts b/mods/everness/schematics/everness_ruins_1.mts new file mode 100644 index 0000000..c870329 Binary files /dev/null and b/mods/everness/schematics/everness_ruins_1.mts differ diff --git a/mods/everness/schematics/everness_small_bamboo.mts b/mods/everness/schematics/everness_small_bamboo.mts new file mode 100644 index 0000000..dea10f2 Binary files /dev/null and b/mods/everness/schematics/everness_small_bamboo.mts differ diff --git a/mods/everness/schematics/everness_sulfur_volcano.mts b/mods/everness/schematics/everness_sulfur_volcano.mts new file mode 100644 index 0000000..ef4e222 Binary files /dev/null and b/mods/everness/schematics/everness_sulfur_volcano.mts differ diff --git a/mods/everness/schematics/everness_termite_nest.mts b/mods/everness/schematics/everness_termite_nest.mts new file mode 100644 index 0000000..68a5748 Binary files /dev/null and b/mods/everness/schematics/everness_termite_nest.mts differ diff --git a/mods/everness/schematics/everness_willow_tree.mts b/mods/everness/schematics/everness_willow_tree.mts new file mode 100644 index 0000000..899e8af Binary files /dev/null and b/mods/everness/schematics/everness_willow_tree.mts differ diff --git a/mods/everness/schematics/everness_willow_tree_from_sapling.mts b/mods/everness/schematics/everness_willow_tree_from_sapling.mts new file mode 100644 index 0000000..fecbc5a Binary files /dev/null and b/mods/everness/schematics/everness_willow_tree_from_sapling.mts differ diff --git a/mods/everness/settingtypes.txt b/mods/everness/settingtypes.txt new file mode 100644 index 0000000..1e0cc2e --- /dev/null +++ b/mods/everness/settingtypes.txt @@ -0,0 +1,404 @@ +[Biomes] + +[*Coral Forest] + +# Enable/ Disable Coral Forest Biome +# Disabling this biome might result in missing recipes. +everness_coral_forest (Coral Forest) bool true + +# Upper limit for biome. +everness_coral_forest_y_max (y max) int 31000 + +# Lower limit for biome. +everness_coral_forest_y_min (y min) int 6 + +[*Coral Forest Dunes] + +# Enable/ Disable Coral Forest Dunes Biome +# Disabling this biome might result in missing recipes. +everness_coral_forest_dunes (Coral Forest Dunes) bool true + +# Upper limit for biome. +everness_coral_forest_dunes_y_max (y max) int 5 + +# Lower limit for biome. +everness_coral_forest_dunes_y_min (y min) int 4 + +[*Coral Forest Ocean] + +# Enable/ Disable Coral Forest Ocean Biome +# Disabling this biome might result in missing recipes. +everness_coral_forest_ocean (Coral Forest Ocean) bool true + +# Upper limit for biome. +everness_coral_forest_ocean_y_max (y max) int 3 + +# Lower limit for biome. +everness_coral_forest_ocean_y_min (y min) int -10 + +[*Coral Forest Deep Ocean] + +# Enable/ Disable Coral Forest Deep Ocean Biome +# Disabling this biome might result in missing recipes. +everness_coral_forest_deep_ocean (Coral Forest Deep Ocean) bool true + +# Upper limit for biome. +everness_coral_forest_deep_ocean_y_max (y max) int -11 + +# Lower limit for biome. +everness_coral_forest_deep_ocean_y_min (y min) int -255 + +[*Coral Forest Under] + +# Enable/ Disable Coral Forest Under Biome +# Disabling this biome might result in missing recipes. +everness_coral_forest_under (Coral Forest Under) bool true + +# Upper limit for biome. +everness_coral_forest_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_coral_forest_under_y_min (y min) int -31000 + +[*Frosted Icesheet] + +# Enable/ Disable Frosted Icesheet Biome +# Disabling this biome might result in missing recipes. +everness_frosted_icesheet (Frosted Icesheet) bool true + +# Upper limit for biome. +everness_frosted_icesheet_y_max (y max) int 31000 + +# Lower limit for biome. +everness_frosted_icesheet_y_min (y min) int -8 + +[*Frosted Icesheet Ocean] + +# Enable/ Disable Frosted Icesheet Ocean Biome +# Disabling this biome might result in missing recipes. +everness_frosted_icesheet_ocean (Frosted Icesheet Ocean) bool true + +# Upper limit for biome. +everness_frosted_icesheet_ocean_y_max (y max) int -9 + +# Lower limit for biome. +everness_frosted_icesheet_ocean_y_min (y min) int -255 + +[*Frosted Icesheet Under] + +# Enable/ Disable Frosted Icesheet Under Biome +# Disabling this biome might result in missing recipes. +everness_frosted_icesheet_under (Frosted Icesheet Under) bool true + +# Upper limit for biome. +everness_frosted_icesheet_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_frosted_icesheet_under_y_min (y min) int -31000 + +[*Cursed Lands] + +# Enable/ Disable Cursed Lands Biome +# Disabling this biome might result in missing recipes. +everness_cursed_lands (Cursed Lands) bool true + +# Upper limit for biome. +everness_cursed_lands_y_max (y max) int 31000 + +# Lower limit for biome. +everness_cursed_lands_y_min (y min) int 6 + +[*Cursed Lands Dunes] + +# Enable/ Disable Cursed Lands Dunes Biome +# Disabling this biome might result in missing recipes. +everness_cursed_lands_dunes (Cursed Lands Dunes) bool true + +# Upper limit for biome. +everness_cursed_lands_dunes_y_max (y max) int 5 + +# Lower limit for biome. +everness_cursed_lands_dunes_y_min (y min) int 1 + +[*Cursed Lands Swamp] + +# Enable/ Disable Cursed Lands Swamp Biome +# Disabling this biome might result in missing recipes. +everness_cursed_lands_swamp (Cursed Lands Swamp) bool true + +# Upper limit for biome. +everness_cursed_lands_swamp_y_max (y max) int 0 + +# Lower limit for biome. +everness_cursed_lands_swamp_y_min (y min) int -1 + +[*Cursed Lands Ocean] + +# Enable/ Disable Cursed Lands Ocean Biome +# Disabling this biome might result in missing recipes. +everness_cursed_lands_ocean (Cursed Lands Ocean) bool true + +# Upper limit for biome. +everness_cursed_lands_ocean_y_max (y max) int -2 + +# Lower limit for biome. +everness_cursed_lands_ocean_y_min (y min) int -10 + +[*Cursed Lands Deep Ocean] + +# Enable/ Disable Cursed Lands Deep Ocean Biome +# Disabling this biome might result in missing recipes. +everness_cursed_lands_deep_ocean (Cursed Lands Deep Ocean) bool true + +# Upper limit for biome. +everness_cursed_lands_deep_ocean_y_max (y max) int -11 + +# Lower limit for biome. +everness_cursed_lands_deep_ocean_y_min (y min) int -255 + +[*Cursed Lands Under] + +# Enable/ Disable Cursed Lands Under Biome +# Disabling this biome might result in missing recipes. +everness_cursed_lands_under (Cursed Lands Under) bool true + +# Upper limit for biome. +everness_cursed_lands_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_cursed_lands_under_y_min (y min) int -31000 + +[*Crystal Forest] + +# Enable/ Disable Crystal Forest Biome +# Disabling this biome might result in missing recipes. +everness_crystal_forest (Crystal Forest) bool true + +# Upper limit for biome. +everness_crystal_forest_y_max (y max) int 31000 + +# Lower limit for biome. +everness_crystal_forest_y_min (y min) int 6 + +[*Crystal Forest Dunes] + +# Enable/ Disable Crystal Forest Dunes Biome +# Disabling this biome might result in missing recipes. +everness_crystal_forest_dunes (Crystal Forest Dunes) bool true + +# Upper limit for biome. +everness_crystal_forest_dunes_y_max (y max) int 5 + +# Lower limit for biome. +everness_crystal_forest_dunes_y_min (y min) int 1 + +[*Crystal Forest Shore] + +# Enable/ Disable Crystal Forest Shore Biome +# Disabling this biome might result in missing recipes. +everness_crystal_forest_shore (Crystal Forest Shore) bool true + +# Upper limit for biome. +everness_crystal_forest_shore_y_max (y max) int 0 + +# Lower limit for biome. +everness_crystal_forest_shore_y_min (y min) int -1 + +[*Crystal Forest Ocean] + +# Enable/ Disable Crystal Forest Ocean Biome +# Disabling this biome might result in missing recipes. +everness_crystal_forest_ocean (Crystal Forest Ocean) bool true + +# Upper limit for biome. +everness_crystal_forest_ocean_y_max (y max) int -2 + +# Lower limit for biome. +everness_crystal_forest_ocean_y_min (y min) int -10 + +[*Crystal Forest Deep Ocean] + +# Enable/ Disable Crystal Forest Deep Ocean Biome +# Disabling this biome might result in missing recipes. +everness_crystal_forest_deep_ocean (Crystal Forest Deep Ocean) bool true + +# Upper limit for biome. +everness_crystal_forest_deep_ocean_y_max (y max) int -11 + +# Lower limit for biome. +everness_crystal_forest_deep_ocean_y_min (y min) int -255 + +[*Crystal Forest Under] + +# Enable/ Disable Crystal Forest Under Biome +# Disabling this biome might result in missing recipes. +everness_crystal_forest_under (Crystal Forest Under) bool true + +# Upper limit for biome. +everness_crystal_forest_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_crystal_forest_under_y_min (y min) int -31000 + +[*Bamboo Forest] + +# Enable/ Disable Bamboo Forest Biome +# Disabling this biome might result in missing recipes. +everness_bamboo_forest (Bamboo Forest) bool true + +# Upper limit for biome. +everness_bamboo_forest_y_max (y max) int 31000 + +# Lower limit for biome. +everness_bamboo_forest_y_min (y min) int 1 + +[*Bamboo Forest Under] + +# Enable/ Disable Bamboo Forest Under Biome +# Disabling this biome might result in missing recipes. +everness_bamboo_forest_under (Bamboo Forest Under) bool true + +# Upper limit for biome. +everness_bamboo_forest_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_bamboo_forest_under_y_min (y min) int -31000 + +[*Forsaken Desert] + +# Enable/ Disable Forsaken Desert Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_desert (Forsaken Desert) bool true + +# Upper limit for biome. +everness_forsaken_desert_y_max (y max) int 31000 + +# Lower limit for biome. +everness_forsaken_desert_y_min (y min) int 4 + +[*Forsaken Desert Ocean] + +# Enable/ Disable Forsaken Desert Ocean Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_desert_ocean (Forsaken Desert Ocean) bool true + +# Upper limit for biome. +everness_forsaken_desert_ocean_y_max (y max) int 3 + +# Lower limit for biome. +everness_forsaken_desert_ocean_y_min (y min) int -8 + +[*Forsaken Desert Under] + +# Enable/ Disable Forsaken Desert Under Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_desert_under (Forsaken Desert Under) bool true + +# Upper limit for biome. +everness_forsaken_desert_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_forsaken_desert_under_y_min (y min) int -31000 + +[*Baobab Savanna] + +# Enable/ Disable Baobab Savanna Biome +# Disabling this biome might result in missing recipes. +everness_baobab_savanna (Baobab Savanna) bool true + +# Upper limit for biome. +everness_baobab_savanna_y_max (y max) int 31000 + +# Lower limit for biome. +everness_baobab_savanna_y_min (y min) int 1 + +[*Forsaken Tundra] + +# Enable/ Disable Forsaken Tundra Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_tundra (Forsaken Tundra) bool true + +# Upper limit for biome. +everness_forsaken_tundra_y_max (y max) int 31000 + +# Lower limit for biome. +everness_forsaken_tundra_y_min (y min) int 2 + +[*Forsaken Tundra Beach] + +# Enable/ Disable Forsaken Tundra Beach Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_tundra_beach (Forsaken Tundra Beach) bool true + +# Upper limit for biome. +everness_forsaken_tundra_beach_y_max (y max) int 1 + +# Lower limit for biome. +everness_forsaken_tundra_beach_y_min (y min) int -3 + +[*Forsaken Tundra Ocean] + +# Enable/ Disable Forsaken Tundra Ocean Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_tundra_ocean (Forsaken Tundra Ocean) bool true + +# Upper limit for biome. +everness_forsaken_tundra_ocean_y_max (y max) int -4 + +# Lower limit for biome. +everness_forsaken_tundra_ocean_y_min (y min) int -255 + +[*Forsaken Tundra Under] + +# Enable/ Disable Forsaken Tundra Under Biome +# Disabling this biome might result in missing recipes. +everness_forsaken_tundra_under (Forsaken Tundra Under) bool true + +# Upper limit for biome. +everness_forsaken_tundra_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_forsaken_tundra_under_y_min (y min) int -31000 + +[*Mineral Waters] + +# Enable/ Disable Mineral Waters Biome +# Disabling this biome might result in missing recipes. +everness_mineral_waters (Mineral Waters) bool true + +# Upper limit for biome. +everness_mineral_waters_y_max (y max) int 31000 + +# Lower limit for biome. +everness_mineral_waters_y_min (y min) int 1 + +[*Mineral Waters Under] + +# Enable/ Disable Mineral Waters Under Biome +# Disabling this biome might result in missing recipes. +everness_mineral_waters_under (Mineral Waters) bool true + +# Upper limit for biome. +everness_mineral_waters_under_y_max (y max) int -256 + +# Lower limit for biome. +everness_mineral_waters_under_y_min (y min) int -31000 + +[Features] + +# Enable/ Disable Item pick up with sneak key +# [Shift + E + Q] single drop item +everness_feature_sneak_pickup (Sneak Pickup) bool true + +# Enable/ Disable Skybox +# This shows custom sun/moon/sky colors/stars/clouds... +# based on the biome, so each new biome has +# unique feeling and experience. +everness_feature_skybox (Skybox) bool true + +# Enable/Disable More Blocks (circular saw / Stairs+) integration for Everness blocks. +# When enabled and the 'moreblocks' mod is present, all Everness building blocks +# can be cut in the circular saw into 48 shape variations (slopes, microblocks, panels). +# Disabling this falls back to standard simple stairs and slabs, which saves memory +# and avoids registering ~3,300 additional shape nodes on resource-constrained servers. +everness_enable_moreblocks (More Blocks Integration) bool true diff --git a/mods/everness/skybox.lua b/mods/everness/skybox.lua new file mode 100644 index 0000000..ca9d954 --- /dev/null +++ b/mods/everness/skybox.lua @@ -0,0 +1,1014 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2022 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local skybox_defs = { + ['everness:cursed_lands'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#89ADB1', + day_horizon = '#A9CDD1', + dawn_sky = '#A5C9CD', + dawn_horizon = '#AACED2', + night_sky = '#416569', + night_horizon = '#6A8E92', + indoors = '#4A6E72', + fog_sun_tint = '#7CA0A4', + fog_moon_tint = '#7DA1A5' + } + }, + sun_parameters = { + scale = 1.57, + texture = 'everness_cursed_lands_sun.png', + sunrise = 'everness_cursed_lands_sunrisebg.png', + tonemap = 'everness_cursed_lands_sun_tonemap.png' + }, + moon_parameters = { + scale = 1.57, + texture = 'everness_cursed_lands_moon.png', + tonemap = 'everness_cursed_lands_moon_tonemap.png' + }, + cloud_parameters = { + density = 0.7, + color = '#A9CDD1E5', + speed = { x = -2, z = -2 } + } + }, + ['everness:cursed_lands_dunes'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#89ADB1', + day_horizon = '#A9CDD1', + dawn_sky = '#A5C9CD', + dawn_horizon = '#AACED2', + night_sky = '#416569', + night_horizon = '#6A8E92', + indoors = '#4A6E72', + fog_sun_tint = '#7CA0A4', + fog_moon_tint = '#7DA1A5' + } + }, + sun_parameters = { + texture = 'everness_cursed_lands_sun.png', + scale = 1.57, + sunrise = 'everness_cursed_lands_sunrisebg.png', + tonemap = 'everness_cursed_lands_sun_tonemap.png' + }, + moon_parameters = { + texture = 'everness_cursed_lands_moon.png', + tonemap = 'everness_cursed_lands_moon_tonemap.png' + }, + cloud_parameters = { + density = 0.7, + color = '#A9CDD1E5', + speed = { x = -2, z = -2 } + } + }, + ['everness:cursed_lands_swamp'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#89ADB1', + day_horizon = '#A9CDD1', + dawn_sky = '#A5C9CD', + dawn_horizon = '#AACED2', + night_sky = '#416569', + night_horizon = '#6A8E92', + indoors = '#4A6E72', + fog_sun_tint = '#7CA0A4', + fog_moon_tint = '#7DA1A5' + } + }, + sun_parameters = { + texture = 'everness_cursed_lands_sun.png', + scale = 1.57, + sunrise = 'everness_cursed_lands_sunrisebg.png', + tonemap = 'everness_cursed_lands_sun_tonemap.png' + }, + moon_parameters = { + texture = 'everness_cursed_lands_moon.png', + tonemap = 'everness_cursed_lands_moon_tonemap.png' + }, + cloud_parameters = { + density = 0.7, + color = '#A9CDD1E5', + speed = { x = -2, z = -2 } + } + }, + ['everness:cursed_lands_ocean'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#89ADB1', + day_horizon = '#A9CDD1', + dawn_sky = '#A5C9CD', + dawn_horizon = '#AACED2', + night_sky = '#416569', + night_horizon = '#6A8E92', + indoors = '#4A6E72', + fog_sun_tint = '#7CA0A4', + fog_moon_tint = '#7DA1A5' + } + }, + sun_parameters = { + texture = 'everness_cursed_lands_sun.png', + scale = 1.57, + sunrise = 'everness_cursed_lands_sunrisebg.png', + tonemap = 'everness_cursed_lands_sun_tonemap.png' + }, + moon_parameters = { + texture = 'everness_cursed_lands_moon.png', + tonemap = 'everness_cursed_lands_moon_tonemap.png' + }, + cloud_parameters = { + density = 0.7, + color = '#A9CDD1E5', + speed = { x = -2, z = -2 } + } + }, + ['everness:cursed_lands_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#89ADB1', + day_horizon = '#A9CDD1', + dawn_sky = '#A5C9CD', + dawn_horizon = '#AACED2', + night_sky = '#416569', + night_horizon = '#6A8E92', + indoors = '#4A6E72', + fog_sun_tint = '#7CA0A4', + fog_moon_tint = '#7DA1A5' + } + }, + sun_parameters = { + texture = 'everness_cursed_lands_sun.png', + scale = 1.57, + sunrise = 'everness_cursed_lands_sunrisebg.png', + tonemap = 'everness_cursed_lands_sun_tonemap.png' + }, + moon_parameters = { + texture = 'everness_cursed_lands_moon.png', + tonemap = 'everness_cursed_lands_moon_tonemap.png' + }, + cloud_parameters = { + density = 0.7, + color = '#A9CDD1E5', + speed = { x = -2, z = -2 } + } + }, + ['everness:coral_forest'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#C492A5', + day_sky = '#61B5F5', + day_horizon = '#E4B2C5', + dawn_sky = '#E0AEC1', + dawn_horizon = '#E5B3C6', + night_sky = '#7C4A5D', + night_horizon = '#A57386', + indoors = '#855366', + fog_sun_tint = '#B78598', + fog_moon_tint = '#B88699' + } + }, + sun_parameters = { + texture = 'everness_coral_forest_sun.png', + scale = 1.57, + tonemap = 'everness_coral_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:coral_forest_dunes'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#C492A5', + day_sky = '#61B5F5', + day_horizon = '#E4B2C5', + dawn_sky = '#E0AEC1', + dawn_horizon = '#E5B3C6', + night_sky = '#7C4A5D', + night_horizon = '#A57386', + indoors = '#855366', + fog_sun_tint = '#B78598', + fog_moon_tint = '#B88699' + } + }, + sun_parameters = { + texture = 'everness_coral_forest_sun.png', + scale = 1.57, + tonemap = 'everness_coral_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:coral_forest_ocean'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#C492A5', + day_sky = '#61B5F5', + day_horizon = '#E4B2C5', + dawn_sky = '#E0AEC1', + dawn_horizon = '#E5B3C6', + night_sky = '#7C4A5D', + night_horizon = '#A57386', + indoors = '#855366', + fog_sun_tint = '#B78598', + fog_moon_tint = '#B88699' + } + }, + sun_parameters = { + texture = 'everness_coral_forest_sun.png', + scale = 1.57, + tonemap = 'everness_coral_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:coral_forest_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#C492A5', + day_sky = '#61B5F5', + day_horizon = '#E4B2C5', + dawn_sky = '#E0AEC1', + dawn_horizon = '#E5B3C6', + night_sky = '#7C4A5D', + night_horizon = '#A57386', + indoors = '#855366', + fog_sun_tint = '#B78598', + fog_moon_tint = '#B88699' + } + }, + }, + ['everness:bamboo_forest'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#5DD35D', + day_sky = '#61B5F5', + day_horizon = '#BFFFBF', + -- dawn_sky = '#79EF79', + dawn_sky = '#B4BAFA', + dawn_horizon = '#7EF47E', + -- night_sky = '#158B15', + night_sky = '#006BFF', + night_horizon = '#3EB43E', + indoors = '#1E941E', + fog_sun_tint = '#50C650', + fog_moon_tint = '#51C751' + } + }, + sun_parameters = { + texture = 'everness_bamboo_forest_sun.png', + scale = 1.57, + tonemap = 'everness_bamboo_forest_sun_tonemap.png', + sunrise = 'everness_bamboo_forest_sunrisebg.png', + }, + }, + ['everness:bamboo_forest_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#5DD35D', + day_sky = '#61B5F5', + day_horizon = '#BFFFBF', + -- dawn_sky = '#79EF79', + dawn_sky = '#B4BAFA', + dawn_horizon = '#7EF47E', + -- night_sky = '#158B15', + night_sky = '#006BFF', + night_horizon = '#3EB43E', + indoors = '#1E941E', + fog_sun_tint = '#50C650', + fog_moon_tint = '#51C751' + } + }, + }, + ['everness:frosted_icesheet'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#9DA4AA', + day_horizon = '#BDC4CA', + dawn_sky = '#B9C0C6', + dawn_horizon = '#BEC5CB', + night_sky = '#555C62', + night_horizon = '#7E858B', + indoors = '#5E656B', + fog_sun_tint = '#90979D', + fog_moon_tint = '#91989E' + } + }, + sun_parameters = { + texture = 'everness_frosted_icesheet_sun.png', + scale = 1.57, + tonemap = 'everness_frosted_icesheet_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:frosted_icesheet_ocean'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#9DA4AA', + day_horizon = '#BDC4CA', + dawn_sky = '#B9C0C6', + dawn_horizon = '#BEC5CB', + night_sky = '#555C62', + night_horizon = '#7E858B', + indoors = '#5E656B', + fog_sun_tint = '#90979D', + fog_moon_tint = '#91989E' + } + }, + sun_parameters = { + texture = 'everness_frosted_icesheet_sun.png', + scale = 1.57, + tonemap = 'everness_frosted_icesheet_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:frosted_icesheet_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#9DA4AA', + day_horizon = '#BDC4CA', + dawn_sky = '#B9C0C6', + dawn_horizon = '#BEC5CB', + night_sky = '#555C62', + night_horizon = '#7E858B', + indoors = '#5E656B', + fog_sun_tint = '#90979D', + fog_moon_tint = '#91989E' + } + }, + }, + ['everness:crystal_forest'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#B992C5', + day_sky = '#61B5F5', + day_horizon = '#D9B2E5', + dawn_sky = '#D5AEE1', + dawn_horizon = '#DAB3E6', + night_sky = '#714A7D', + night_horizon = '#9A73A6', + indoors = '#7A5386', + fog_sun_tint = '#AC85B8', + fog_moon_tint = '#AD86B9' + } + }, + moon_parameters = { + texture = 'everness_crystal_forest_moon.png', + tonemap = 'everness_crystal_forest_moon_tonemap.png' + }, + star_parameters = { + count = 6000, + scale = 0.5 + }, + sun_parameters = { + texture = 'everness_crystal_forest_sun.png', + scale = 1.57, + tonemap = 'everness_crystal_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:crystal_forest_dunes'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#B992C5', + day_sky = '#61B5F5', + day_horizon = '#D9B2E5', + dawn_sky = '#D5AEE1', + dawn_horizon = '#DAB3E6', + night_sky = '#714A7D', + night_horizon = '#9A73A6', + indoors = '#7A5386', + fog_sun_tint = '#AC85B8', + fog_moon_tint = '#AD86B9' + } + }, + moon_parameters = { + texture = 'everness_crystal_forest_moon.png', + tonemap = 'everness_crystal_forest_moon_tonemap.png' + }, + star_parameters = { + count = 6000, + scale = 0.5 + }, + sun_parameters = { + texture = 'everness_crystal_forest_sun.png', + scale = 1.57, + tonemap = 'everness_crystal_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:crystal_forest_shore'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#B992C5', + day_sky = '#61B5F5', + day_horizon = '#D9B2E5', + dawn_sky = '#D5AEE1', + dawn_horizon = '#DAB3E6', + night_sky = '#714A7D', + night_horizon = '#9A73A6', + indoors = '#7A5386', + fog_sun_tint = '#AC85B8', + fog_moon_tint = '#AD86B9' + } + }, + moon_parameters = { + texture = 'everness_crystal_forest_moon.png', + tonemap = 'everness_crystal_forest_moon_tonemap.png' + }, + star_parameters = { + count = 6000, + scale = 0.5 + }, + sun_parameters = { + texture = 'everness_crystal_forest_sun.png', + scale = 1.57, + tonemap = 'everness_crystal_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:crystal_forest_ocean'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#B992C5', + day_sky = '#61B5F5', + day_horizon = '#D9B2E5', + dawn_sky = '#D5AEE1', + dawn_horizon = '#DAB3E6', + night_sky = '#714A7D', + night_horizon = '#9A73A6', + indoors = '#7A5386', + fog_sun_tint = '#AC85B8', + fog_moon_tint = '#AD86B9' + } + }, + moon_parameters = { + texture = 'everness_crystal_forest_moon.png', + tonemap = 'everness_crystal_forest_moon_tonemap.png' + }, + star_parameters = { + count = 6000, + scale = 0.5 + }, + sun_parameters = { + texture = 'everness_crystal_forest_sun.png', + scale = 1.57, + tonemap = 'everness_crystal_forest_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:crystal_forest_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + -- day_sky = '#B992C5', + day_sky = '#61B5F5', + day_horizon = '#D9B2E5', + dawn_sky = '#D5AEE1', + dawn_horizon = '#DAB3E6', + night_sky = '#714A7D', + night_horizon = '#9A73A6', + indoors = '#7A5386', + fog_sun_tint = '#AC85B8', + fog_moon_tint = '#AD86B9' + } + }, + star_parameters = { + count = 6000, + scale = 0.5 + } + }, + ['everness:forsaken_desert'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#D5946E', + day_horizon = '#F5B48E', + dawn_sky = '#F1B08A', + dawn_horizon = '#F6B58F', + night_sky = '#8D4C26', + night_horizon = '#B6754F', + indoors = '#96552F', + fog_sun_tint = '#C88761', + fog_moon_tint = '#C98862' + } + }, + sun_parameters = { + texture = 'everness_forsaken_desert_sun.png', + scale = 3.14, + tonemap = 'everness_forsaken_desert_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:forsaken_desert_ocean'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#D5946E', + day_horizon = '#F5B48E', + dawn_sky = '#F1B08A', + dawn_horizon = '#F6B58F', + night_sky = '#8D4C26', + night_horizon = '#B6754F', + indoors = '#96552F', + fog_sun_tint = '#C88761', + fog_moon_tint = '#C98862' + } + }, + sun_parameters = { + texture = 'everness_forsaken_desert_sun.png', + scale = 3.14, + tonemap = 'everness_forsaken_desert_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:forsaken_desert_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#D5946E', + day_horizon = '#F5B48E', + dawn_sky = '#F1B08A', + dawn_horizon = '#F6B58F', + night_sky = '#8D4C26', + night_horizon = '#B6754F', + indoors = '#96552F', + fog_sun_tint = '#C88761', + fog_moon_tint = '#C98862' + } + } + }, + ['everness:baobab_savanna'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#C4A156', + day_horizon = '#E4C176', + dawn_sky = '#E0BD72', + dawn_horizon = '#E5C277', + night_sky = '#7C590E', + night_horizon = '#A58237', + indoors = '#856217', + fog_sun_tint = '#B79449', + fog_moon_tint = '#B8954A' + } + }, + sun_parameters = { + texture = 'everness_baobab_savanna_sun.png', + scale = 1.57, + tonemap = '', + sunrise = '' + }, + }, + ['everness:forsaken_tundra'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#A3A49F', + -- day_sky = '#CAA339', + day_horizon = '#EAC359', + dawn_sky = '#E6BF55', + dawn_horizon = '#EBC45A', + -- night_sky = '#5B5C57', + night_sky = '#7C5B01', + night_horizon = '#AB841A', + indoors = '#896401', + fog_sun_tint = '#BD962C', + fog_moon_tint = '#BE972D' + } + }, + sun_parameters = { + texture = 'everness_forsaken_tundra_sun.png', + scale = 1.57, + tonemap = 'everness_forsaken_tundra_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:forsaken_tundra_beach'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#A3A49F', + -- day_sky = '#CAA339', + day_horizon = '#EAC359', + dawn_sky = '#E6BF55', + dawn_horizon = '#EBC45A', + -- night_sky = '#5B5C57', + night_sky = '#7C5B01', + night_horizon = '#AB841A', + indoors = '#896401', + fog_sun_tint = '#BD962C', + fog_moon_tint = '#BE972D' + } + }, + sun_parameters = { + texture = 'everness_forsaken_tundra_sun.png', + scale = 1.57, + tonemap = 'everness_forsaken_tundra_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:forsaken_tundra_ocean'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#A3A49F', + -- day_sky = '#CAA339', + day_horizon = '#EAC359', + dawn_sky = '#E6BF55', + dawn_horizon = '#EBC45A', + -- night_sky = '#5B5C57', + night_sky = '#7C5B01', + night_horizon = '#AB841A', + indoors = '#896401', + fog_sun_tint = '#BD962C', + fog_moon_tint = '#BE972D' + } + }, + sun_parameters = { + texture = 'everness_forsaken_tundra_sun.png', + scale = 1.57, + tonemap = 'everness_forsaken_tundra_sun_tonemap.png', + sunrise = '' + }, + }, + ['everness:forsaken_tundra_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#A3A49F', + -- day_sky = '#CAA339', + day_horizon = '#EAC359', + dawn_sky = '#E6BF55', + dawn_horizon = '#EBC45A', + -- night_sky = '#5B5C57', + night_sky = '#7C5B01', + night_horizon = '#AB841A', + indoors = '#896401', + fog_sun_tint = '#BD962C', + fog_moon_tint = '#BE972D' + } + } + }, + ['everness:mineral_waters'] = { + sky_parameters = { + -- type = 'regular', + -- sky_color = { + -- day_sky = '#264890', + -- day_horizon = '#3884CF', + -- dawn_sky = '#B4BAFA', + -- dawn_horizon = '#FDA47E', + -- night_sky = '#A3609E', + -- night_horizon = '#C7A8D9', + -- fog_sun_tint = '#FDA47E', + -- fog_moon_tint = '#FAE0EB' + -- }, + type = 'skybox', + base_color = '#8099CC', + _day_base_color = '#8099CC', + _night_base_color = '#000714', + _textures_base = { + -- Y+ (top) + 'everness_mineral_waters_skybox.png^[sheet:4x3:1,0', + -- Y- (bottom) + 'everness_mineral_waters_skybox.png^[sheet:4x3:1,2', + -- X- (west) + 'everness_mineral_waters_skybox.png^[sheet:4x3:0,1', + -- X+ (east) + 'everness_mineral_waters_skybox.png^[sheet:4x3:2,1', + -- Z+ (north) + 'everness_mineral_waters_skybox.png^[sheet:4x3:1,1', + -- Z- (south) + 'everness_mineral_waters_skybox.png^[sheet:4x3:3,1', + }, + textures = { + -- Y+ (top) + 'everness_mineral_waters_skybox.png^[sheet:4x3:1,0', + -- Y- (bottom) + 'everness_mineral_waters_skybox.png^[sheet:4x3:1,2', + -- X- (west) + 'everness_mineral_waters_skybox.png^[sheet:4x3:0,1', + -- X+ (east) + 'everness_mineral_waters_skybox.png^[sheet:4x3:2,1', + -- Z+ (north) + 'everness_mineral_waters_skybox.png^[sheet:4x3:1,1', + -- Z- (south) + 'everness_mineral_waters_skybox.png^[sheet:4x3:3,1', + }, + clouds = false + }, + star_parameters = { + count = 12000, + scale = 0.5 + }, + }, + ['everness:mineral_waters_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#8B1408', + day_horizon = '#b2380a', + dawn_sky = '#8B1408', + dawn_horizon = '#b2380a', + night_sky = '#A3609E', + night_horizon = '#C7A8D9', + fog_sun_tint = '#8B1408', + fog_moon_tint = '#520E49' + } + }, + particlespawner = { + amount = 100, + time = 0, + size = { + min = 1, + max = 2 + }, + node = { name = 'everness:mineral_lava_stone' }, + node_tile = 1, + glow = 100, + pos = { + min = vector.new(-50, -50, -50), + max = vector.new(50, 50, 50) + }, + jitter = { + min = vector.new(-1, -1, -1), + max = vector.new(1, 1, 1) + }, + vel = { + min = vector.new(-1, -1, -1), + max = vector.new(1, 1, 1) + }, + exptime = { + min = 5, + max = 10 + }, + collisiondetection = true, + collision_removal = true + } + }, +} + +local PLAYER_STATES = {} + +local function get_player_state(player_name) + local state = PLAYER_STATES[player_name] + if not state then + state = { + biome_name = '', + is_underground = 0, + timeofday = 0, + is_day = 1, + particlespawner_id = 0, + last_pos = nil, + current_biome_name = nil + } + PLAYER_STATES[player_name] = state + end + return state +end + +local function should_flip(player, state) + local player_time = state.timeofday + -- 0 not defined + -- 1 morning + -- 2 afternoon + local current_time = core.get_timeofday() < 0.5 and 1 or 2 + local flip = current_time ~= player_time + + state.timeofday = current_time + + return { + should_flip = flip, + current_time = current_time + } +end + +local timer = 0 + +core.register_globalstep(function(dtime) + timer = timer + dtime + + if timer > 5 then + local players = core.get_connected_players() + local tod = core.get_timeofday() + local is_day = (tod > 0.2 and tod < 0.805) + + for _, player in ipairs(players) do + if player and player:is_player() then + local player_name = player:get_player_name() + local state = get_player_state(player_name) + local player_pos = player:get_pos() + + local rounded_pos = vector.round(player_pos) + if not state.last_pos or not vector.equals(state.last_pos, rounded_pos) then + state.last_pos = rounded_pos + local biome_data = core.get_biome_data(player_pos) + if biome_data and biome_data.biome then + state.current_biome_name = core.get_biome_name(biome_data.biome) + end + end + + local biome_name = state.current_biome_name + if biome_name then + local player_biome_name = state.biome_name + local is_underground = state.is_underground + local player_is_day = state.is_day == 1 + local should_flip_data = should_flip(player, state) + local biome_changed = (player_biome_name ~= biome_name) + + -- flip sun/moon when morning/afternoon + if not biome_changed and should_flip_data.should_flip then + if skybox_defs[biome_name] and skybox_defs[biome_name].sun_parameters then + local sun_params = table.copy(skybox_defs[biome_name].sun_parameters) + + if should_flip_data.current_time == 2 then + sun_params.texture = sun_params.texture .. '^[transformFY' + end + + player:set_sun(sun_params) + end + end + + -- Change skybox params + if biome_changed then + state.biome_name = biome_name + player_biome_name = biome_name + + if skybox_defs[biome_name] then + if skybox_defs[biome_name].sun_parameters then + local sun_params = table.copy(skybox_defs[biome_name].sun_parameters) + + -- flip sun when afternoon + if should_flip_data.current_time == 2 then + sun_params.texture = sun_params.texture .. '^[transformFY' + end + + player:set_sun(sun_params) + else + player:set_sun() + end + + if skybox_defs[biome_name].moon_parameters then + player:set_moon(skybox_defs[biome_name].moon_parameters) + else + player:set_moon() + end + + if skybox_defs[biome_name].star_parameters then + player:set_stars(skybox_defs[biome_name].star_parameters) + else + player:set_stars() + end + + if skybox_defs[biome_name].sky_parameters then + player:set_sky(skybox_defs[biome_name].sky_parameters) + else + player:set_sky() + end + + if skybox_defs[biome_name].cloud_parameters then + player:set_clouds(skybox_defs[biome_name].cloud_parameters) + else + player:set_clouds() + end + + if skybox_defs[biome_name].particlespawner then + if state.particlespawner_id ~= 0 then + core.delete_particlespawner(state.particlespawner_id) + state.particlespawner_id = 0 + end + + local pdef = table.copy(skybox_defs[biome_name].particlespawner) + pdef.attached = player + pdef.playername = player_name + + local pid = core.add_particlespawner(pdef) + state.particlespawner_id = pid or 0 + else + if state.particlespawner_id ~= 0 then + core.delete_particlespawner(state.particlespawner_id) + state.particlespawner_id = 0 + end + end + else + player:set_sun() + player:set_moon() + player:set_stars() + player:set_sky() + player:set_clouds() + + if state.particlespawner_id ~= 0 then + core.delete_particlespawner(state.particlespawner_id) + state.particlespawner_id = 0 + end + end + end + + -- change day/night params + if player_biome_name == biome_name and player_is_day ~= is_day then + if skybox_defs[biome_name] then + if skybox_defs[biome_name].sky_parameters then + if skybox_defs[biome_name].sky_parameters.type == 'skybox' then + state.is_day = is_day and 1 or 0 + + if is_day then + for i, v in ipairs(skybox_defs[biome_name].sky_parameters.textures) do + skybox_defs[biome_name].sky_parameters.base_color = skybox_defs[biome_name].sky_parameters._day_base_color + skybox_defs[biome_name].sky_parameters.textures[i] = skybox_defs[biome_name].sky_parameters._textures_base[i] + end + else + for i, v in ipairs(skybox_defs[biome_name].sky_parameters.textures) do + skybox_defs[biome_name].sky_parameters.base_color = skybox_defs[biome_name].sky_parameters._night_base_color + skybox_defs[biome_name].sky_parameters.textures[i] = skybox_defs[biome_name].sky_parameters._textures_base[i] .. '^[contrast:0:-85' + end + end + + player:set_sky(skybox_defs[biome_name].sky_parameters) + end + end + end + end + + if (player_pos.y <= -256 and is_underground == 0) or (is_underground ~= 0 and biome_changed) then + -- hide sun, moon, stars ... underground + state.is_underground = 1 + + player:set_sun({ + visible = false, + sunrise_visible = false + }) + + player:set_moon({ + visible = false + }) + + player:set_stars({ + visible = false + }) + + elseif (player_pos.y > -256 and is_underground ~= 0) or (is_underground == 0 and biome_changed) then + -- show sun, moon, stars ... aboveground + state.is_underground = 0 + + player:set_sun({ + visible = true + }) + + player:set_moon({ + visible = true + }) + + player:set_stars({ + visible = true, + sunrise_visible = true + }) + end + end + end + end + + timer = 0 + end +end) + +core.register_on_joinplayer(function(player, last_login) + local name = player:get_player_name() + PLAYER_STATES[name] = nil +end) + +core.register_on_leaveplayer(function(player, timed_out) + local name = player:get_player_name() + local state = PLAYER_STATES[name] + if state and state.particlespawner_id and state.particlespawner_id ~= 0 then + core.delete_particlespawner(state.particlespawner_id) + end + PLAYER_STATES[name] = nil +end) diff --git a/mods/everness/sneak_pickup.lua b/mods/everness/sneak_pickup.lua new file mode 100644 index 0000000..91440e8 --- /dev/null +++ b/mods/everness/sneak_pickup.lua @@ -0,0 +1,194 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2026 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. +--]] + +local TIMER = 0 +local PLAYER_SNEAKING = {} +local PLAYER_DELAY = {} + +-- Hook core.item_drop so throwing items (Q or Shift+Q) applies a cooldown +local old_item_drop = core.item_drop +core.item_drop = function(itemstack, dropper, pos) + if dropper and type(dropper) == "userdata" and dropper.is_player and dropper:is_player() then + local name = dropper:get_player_name() + if name and name ~= "" then + PLAYER_DELAY[name] = 1.5 + end + end + return old_item_drop(itemstack, dropper, pos) +end + +local function pick_dropped_items(player) + local inv = player:get_inventory() + if not inv then + return + end + + local pos = player:get_pos() + if not pos then + return + end + + local objects = core.get_objects_inside_radius(pos, 4) + if not objects or #objects == 0 then + return + end + + local objects_to_collect = {} + + -- filter - leave only uncollected builtin items (ignore items in flight for 0.8s) + for i = 1, #objects do + local object = objects[i] + if not object:is_player() then + local luaentity = object:get_luaentity() + if luaentity + and luaentity.name == '__builtin:item' + and luaentity.itemstring ~= '' + and not luaentity._being_collected + and (luaentity.age or 0) >= 0.8 + then + objects_to_collect[#objects_to_collect + 1] = object + end + end + end + + if #objects_to_collect == 0 then + return + end + + -- sort with the oldest objects first + if #objects_to_collect > 1 then + table.sort(objects_to_collect, function(a, b) + local ea = a:get_luaentity() + local eb = b:get_luaentity() + return (eb and eb.age or 0) < (ea and ea.age or 0) + end) + end + + for i = 1, #objects_to_collect do + local object = objects_to_collect[i] + local luaentity = object:get_luaentity() + + if luaentity and not luaentity._being_collected and luaentity.itemstring ~= '' then + local itemstack = ItemStack(luaentity.itemstring) + local leftover_stack = inv:add_item('main', itemstack) + local stack_count_prev = itemstack:get_count() + local stack_count_leftover = leftover_stack:get_count() + + if leftover_stack and stack_count_prev ~= stack_count_leftover then + -- Collect item / Item fits in the inventory + local pos_obj = object:get_pos() + + if stack_count_leftover ~= 0 then + core.spawn_item(pos_obj, leftover_stack:to_string()) + end + + luaentity.itemstring = '' + luaentity._being_collected = true + object:set_acceleration({ x = 0, y = 0, z = 0 }) + object:set_velocity({ x = 0, y = 0, z = 0 }) + luaentity.physical_state = false + luaentity.object:set_properties({ + physical = false, + selectionbox = { 0, 0, 0, 0, 0, 0 }, + collisionbox = { 0, 0, 0, 0, 0, 0 } + }) + + object:move_to(vector.new(pos.x, pos.y + 1.25, pos.z)) + + core.sound_play('everness_item_drop_pickup', { + pos = pos, + max_hear_distance = 16, + gain = 0.4, + }) + + core.after(0, function(v_object) + if v_object and v_object:get_luaentity() then + v_object:remove() + end + end, object) + end + end + end +end + +core.register_on_joinplayer(function(player) + local name = player:get_player_name() + PLAYER_SNEAKING[name] = false + PLAYER_DELAY[name] = 0 +end) + +core.register_on_leaveplayer(function(player) + local name = player:get_player_name() + PLAYER_SNEAKING[name] = nil + PLAYER_DELAY[name] = nil +end) + +core.register_globalstep(function(dtime) + TIMER = TIMER + dtime + if TIMER < 0.25 then + return + end + + local dt = TIMER + TIMER = 0 + + local players = core.get_connected_players() + if #players == 0 then + return + end + + local damage_enabled = core.settings:get_bool('enable_damage', true) + + for i = 1, #players do + local player = players[i] + local player_name = player:get_player_name() + local control = player:get_player_control() + local player_hp = player:get_hp() + local is_sneaking = PLAYER_SNEAKING[player_name] or false + local p_delay = PLAYER_DELAY[player_name] or 0 + + if p_delay > 0 then + p_delay = math.max(0, p_delay - dt) + PLAYER_DELAY[player_name] = p_delay + end + + if control.sneak and (player_hp > 0 or not damage_enabled) then + if p_delay == 0 then + pick_dropped_items(player) + end + end + + -- Hide nametag when sneaking + if control.sneak ~= is_sneaking then + if control.sneak and player_hp > 0 then + local nametag_tbl = player:get_nametag_attributes() + if nametag_tbl and nametag_tbl.color then + nametag_tbl.color.a = 0 + player:set_nametag_attributes(nametag_tbl) + end + player:set_properties{ makes_footstep_sound = false } + else + local nametag_tbl = player:get_nametag_attributes() + if nametag_tbl and nametag_tbl.color then + nametag_tbl.color.a = 255 + player:set_nametag_attributes(nametag_tbl) + end + player:set_properties{ makes_footstep_sound = true } + end + + PLAYER_SNEAKING[player_name] = control.sneak + end + end +end) diff --git a/mods/everness/sounds/everness_ambience_cave_1.ogg b/mods/everness/sounds/everness_ambience_cave_1.ogg new file mode 100644 index 0000000..f000e4e Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_2.ogg b/mods/everness/sounds/everness_ambience_cave_2.ogg new file mode 100644 index 0000000..9265854 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_3.ogg b/mods/everness/sounds/everness_ambience_cave_3.ogg new file mode 100644 index 0000000..df94607 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_4.ogg b/mods/everness/sounds/everness_ambience_cave_4.ogg new file mode 100644 index 0000000..5f7cd3b Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_5.ogg b/mods/everness/sounds/everness_ambience_cave_5.ogg new file mode 100644 index 0000000..dfdf8bd Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_5.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_6.ogg b/mods/everness/sounds/everness_ambience_cave_6.ogg new file mode 100644 index 0000000..286e78b Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_6.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_7.ogg b/mods/everness/sounds/everness_ambience_cave_7.ogg new file mode 100644 index 0000000..d9852e6 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_7.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_8.ogg b/mods/everness/sounds/everness_ambience_cave_8.ogg new file mode 100644 index 0000000..ef4eaa0 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_8.ogg differ diff --git a/mods/everness/sounds/everness_ambience_cave_9.ogg b/mods/everness/sounds/everness_ambience_cave_9.ogg new file mode 100644 index 0000000..0b53eca Binary files /dev/null and b/mods/everness/sounds/everness_ambience_cave_9.ogg differ diff --git a/mods/everness/sounds/everness_ambience_creepy_cave_1.ogg b/mods/everness/sounds/everness_ambience_creepy_cave_1.ogg new file mode 100644 index 0000000..ae09847 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_creepy_cave_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ghost_1.ogg b/mods/everness/sounds/everness_ambience_ghost_1.ogg new file mode 100644 index 0000000..4de66e7 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ghost_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ghost_2.ogg b/mods/everness/sounds/everness_ambience_ghost_2.ogg new file mode 100644 index 0000000..e3f6571 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ghost_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ghost_3.ogg b/mods/everness/sounds/everness_ambience_ghost_3.ogg new file mode 100644 index 0000000..cb05566 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ghost_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ghost_4.ogg b/mods/everness/sounds/everness_ambience_ghost_4.ogg new file mode 100644 index 0000000..2c37e53 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ghost_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ghost_5.ogg b/mods/everness/sounds/everness_ambience_ghost_5.ogg new file mode 100644 index 0000000..39bee10 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ghost_5.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ghost_6.ogg b/mods/everness/sounds/everness_ambience_ghost_6.ogg new file mode 100644 index 0000000..1320538 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ghost_6.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_1.ogg b/mods/everness/sounds/everness_ambience_graveyard_1.ogg new file mode 100644 index 0000000..e182d8e Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_10.ogg b/mods/everness/sounds/everness_ambience_graveyard_10.ogg new file mode 100644 index 0000000..7e61b97 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_10.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_2.ogg b/mods/everness/sounds/everness_ambience_graveyard_2.ogg new file mode 100644 index 0000000..d6a906c Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_3.ogg b/mods/everness/sounds/everness_ambience_graveyard_3.ogg new file mode 100644 index 0000000..628796f Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_4.ogg b/mods/everness/sounds/everness_ambience_graveyard_4.ogg new file mode 100644 index 0000000..b866c4d Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_5.ogg b/mods/everness/sounds/everness_ambience_graveyard_5.ogg new file mode 100644 index 0000000..9233a9a Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_5.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_6.ogg b/mods/everness/sounds/everness_ambience_graveyard_6.ogg new file mode 100644 index 0000000..ad1719c Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_6.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_7.ogg b/mods/everness/sounds/everness_ambience_graveyard_7.ogg new file mode 100644 index 0000000..91bc0c5 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_7.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_8.ogg b/mods/everness/sounds/everness_ambience_graveyard_8.ogg new file mode 100644 index 0000000..91e57af Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_8.ogg differ diff --git a/mods/everness/sounds/everness_ambience_graveyard_9.ogg b/mods/everness/sounds/everness_ambience_graveyard_9.ogg new file mode 100644 index 0000000..d6360d8 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_graveyard_9.ogg differ diff --git a/mods/everness/sounds/everness_ambience_hot_stone_1.ogg b/mods/everness/sounds/everness_ambience_hot_stone_1.ogg new file mode 100644 index 0000000..cee1994 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_hot_stone_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_hot_stone_2.ogg b/mods/everness/sounds/everness_ambience_hot_stone_2.ogg new file mode 100644 index 0000000..e5c5e61 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_hot_stone_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ice_cracking_1.ogg b/mods/everness/sounds/everness_ambience_ice_cracking_1.ogg new file mode 100644 index 0000000..523e04b Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ice_cracking_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ice_cracking_2.ogg b/mods/everness/sounds/everness_ambience_ice_cracking_2.ogg new file mode 100644 index 0000000..f622980 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ice_cracking_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_ice_cracking_3.ogg b/mods/everness/sounds/everness_ambience_ice_cracking_3.ogg new file mode 100644 index 0000000..428dc5f Binary files /dev/null and b/mods/everness/sounds/everness_ambience_ice_cracking_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_monster_sigh_cave.ogg b/mods/everness/sounds/everness_ambience_monster_sigh_cave.ogg new file mode 100644 index 0000000..684feb1 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_monster_sigh_cave.ogg differ diff --git a/mods/everness/sounds/everness_ambience_night_crickets_1.ogg b/mods/everness/sounds/everness_ambience_night_crickets_1.ogg new file mode 100644 index 0000000..1cb58a8 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_night_crickets_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_night_crickets_2.ogg b/mods/everness/sounds/everness_ambience_night_crickets_2.ogg new file mode 100644 index 0000000..62283fc Binary files /dev/null and b/mods/everness/sounds/everness_ambience_night_crickets_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_night_crickets_3.ogg b/mods/everness/sounds/everness_ambience_night_crickets_3.ogg new file mode 100644 index 0000000..df45c6c Binary files /dev/null and b/mods/everness/sounds/everness_ambience_night_crickets_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_night_crickets_4.ogg b/mods/everness/sounds/everness_ambience_night_crickets_4.ogg new file mode 100644 index 0000000..501d520 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_night_crickets_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_night_crickets_5.ogg b/mods/everness/sounds/everness_ambience_night_crickets_5.ogg new file mode 100644 index 0000000..ffdaa5e Binary files /dev/null and b/mods/everness/sounds/everness_ambience_night_crickets_5.ogg differ diff --git a/mods/everness/sounds/everness_ambience_owl_1.ogg b/mods/everness/sounds/everness_ambience_owl_1.ogg new file mode 100644 index 0000000..529f61a Binary files /dev/null and b/mods/everness/sounds/everness_ambience_owl_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_rocks_falling_cave.ogg b/mods/everness/sounds/everness_ambience_rocks_falling_cave.ogg new file mode 100644 index 0000000..d4e57fc Binary files /dev/null and b/mods/everness/sounds/everness_ambience_rocks_falling_cave.ogg differ diff --git a/mods/everness/sounds/everness_ambience_snow_storm_1.ogg b/mods/everness/sounds/everness_ambience_snow_storm_1.ogg new file mode 100644 index 0000000..bf685cc Binary files /dev/null and b/mods/everness/sounds/everness_ambience_snow_storm_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_snow_storm_2.ogg b/mods/everness/sounds/everness_ambience_snow_storm_2.ogg new file mode 100644 index 0000000..12dd47e Binary files /dev/null and b/mods/everness/sounds/everness_ambience_snow_storm_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_snow_storm_3.ogg b/mods/everness/sounds/everness_ambience_snow_storm_3.ogg new file mode 100644 index 0000000..982f8bb Binary files /dev/null and b/mods/everness/sounds/everness_ambience_snow_storm_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_snow_storm_4.ogg b/mods/everness/sounds/everness_ambience_snow_storm_4.ogg new file mode 100644 index 0000000..83cf51c Binary files /dev/null and b/mods/everness/sounds/everness_ambience_snow_storm_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_sulfur_1.ogg b/mods/everness/sounds/everness_ambience_sulfur_1.ogg new file mode 100644 index 0000000..560ee0a Binary files /dev/null and b/mods/everness/sounds/everness_ambience_sulfur_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_sulfur_2.ogg b/mods/everness/sounds/everness_ambience_sulfur_2.ogg new file mode 100644 index 0000000..32f4222 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_sulfur_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_sulfur_3.ogg b/mods/everness/sounds/everness_ambience_sulfur_3.ogg new file mode 100644 index 0000000..d71142f Binary files /dev/null and b/mods/everness/sounds/everness_ambience_sulfur_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_sulfur_4.ogg b/mods/everness/sounds/everness_ambience_sulfur_4.ogg new file mode 100644 index 0000000..367a5fb Binary files /dev/null and b/mods/everness/sounds/everness_ambience_sulfur_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_swamp_1.ogg b/mods/everness/sounds/everness_ambience_swamp_1.ogg new file mode 100644 index 0000000..8bc1a80 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_swamp_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_swamp_2.ogg b/mods/everness/sounds/everness_ambience_swamp_2.ogg new file mode 100644 index 0000000..592fb2d Binary files /dev/null and b/mods/everness/sounds/everness_ambience_swamp_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_swamp_3.ogg b/mods/everness/sounds/everness_ambience_swamp_3.ogg new file mode 100644 index 0000000..5063650 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_swamp_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_swamp_4.ogg b/mods/everness/sounds/everness_ambience_swamp_4.ogg new file mode 100644 index 0000000..7476d7c Binary files /dev/null and b/mods/everness/sounds/everness_ambience_swamp_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_water_drips_cave_1.ogg b/mods/everness/sounds/everness_ambience_water_drips_cave_1.ogg new file mode 100644 index 0000000..d909349 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_water_drips_cave_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_water_drips_cave_2.ogg b/mods/everness/sounds/everness_ambience_water_drips_cave_2.ogg new file mode 100644 index 0000000..2a38050 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_water_drips_cave_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_wind_cave_1.ogg b/mods/everness/sounds/everness_ambience_wind_cave_1.ogg new file mode 100644 index 0000000..c4fefc3 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_wind_cave_1.ogg differ diff --git a/mods/everness/sounds/everness_ambience_wind_cave_2.ogg b/mods/everness/sounds/everness_ambience_wind_cave_2.ogg new file mode 100644 index 0000000..13966fe Binary files /dev/null and b/mods/everness/sounds/everness_ambience_wind_cave_2.ogg differ diff --git a/mods/everness/sounds/everness_ambience_wind_cave_3.ogg b/mods/everness/sounds/everness_ambience_wind_cave_3.ogg new file mode 100644 index 0000000..0776305 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_wind_cave_3.ogg differ diff --git a/mods/everness/sounds/everness_ambience_wind_cave_4.ogg b/mods/everness/sounds/everness_ambience_wind_cave_4.ogg new file mode 100644 index 0000000..3a2355d Binary files /dev/null and b/mods/everness/sounds/everness_ambience_wind_cave_4.ogg differ diff --git a/mods/everness/sounds/everness_ambience_wind_cave_5.ogg b/mods/everness/sounds/everness_ambience_wind_cave_5.ogg new file mode 100644 index 0000000..353c947 Binary files /dev/null and b/mods/everness/sounds/everness_ambience_wind_cave_5.ogg differ diff --git a/mods/everness/sounds/everness_bamboo_dug.1.ogg b/mods/everness/sounds/everness_bamboo_dug.1.ogg new file mode 100644 index 0000000..46bc01d Binary files /dev/null and b/mods/everness/sounds/everness_bamboo_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_bamboo_hit.1.ogg b/mods/everness/sounds/everness_bamboo_hit.1.ogg new file mode 100644 index 0000000..19456ca Binary files /dev/null and b/mods/everness/sounds/everness_bamboo_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_bamboo_hit.2.ogg b/mods/everness/sounds/everness_bamboo_hit.2.ogg new file mode 100644 index 0000000..3491730 Binary files /dev/null and b/mods/everness/sounds/everness_bamboo_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_bamboo_hit.3.ogg b/mods/everness/sounds/everness_bamboo_hit.3.ogg new file mode 100644 index 0000000..b552c8c Binary files /dev/null and b/mods/everness/sounds/everness_bamboo_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_bamboo_hit.4.ogg b/mods/everness/sounds/everness_bamboo_hit.4.ogg new file mode 100644 index 0000000..92b868d Binary files /dev/null and b/mods/everness/sounds/everness_bamboo_hit.4.ogg differ diff --git a/mods/everness/sounds/everness_bamboo_hit.5.ogg b/mods/everness/sounds/everness_bamboo_hit.5.ogg new file mode 100644 index 0000000..6706d15 Binary files /dev/null and b/mods/everness/sounds/everness_bamboo_hit.5.ogg differ diff --git a/mods/everness/sounds/everness_break_thin_glass.1.ogg b/mods/everness/sounds/everness_break_thin_glass.1.ogg new file mode 100644 index 0000000..b1ccc5f Binary files /dev/null and b/mods/everness/sounds/everness_break_thin_glass.1.ogg differ diff --git a/mods/everness/sounds/everness_break_thin_glass.2.ogg b/mods/everness/sounds/everness_break_thin_glass.2.ogg new file mode 100644 index 0000000..b6cc9e8 Binary files /dev/null and b/mods/everness/sounds/everness_break_thin_glass.2.ogg differ diff --git a/mods/everness/sounds/everness_break_thin_glass.3.ogg b/mods/everness/sounds/everness_break_thin_glass.3.ogg new file mode 100644 index 0000000..ae6a6bf Binary files /dev/null and b/mods/everness/sounds/everness_break_thin_glass.3.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_dug.1.ogg b/mods/everness/sounds/everness_ceramic_dug.1.ogg new file mode 100644 index 0000000..bbb4f3c Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_dug.2.ogg b/mods/everness/sounds/everness_ceramic_dug.2.ogg new file mode 100644 index 0000000..abdf27b Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_dug.3.ogg b/mods/everness/sounds/everness_ceramic_dug.3.ogg new file mode 100644 index 0000000..6a5c78f Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_dug.3.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_footstep.1.ogg b/mods/everness/sounds/everness_ceramic_footstep.1.ogg new file mode 100644 index 0000000..93eb080 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_footstep.2.ogg b/mods/everness/sounds/everness_ceramic_footstep.2.ogg new file mode 100644 index 0000000..be874a9 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_footstep.3.ogg b/mods/everness/sounds/everness_ceramic_footstep.3.ogg new file mode 100644 index 0000000..da82c89 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_footstep.4.ogg b/mods/everness/sounds/everness_ceramic_footstep.4.ogg new file mode 100644 index 0000000..6d60785 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_footstep.5.ogg b/mods/everness/sounds/everness_ceramic_footstep.5.ogg new file mode 100644 index 0000000..2e97fba Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_footstep.6.ogg b/mods/everness/sounds/everness_ceramic_footstep.6.ogg new file mode 100644 index 0000000..21f04f6 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_footstep.6.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_hit.1.ogg b/mods/everness/sounds/everness_ceramic_hit.1.ogg new file mode 100644 index 0000000..7e2d85f Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_hit.2.ogg b/mods/everness/sounds/everness_ceramic_hit.2.ogg new file mode 100644 index 0000000..93423d2 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_hit.3.ogg b/mods/everness/sounds/everness_ceramic_hit.3.ogg new file mode 100644 index 0000000..41a41d9 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_hit.4.ogg b/mods/everness/sounds/everness_ceramic_hit.4.ogg new file mode 100644 index 0000000..c1f332f Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_hit.4.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_hit.5.ogg b/mods/everness/sounds/everness_ceramic_hit.5.ogg new file mode 100644 index 0000000..bfafaf4 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_hit.5.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_hit.6.ogg b/mods/everness/sounds/everness_ceramic_hit.6.ogg new file mode 100644 index 0000000..8a45d51 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_hit.6.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_place.1.ogg b/mods/everness/sounds/everness_ceramic_place.1.ogg new file mode 100644 index 0000000..644628a Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_place.1.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_place.2.ogg b/mods/everness/sounds/everness_ceramic_place.2.ogg new file mode 100644 index 0000000..f5f41e2 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_place.2.ogg differ diff --git a/mods/everness/sounds/everness_ceramic_place.3.ogg b/mods/everness/sounds/everness_ceramic_place.3.ogg new file mode 100644 index 0000000..8c24447 Binary files /dev/null and b/mods/everness/sounds/everness_ceramic_place.3.ogg differ diff --git a/mods/everness/sounds/everness_chest_close.ogg b/mods/everness/sounds/everness_chest_close.ogg new file mode 100644 index 0000000..7847165 Binary files /dev/null and b/mods/everness/sounds/everness_chest_close.ogg differ diff --git a/mods/everness/sounds/everness_chest_open.ogg b/mods/everness/sounds/everness_chest_open.ogg new file mode 100644 index 0000000..bb21a2a Binary files /dev/null and b/mods/everness/sounds/everness_chest_open.ogg differ diff --git a/mods/everness/sounds/everness_cool_lava.1.ogg b/mods/everness/sounds/everness_cool_lava.1.ogg new file mode 100644 index 0000000..42506dd Binary files /dev/null and b/mods/everness/sounds/everness_cool_lava.1.ogg differ diff --git a/mods/everness/sounds/everness_cool_lava.2.ogg b/mods/everness/sounds/everness_cool_lava.2.ogg new file mode 100644 index 0000000..2747ab8 Binary files /dev/null and b/mods/everness/sounds/everness_cool_lava.2.ogg differ diff --git a/mods/everness/sounds/everness_cool_lava.3.ogg b/mods/everness/sounds/everness_cool_lava.3.ogg new file mode 100644 index 0000000..8baeac3 Binary files /dev/null and b/mods/everness/sounds/everness_cool_lava.3.ogg differ diff --git a/mods/everness/sounds/everness_creaky_door_close.ogg b/mods/everness/sounds/everness_creaky_door_close.ogg new file mode 100644 index 0000000..ac3464d Binary files /dev/null and b/mods/everness/sounds/everness_creaky_door_close.ogg differ diff --git a/mods/everness/sounds/everness_creaky_door_open.1.ogg b/mods/everness/sounds/everness_creaky_door_open.1.ogg new file mode 100644 index 0000000..6264713 Binary files /dev/null and b/mods/everness/sounds/everness_creaky_door_open.1.ogg differ diff --git a/mods/everness/sounds/everness_creaky_door_open.2.ogg b/mods/everness/sounds/everness_creaky_door_open.2.ogg new file mode 100644 index 0000000..4254e2d Binary files /dev/null and b/mods/everness/sounds/everness_creaky_door_open.2.ogg differ diff --git a/mods/everness/sounds/everness_crystal_chime.1.ogg b/mods/everness/sounds/everness_crystal_chime.1.ogg new file mode 100644 index 0000000..08c4df0 Binary files /dev/null and b/mods/everness/sounds/everness_crystal_chime.1.ogg differ diff --git a/mods/everness/sounds/everness_crystal_chime.2.ogg b/mods/everness/sounds/everness_crystal_chime.2.ogg new file mode 100644 index 0000000..963c52e Binary files /dev/null and b/mods/everness/sounds/everness_crystal_chime.2.ogg differ diff --git a/mods/everness/sounds/everness_crystal_chime.3.ogg b/mods/everness/sounds/everness_crystal_chime.3.ogg new file mode 100644 index 0000000..7315084 Binary files /dev/null and b/mods/everness/sounds/everness_crystal_chime.3.ogg differ diff --git a/mods/everness/sounds/everness_crystal_chime.4.ogg b/mods/everness/sounds/everness_crystal_chime.4.ogg new file mode 100644 index 0000000..d6bf0d3 Binary files /dev/null and b/mods/everness/sounds/everness_crystal_chime.4.ogg differ diff --git a/mods/everness/sounds/everness_crystal_chime.5.ogg b/mods/everness/sounds/everness_crystal_chime.5.ogg new file mode 100644 index 0000000..b327e16 Binary files /dev/null and b/mods/everness/sounds/everness_crystal_chime.5.ogg differ diff --git a/mods/everness/sounds/everness_crystal_chime.6.ogg b/mods/everness/sounds/everness_crystal_chime.6.ogg new file mode 100644 index 0000000..390723c Binary files /dev/null and b/mods/everness/sounds/everness_crystal_chime.6.ogg differ diff --git a/mods/everness/sounds/everness_dirt_footstep.1.ogg b/mods/everness/sounds/everness_dirt_footstep.1.ogg new file mode 100644 index 0000000..86c0822 Binary files /dev/null and b/mods/everness/sounds/everness_dirt_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_dirt_footstep.2.ogg b/mods/everness/sounds/everness_dirt_footstep.2.ogg new file mode 100644 index 0000000..d505aa7 Binary files /dev/null and b/mods/everness/sounds/everness_dirt_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_dirt_footstep.3.ogg b/mods/everness/sounds/everness_dirt_footstep.3.ogg new file mode 100644 index 0000000..98d60c1 Binary files /dev/null and b/mods/everness/sounds/everness_dirt_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_dirt_footstep.4.ogg b/mods/everness/sounds/everness_dirt_footstep.4.ogg new file mode 100644 index 0000000..ec507f4 Binary files /dev/null and b/mods/everness/sounds/everness_dirt_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_dirt_hit.1.ogg b/mods/everness/sounds/everness_dirt_hit.1.ogg new file mode 100644 index 0000000..4ef4f29 Binary files /dev/null and b/mods/everness/sounds/everness_dirt_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_dirt_hit.2.ogg b/mods/everness/sounds/everness_dirt_hit.2.ogg new file mode 100644 index 0000000..2ee8f6b Binary files /dev/null and b/mods/everness/sounds/everness_dirt_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_dirt_hit.3.ogg b/mods/everness/sounds/everness_dirt_hit.3.ogg new file mode 100644 index 0000000..34fff6b Binary files /dev/null and b/mods/everness/sounds/everness_dirt_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_door_bamboo_open.ogg b/mods/everness/sounds/everness_door_bamboo_open.ogg new file mode 100644 index 0000000..ee44a2e Binary files /dev/null and b/mods/everness/sounds/everness_door_bamboo_open.ogg differ diff --git a/mods/everness/sounds/everness_door_glass_close.ogg b/mods/everness/sounds/everness_door_glass_close.ogg new file mode 100644 index 0000000..eb8495c Binary files /dev/null and b/mods/everness/sounds/everness_door_glass_close.ogg differ diff --git a/mods/everness/sounds/everness_door_glass_open.ogg b/mods/everness/sounds/everness_door_glass_open.ogg new file mode 100644 index 0000000..e63c841 Binary files /dev/null and b/mods/everness/sounds/everness_door_glass_open.ogg differ diff --git a/mods/everness/sounds/everness_extinguish_flame.1.ogg b/mods/everness/sounds/everness_extinguish_flame.1.ogg new file mode 100644 index 0000000..1bb5b07 Binary files /dev/null and b/mods/everness/sounds/everness_extinguish_flame.1.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_footstep.1.ogg b/mods/everness/sounds/everness_frosted_snow_footstep.1.ogg new file mode 100644 index 0000000..eb4bc5f Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_footstep.2.ogg b/mods/everness/sounds/everness_frosted_snow_footstep.2.ogg new file mode 100644 index 0000000..57fedb1 Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_footstep.3.ogg b/mods/everness/sounds/everness_frosted_snow_footstep.3.ogg new file mode 100644 index 0000000..1b496fc Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_footstep.4.ogg b/mods/everness/sounds/everness_frosted_snow_footstep.4.ogg new file mode 100644 index 0000000..fad8692 Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_footstep.5.ogg b/mods/everness/sounds/everness_frosted_snow_footstep.5.ogg new file mode 100644 index 0000000..689336b Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_hit.1.ogg b/mods/everness/sounds/everness_frosted_snow_hit.1.ogg new file mode 100644 index 0000000..eeac81a Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_hit.2.ogg b/mods/everness/sounds/everness_frosted_snow_hit.2.ogg new file mode 100644 index 0000000..f0dbb5f Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_hit.3.ogg b/mods/everness/sounds/everness_frosted_snow_hit.3.ogg new file mode 100644 index 0000000..8a7f51b Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_hit.4.ogg b/mods/everness/sounds/everness_frosted_snow_hit.4.ogg new file mode 100644 index 0000000..c5d68b3 Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_hit.4.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_place.1.ogg b/mods/everness/sounds/everness_frosted_snow_place.1.ogg new file mode 100644 index 0000000..ebf316e Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_place.1.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_place.2.ogg b/mods/everness/sounds/everness_frosted_snow_place.2.ogg new file mode 100644 index 0000000..381a697 Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_place.2.ogg differ diff --git a/mods/everness/sounds/everness_frosted_snow_place.3.ogg b/mods/everness/sounds/everness_frosted_snow_place.3.ogg new file mode 100644 index 0000000..e9497e8 Binary files /dev/null and b/mods/everness/sounds/everness_frosted_snow_place.3.ogg differ diff --git a/mods/everness/sounds/everness_glass_dug.1.ogg b/mods/everness/sounds/everness_glass_dug.1.ogg new file mode 100644 index 0000000..dbcbd50 Binary files /dev/null and b/mods/everness/sounds/everness_glass_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_glass_dug.2.ogg b/mods/everness/sounds/everness_glass_dug.2.ogg new file mode 100644 index 0000000..b0c8aa7 Binary files /dev/null and b/mods/everness/sounds/everness_glass_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_glass_footstep.1.ogg b/mods/everness/sounds/everness_glass_footstep.1.ogg new file mode 100644 index 0000000..adffad9 Binary files /dev/null and b/mods/everness/sounds/everness_glass_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_glass_footstep.2.ogg b/mods/everness/sounds/everness_glass_footstep.2.ogg new file mode 100644 index 0000000..c425d5f Binary files /dev/null and b/mods/everness/sounds/everness_glass_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_glass_footstep.3.ogg b/mods/everness/sounds/everness_glass_footstep.3.ogg new file mode 100644 index 0000000..1817563 Binary files /dev/null and b/mods/everness/sounds/everness_glass_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_glass_place.1.ogg b/mods/everness/sounds/everness_glass_place.1.ogg new file mode 100644 index 0000000..14ae30d Binary files /dev/null and b/mods/everness/sounds/everness_glass_place.1.ogg differ diff --git a/mods/everness/sounds/everness_glass_place.2.ogg b/mods/everness/sounds/everness_glass_place.2.ogg new file mode 100644 index 0000000..7e3b218 Binary files /dev/null and b/mods/everness/sounds/everness_glass_place.2.ogg differ diff --git a/mods/everness/sounds/everness_glass_place.3.ogg b/mods/everness/sounds/everness_glass_place.3.ogg new file mode 100644 index 0000000..6cbafbf Binary files /dev/null and b/mods/everness/sounds/everness_glass_place.3.ogg differ diff --git a/mods/everness/sounds/everness_grass_footstep.1.ogg b/mods/everness/sounds/everness_grass_footstep.1.ogg new file mode 100644 index 0000000..e38cbd3 Binary files /dev/null and b/mods/everness/sounds/everness_grass_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_grass_footstep.2.ogg b/mods/everness/sounds/everness_grass_footstep.2.ogg new file mode 100644 index 0000000..4a5f299 Binary files /dev/null and b/mods/everness/sounds/everness_grass_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_grass_footstep.3.ogg b/mods/everness/sounds/everness_grass_footstep.3.ogg new file mode 100644 index 0000000..d4ff286 Binary files /dev/null and b/mods/everness/sounds/everness_grass_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_grass_hit.1.ogg b/mods/everness/sounds/everness_grass_hit.1.ogg new file mode 100644 index 0000000..b26df59 Binary files /dev/null and b/mods/everness/sounds/everness_grass_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_grass_hit.2.ogg b/mods/everness/sounds/everness_grass_hit.2.ogg new file mode 100644 index 0000000..31ffa28 Binary files /dev/null and b/mods/everness/sounds/everness_grass_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_grass_hit.3.ogg b/mods/everness/sounds/everness_grass_hit.3.ogg new file mode 100644 index 0000000..d52bca1 Binary files /dev/null and b/mods/everness/sounds/everness_grass_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_gravel_dug.1.ogg b/mods/everness/sounds/everness_gravel_dug.1.ogg new file mode 100644 index 0000000..4d9a85a Binary files /dev/null and b/mods/everness/sounds/everness_gravel_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_gravel_dug.2.ogg b/mods/everness/sounds/everness_gravel_dug.2.ogg new file mode 100644 index 0000000..083e99b Binary files /dev/null and b/mods/everness/sounds/everness_gravel_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_gravel_dug.3.ogg b/mods/everness/sounds/everness_gravel_dug.3.ogg new file mode 100644 index 0000000..992eccb Binary files /dev/null and b/mods/everness/sounds/everness_gravel_dug.3.ogg differ diff --git a/mods/everness/sounds/everness_gravel_dug.4.ogg b/mods/everness/sounds/everness_gravel_dug.4.ogg new file mode 100644 index 0000000..0b4a71b Binary files /dev/null and b/mods/everness/sounds/everness_gravel_dug.4.ogg differ diff --git a/mods/everness/sounds/everness_gravel_footstep.1.ogg b/mods/everness/sounds/everness_gravel_footstep.1.ogg new file mode 100644 index 0000000..3c67d42 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_gravel_footstep.2.ogg b/mods/everness/sounds/everness_gravel_footstep.2.ogg new file mode 100644 index 0000000..0615b3f Binary files /dev/null and b/mods/everness/sounds/everness_gravel_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_gravel_footstep.3.ogg b/mods/everness/sounds/everness_gravel_footstep.3.ogg new file mode 100644 index 0000000..8864e58 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_gravel_footstep.4.ogg b/mods/everness/sounds/everness_gravel_footstep.4.ogg new file mode 100644 index 0000000..465d140 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_gravel_footstep.5.ogg b/mods/everness/sounds/everness_gravel_footstep.5.ogg new file mode 100644 index 0000000..8df8f76 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_gravel_footstep.6.ogg b/mods/everness/sounds/everness_gravel_footstep.6.ogg new file mode 100644 index 0000000..f37aa14 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_footstep.6.ogg differ diff --git a/mods/everness/sounds/everness_gravel_hit.1.ogg b/mods/everness/sounds/everness_gravel_hit.1.ogg new file mode 100644 index 0000000..44c8273 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_gravel_hit.2.ogg b/mods/everness/sounds/everness_gravel_hit.2.ogg new file mode 100644 index 0000000..43cb005 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_gravel_hit.3.ogg b/mods/everness/sounds/everness_gravel_hit.3.ogg new file mode 100644 index 0000000..e91ae41 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_gravel_place.1.ogg b/mods/everness/sounds/everness_gravel_place.1.ogg new file mode 100644 index 0000000..8c5a472 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_place.1.ogg differ diff --git a/mods/everness/sounds/everness_gravel_place.2.ogg b/mods/everness/sounds/everness_gravel_place.2.ogg new file mode 100644 index 0000000..574ba77 Binary files /dev/null and b/mods/everness/sounds/everness_gravel_place.2.ogg differ diff --git a/mods/everness/sounds/everness_gravel_place.3.ogg b/mods/everness/sounds/everness_gravel_place.3.ogg new file mode 100644 index 0000000..c0ed86d Binary files /dev/null and b/mods/everness/sounds/everness_gravel_place.3.ogg differ diff --git a/mods/everness/sounds/everness_ice_footstep.1.ogg b/mods/everness/sounds/everness_ice_footstep.1.ogg new file mode 100644 index 0000000..5445c0b Binary files /dev/null and b/mods/everness/sounds/everness_ice_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_ice_footstep.2.ogg b/mods/everness/sounds/everness_ice_footstep.2.ogg new file mode 100644 index 0000000..d49fa7b Binary files /dev/null and b/mods/everness/sounds/everness_ice_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_ice_footstep.3.ogg b/mods/everness/sounds/everness_ice_footstep.3.ogg new file mode 100644 index 0000000..5c1feb9 Binary files /dev/null and b/mods/everness/sounds/everness_ice_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_ice_footstep.4.ogg b/mods/everness/sounds/everness_ice_footstep.4.ogg new file mode 100644 index 0000000..78994f5 Binary files /dev/null and b/mods/everness/sounds/everness_ice_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_ice_hit.1.ogg b/mods/everness/sounds/everness_ice_hit.1.ogg new file mode 100644 index 0000000..448328a Binary files /dev/null and b/mods/everness/sounds/everness_ice_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_ice_hit.2.ogg b/mods/everness/sounds/everness_ice_hit.2.ogg new file mode 100644 index 0000000..97e6ad6 Binary files /dev/null and b/mods/everness/sounds/everness_ice_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_ice_hit.3.ogg b/mods/everness/sounds/everness_ice_hit.3.ogg new file mode 100644 index 0000000..5416bd0 Binary files /dev/null and b/mods/everness/sounds/everness_ice_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_ice_hit.4.ogg b/mods/everness/sounds/everness_ice_hit.4.ogg new file mode 100644 index 0000000..a57fdc6 Binary files /dev/null and b/mods/everness/sounds/everness_ice_hit.4.ogg differ diff --git a/mods/everness/sounds/everness_item_drop_pickup.1.ogg b/mods/everness/sounds/everness_item_drop_pickup.1.ogg new file mode 100644 index 0000000..93f4a23 Binary files /dev/null and b/mods/everness/sounds/everness_item_drop_pickup.1.ogg differ diff --git a/mods/everness/sounds/everness_item_drop_pickup.2.ogg b/mods/everness/sounds/everness_item_drop_pickup.2.ogg new file mode 100644 index 0000000..95a665e Binary files /dev/null and b/mods/everness/sounds/everness_item_drop_pickup.2.ogg differ diff --git a/mods/everness/sounds/everness_item_drop_pickup.3.ogg b/mods/everness/sounds/everness_item_drop_pickup.3.ogg new file mode 100644 index 0000000..921d08e Binary files /dev/null and b/mods/everness/sounds/everness_item_drop_pickup.3.ogg differ diff --git a/mods/everness/sounds/everness_item_drop_pickup.4.ogg b/mods/everness/sounds/everness_item_drop_pickup.4.ogg new file mode 100644 index 0000000..93b3a21 Binary files /dev/null and b/mods/everness/sounds/everness_item_drop_pickup.4.ogg differ diff --git a/mods/everness/sounds/everness_lava_1.ogg b/mods/everness/sounds/everness_lava_1.ogg new file mode 100644 index 0000000..7993d79 Binary files /dev/null and b/mods/everness/sounds/everness_lava_1.ogg differ diff --git a/mods/everness/sounds/everness_lava_2.ogg b/mods/everness/sounds/everness_lava_2.ogg new file mode 100644 index 0000000..3646372 Binary files /dev/null and b/mods/everness/sounds/everness_lava_2.ogg differ diff --git a/mods/everness/sounds/everness_leaves_dug.1.ogg b/mods/everness/sounds/everness_leaves_dug.1.ogg new file mode 100644 index 0000000..61ff735 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_leaves_dug.2.ogg b/mods/everness/sounds/everness_leaves_dug.2.ogg new file mode 100644 index 0000000..03fbc87 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_leaves_footstep.1.ogg b/mods/everness/sounds/everness_leaves_footstep.1.ogg new file mode 100644 index 0000000..4479f8d Binary files /dev/null and b/mods/everness/sounds/everness_leaves_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_leaves_footstep.2.ogg b/mods/everness/sounds/everness_leaves_footstep.2.ogg new file mode 100644 index 0000000..bda1195 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_leaves_footstep.3.ogg b/mods/everness/sounds/everness_leaves_footstep.3.ogg new file mode 100644 index 0000000..ddc0dc2 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_leaves_footstep.4.ogg b/mods/everness/sounds/everness_leaves_footstep.4.ogg new file mode 100644 index 0000000..eb7a609 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_leaves_hit.1.ogg b/mods/everness/sounds/everness_leaves_hit.1.ogg new file mode 100644 index 0000000..3160d1d Binary files /dev/null and b/mods/everness/sounds/everness_leaves_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_leaves_hit.2.ogg b/mods/everness/sounds/everness_leaves_hit.2.ogg new file mode 100644 index 0000000..ccc9475 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_leaves_place.1.ogg b/mods/everness/sounds/everness_leaves_place.1.ogg new file mode 100644 index 0000000..7fd7b64 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_place.1.ogg differ diff --git a/mods/everness/sounds/everness_leaves_place.2.ogg b/mods/everness/sounds/everness_leaves_place.2.ogg new file mode 100644 index 0000000..00b7c22 Binary files /dev/null and b/mods/everness/sounds/everness_leaves_place.2.ogg differ diff --git a/mods/everness/sounds/everness_metal_dug.1.ogg b/mods/everness/sounds/everness_metal_dug.1.ogg new file mode 100644 index 0000000..49d675f Binary files /dev/null and b/mods/everness/sounds/everness_metal_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_metal_dug.2.ogg b/mods/everness/sounds/everness_metal_dug.2.ogg new file mode 100644 index 0000000..017a8ed Binary files /dev/null and b/mods/everness/sounds/everness_metal_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_metal_dug.3.ogg b/mods/everness/sounds/everness_metal_dug.3.ogg new file mode 100644 index 0000000..19d6e8e Binary files /dev/null and b/mods/everness/sounds/everness_metal_dug.3.ogg differ diff --git a/mods/everness/sounds/everness_metal_footstep.1.ogg b/mods/everness/sounds/everness_metal_footstep.1.ogg new file mode 100644 index 0000000..caf1670 Binary files /dev/null and b/mods/everness/sounds/everness_metal_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_metal_footstep.2.ogg b/mods/everness/sounds/everness_metal_footstep.2.ogg new file mode 100644 index 0000000..0d4be6a Binary files /dev/null and b/mods/everness/sounds/everness_metal_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_metal_footstep.3.ogg b/mods/everness/sounds/everness_metal_footstep.3.ogg new file mode 100644 index 0000000..557ce7b Binary files /dev/null and b/mods/everness/sounds/everness_metal_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_metal_footstep.4.ogg b/mods/everness/sounds/everness_metal_footstep.4.ogg new file mode 100644 index 0000000..d452f98 Binary files /dev/null and b/mods/everness/sounds/everness_metal_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_metal_footstep.5.ogg b/mods/everness/sounds/everness_metal_footstep.5.ogg new file mode 100644 index 0000000..6914415 Binary files /dev/null and b/mods/everness/sounds/everness_metal_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_metal_hit.1.ogg b/mods/everness/sounds/everness_metal_hit.1.ogg new file mode 100644 index 0000000..f923a9f Binary files /dev/null and b/mods/everness/sounds/everness_metal_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_metal_hit.2.ogg b/mods/everness/sounds/everness_metal_hit.2.ogg new file mode 100644 index 0000000..8c0636c Binary files /dev/null and b/mods/everness/sounds/everness_metal_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_metal_hit.3.ogg b/mods/everness/sounds/everness_metal_hit.3.ogg new file mode 100644 index 0000000..f0337ef Binary files /dev/null and b/mods/everness/sounds/everness_metal_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_metal_place.1.ogg b/mods/everness/sounds/everness_metal_place.1.ogg new file mode 100644 index 0000000..a48d817 Binary files /dev/null and b/mods/everness/sounds/everness_metal_place.1.ogg differ diff --git a/mods/everness/sounds/everness_metal_place.2.ogg b/mods/everness/sounds/everness_metal_place.2.ogg new file mode 100644 index 0000000..aaf06e2 Binary files /dev/null and b/mods/everness/sounds/everness_metal_place.2.ogg differ diff --git a/mods/everness/sounds/everness_metal_place.3.ogg b/mods/everness/sounds/everness_metal_place.3.ogg new file mode 100644 index 0000000..ab154d2 Binary files /dev/null and b/mods/everness/sounds/everness_metal_place.3.ogg differ diff --git a/mods/everness/sounds/everness_mud_footstep.1.ogg b/mods/everness/sounds/everness_mud_footstep.1.ogg new file mode 100644 index 0000000..925d3ed Binary files /dev/null and b/mods/everness/sounds/everness_mud_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_mud_footstep.2.ogg b/mods/everness/sounds/everness_mud_footstep.2.ogg new file mode 100644 index 0000000..3c2d1fc Binary files /dev/null and b/mods/everness/sounds/everness_mud_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_mud_footstep.3.ogg b/mods/everness/sounds/everness_mud_footstep.3.ogg new file mode 100644 index 0000000..f96496e Binary files /dev/null and b/mods/everness/sounds/everness_mud_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_mud_footstep.4.ogg b/mods/everness/sounds/everness_mud_footstep.4.ogg new file mode 100644 index 0000000..9d77d41 Binary files /dev/null and b/mods/everness/sounds/everness_mud_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_mud_footstep.5.ogg b/mods/everness/sounds/everness_mud_footstep.5.ogg new file mode 100644 index 0000000..6f2a9ee Binary files /dev/null and b/mods/everness/sounds/everness_mud_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_plant_hit.1.ogg b/mods/everness/sounds/everness_plant_hit.1.ogg new file mode 100644 index 0000000..8073087 Binary files /dev/null and b/mods/everness/sounds/everness_plant_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_plant_hit.2.ogg b/mods/everness/sounds/everness_plant_hit.2.ogg new file mode 100644 index 0000000..0964cb8 Binary files /dev/null and b/mods/everness/sounds/everness_plant_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_plant_hit.3.ogg b/mods/everness/sounds/everness_plant_hit.3.ogg new file mode 100644 index 0000000..4bcd9b1 Binary files /dev/null and b/mods/everness/sounds/everness_plant_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_sand_dug.1.ogg b/mods/everness/sounds/everness_sand_dug.1.ogg new file mode 100644 index 0000000..648b998 Binary files /dev/null and b/mods/everness/sounds/everness_sand_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_sand_dug.2.ogg b/mods/everness/sounds/everness_sand_dug.2.ogg new file mode 100644 index 0000000..bfb6a38 Binary files /dev/null and b/mods/everness/sounds/everness_sand_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_sand_dug.3.ogg b/mods/everness/sounds/everness_sand_dug.3.ogg new file mode 100644 index 0000000..4cdfc82 Binary files /dev/null and b/mods/everness/sounds/everness_sand_dug.3.ogg differ diff --git a/mods/everness/sounds/everness_sand_footstep.1.ogg b/mods/everness/sounds/everness_sand_footstep.1.ogg new file mode 100644 index 0000000..c5331b3 Binary files /dev/null and b/mods/everness/sounds/everness_sand_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_sand_footstep.2.ogg b/mods/everness/sounds/everness_sand_footstep.2.ogg new file mode 100644 index 0000000..e6e019d Binary files /dev/null and b/mods/everness/sounds/everness_sand_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_sand_footstep.3.ogg b/mods/everness/sounds/everness_sand_footstep.3.ogg new file mode 100644 index 0000000..9da9245 Binary files /dev/null and b/mods/everness/sounds/everness_sand_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_sand_hit.1.ogg b/mods/everness/sounds/everness_sand_hit.1.ogg new file mode 100644 index 0000000..2175d5a Binary files /dev/null and b/mods/everness/sounds/everness_sand_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_sand_hit.2.ogg b/mods/everness/sounds/everness_sand_hit.2.ogg new file mode 100644 index 0000000..9393691 Binary files /dev/null and b/mods/everness/sounds/everness_sand_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_sand_hit.3.ogg b/mods/everness/sounds/everness_sand_hit.3.ogg new file mode 100644 index 0000000..05f4863 Binary files /dev/null and b/mods/everness/sounds/everness_sand_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_sand_place.1.ogg b/mods/everness/sounds/everness_sand_place.1.ogg new file mode 100644 index 0000000..4101051 Binary files /dev/null and b/mods/everness/sounds/everness_sand_place.1.ogg differ diff --git a/mods/everness/sounds/everness_sand_place.2.ogg b/mods/everness/sounds/everness_sand_place.2.ogg new file mode 100644 index 0000000..5aef765 Binary files /dev/null and b/mods/everness/sounds/everness_sand_place.2.ogg differ diff --git a/mods/everness/sounds/everness_sand_place.3.ogg b/mods/everness/sounds/everness_sand_place.3.ogg new file mode 100644 index 0000000..15f139a Binary files /dev/null and b/mods/everness/sounds/everness_sand_place.3.ogg differ diff --git a/mods/everness/sounds/everness_sand_place.4.ogg b/mods/everness/sounds/everness_sand_place.4.ogg new file mode 100644 index 0000000..e307eaf Binary files /dev/null and b/mods/everness/sounds/everness_sand_place.4.ogg differ diff --git a/mods/everness/sounds/everness_sand_place.5.ogg b/mods/everness/sounds/everness_sand_place.5.ogg new file mode 100644 index 0000000..0f17bd0 Binary files /dev/null and b/mods/everness/sounds/everness_sand_place.5.ogg differ diff --git a/mods/everness/sounds/everness_snow_footstep.1.ogg b/mods/everness/sounds/everness_snow_footstep.1.ogg new file mode 100644 index 0000000..51d1e99 Binary files /dev/null and b/mods/everness/sounds/everness_snow_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_snow_footstep.2.ogg b/mods/everness/sounds/everness_snow_footstep.2.ogg new file mode 100644 index 0000000..29b4a28 Binary files /dev/null and b/mods/everness/sounds/everness_snow_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_snow_footstep.3.ogg b/mods/everness/sounds/everness_snow_footstep.3.ogg new file mode 100644 index 0000000..2dbdec0 Binary files /dev/null and b/mods/everness/sounds/everness_snow_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_snow_footstep.4.ogg b/mods/everness/sounds/everness_snow_footstep.4.ogg new file mode 100644 index 0000000..2746f28 Binary files /dev/null and b/mods/everness/sounds/everness_snow_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_snow_hit.1.ogg b/mods/everness/sounds/everness_snow_hit.1.ogg new file mode 100644 index 0000000..147baba Binary files /dev/null and b/mods/everness/sounds/everness_snow_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_snow_hit.2.ogg b/mods/everness/sounds/everness_snow_hit.2.ogg new file mode 100644 index 0000000..22cc66d Binary files /dev/null and b/mods/everness/sounds/everness_snow_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_snow_hit.3.ogg b/mods/everness/sounds/everness_snow_hit.3.ogg new file mode 100644 index 0000000..bf7190d Binary files /dev/null and b/mods/everness/sounds/everness_snow_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_snow_place.1.ogg b/mods/everness/sounds/everness_snow_place.1.ogg new file mode 100644 index 0000000..1f109d9 Binary files /dev/null and b/mods/everness/sounds/everness_snow_place.1.ogg differ diff --git a/mods/everness/sounds/everness_snow_place.2.ogg b/mods/everness/sounds/everness_snow_place.2.ogg new file mode 100644 index 0000000..2108373 Binary files /dev/null and b/mods/everness/sounds/everness_snow_place.2.ogg differ diff --git a/mods/everness/sounds/everness_snow_place.3.ogg b/mods/everness/sounds/everness_snow_place.3.ogg new file mode 100644 index 0000000..97b28a2 Binary files /dev/null and b/mods/everness/sounds/everness_snow_place.3.ogg differ diff --git a/mods/everness/sounds/everness_stone_dug.1.ogg b/mods/everness/sounds/everness_stone_dug.1.ogg new file mode 100644 index 0000000..b34e0f5 Binary files /dev/null and b/mods/everness/sounds/everness_stone_dug.1.ogg differ diff --git a/mods/everness/sounds/everness_stone_dug.2.ogg b/mods/everness/sounds/everness_stone_dug.2.ogg new file mode 100644 index 0000000..d4eaf15 Binary files /dev/null and b/mods/everness/sounds/everness_stone_dug.2.ogg differ diff --git a/mods/everness/sounds/everness_stone_dug.3.ogg b/mods/everness/sounds/everness_stone_dug.3.ogg new file mode 100644 index 0000000..b19b449 Binary files /dev/null and b/mods/everness/sounds/everness_stone_dug.3.ogg differ diff --git a/mods/everness/sounds/everness_stone_footstep.1.ogg b/mods/everness/sounds/everness_stone_footstep.1.ogg new file mode 100644 index 0000000..6ecd9a2 Binary files /dev/null and b/mods/everness/sounds/everness_stone_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_stone_footstep.2.ogg b/mods/everness/sounds/everness_stone_footstep.2.ogg new file mode 100644 index 0000000..d3f9ebf Binary files /dev/null and b/mods/everness/sounds/everness_stone_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_stone_footstep.3.ogg b/mods/everness/sounds/everness_stone_footstep.3.ogg new file mode 100644 index 0000000..abafae2 Binary files /dev/null and b/mods/everness/sounds/everness_stone_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_stone_footstep.4.ogg b/mods/everness/sounds/everness_stone_footstep.4.ogg new file mode 100644 index 0000000..653e236 Binary files /dev/null and b/mods/everness/sounds/everness_stone_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_stone_footstep.5.ogg b/mods/everness/sounds/everness_stone_footstep.5.ogg new file mode 100644 index 0000000..07b1b74 Binary files /dev/null and b/mods/everness/sounds/everness_stone_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_stone_hit.1.ogg b/mods/everness/sounds/everness_stone_hit.1.ogg new file mode 100644 index 0000000..5cfbbec Binary files /dev/null and b/mods/everness/sounds/everness_stone_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_stone_hit.2.ogg b/mods/everness/sounds/everness_stone_hit.2.ogg new file mode 100644 index 0000000..414a35e Binary files /dev/null and b/mods/everness/sounds/everness_stone_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_stone_hit.3.ogg b/mods/everness/sounds/everness_stone_hit.3.ogg new file mode 100644 index 0000000..4116ce1 Binary files /dev/null and b/mods/everness/sounds/everness_stone_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_stone_place.1.ogg b/mods/everness/sounds/everness_stone_place.1.ogg new file mode 100644 index 0000000..726c514 Binary files /dev/null and b/mods/everness/sounds/everness_stone_place.1.ogg differ diff --git a/mods/everness/sounds/everness_stone_place.2.ogg b/mods/everness/sounds/everness_stone_place.2.ogg new file mode 100644 index 0000000..237cf37 Binary files /dev/null and b/mods/everness/sounds/everness_stone_place.2.ogg differ diff --git a/mods/everness/sounds/everness_stone_place.3.ogg b/mods/everness/sounds/everness_stone_place.3.ogg new file mode 100644 index 0000000..848ea5f Binary files /dev/null and b/mods/everness/sounds/everness_stone_place.3.ogg differ diff --git a/mods/everness/sounds/everness_stone_place.4.ogg b/mods/everness/sounds/everness_stone_place.4.ogg new file mode 100644 index 0000000..1c23569 Binary files /dev/null and b/mods/everness/sounds/everness_stone_place.4.ogg differ diff --git a/mods/everness/sounds/everness_thin_glass_footstep.ogg b/mods/everness/sounds/everness_thin_glass_footstep.ogg new file mode 100644 index 0000000..191287a Binary files /dev/null and b/mods/everness/sounds/everness_thin_glass_footstep.ogg differ diff --git a/mods/everness/sounds/everness_tool_breaks.1.ogg b/mods/everness/sounds/everness_tool_breaks.1.ogg new file mode 100644 index 0000000..2a571ae Binary files /dev/null and b/mods/everness/sounds/everness_tool_breaks.1.ogg differ diff --git a/mods/everness/sounds/everness_tool_breaks.2.ogg b/mods/everness/sounds/everness_tool_breaks.2.ogg new file mode 100644 index 0000000..1789352 Binary files /dev/null and b/mods/everness/sounds/everness_tool_breaks.2.ogg differ diff --git a/mods/everness/sounds/everness_tool_breaks.3.ogg b/mods/everness/sounds/everness_tool_breaks.3.ogg new file mode 100644 index 0000000..a99c4b7 Binary files /dev/null and b/mods/everness/sounds/everness_tool_breaks.3.ogg differ diff --git a/mods/everness/sounds/everness_underwater_bubbles.1.ogg b/mods/everness/sounds/everness_underwater_bubbles.1.ogg new file mode 100644 index 0000000..dcb8abf Binary files /dev/null and b/mods/everness/sounds/everness_underwater_bubbles.1.ogg differ diff --git a/mods/everness/sounds/everness_underwater_bubbles.2.ogg b/mods/everness/sounds/everness_underwater_bubbles.2.ogg new file mode 100644 index 0000000..2801af9 Binary files /dev/null and b/mods/everness/sounds/everness_underwater_bubbles.2.ogg differ diff --git a/mods/everness/sounds/everness_underwater_bubbles.3.ogg b/mods/everness/sounds/everness_underwater_bubbles.3.ogg new file mode 100644 index 0000000..df494c3 Binary files /dev/null and b/mods/everness/sounds/everness_underwater_bubbles.3.ogg differ diff --git a/mods/everness/sounds/everness_water_footstep.1.ogg b/mods/everness/sounds/everness_water_footstep.1.ogg new file mode 100644 index 0000000..22b340d Binary files /dev/null and b/mods/everness/sounds/everness_water_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_water_footstep.2.ogg b/mods/everness/sounds/everness_water_footstep.2.ogg new file mode 100644 index 0000000..30f0ded Binary files /dev/null and b/mods/everness/sounds/everness_water_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_water_footstep.3.ogg b/mods/everness/sounds/everness_water_footstep.3.ogg new file mode 100644 index 0000000..f4cc3da Binary files /dev/null and b/mods/everness/sounds/everness_water_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_water_footstep.4.ogg b/mods/everness/sounds/everness_water_footstep.4.ogg new file mode 100644 index 0000000..7ab3524 Binary files /dev/null and b/mods/everness/sounds/everness_water_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_water_geyser.1.ogg b/mods/everness/sounds/everness_water_geyser.1.ogg new file mode 100644 index 0000000..80da2ef Binary files /dev/null and b/mods/everness/sounds/everness_water_geyser.1.ogg differ diff --git a/mods/everness/sounds/everness_wood_footstep.1.ogg b/mods/everness/sounds/everness_wood_footstep.1.ogg new file mode 100644 index 0000000..0ed642b Binary files /dev/null and b/mods/everness/sounds/everness_wood_footstep.1.ogg differ diff --git a/mods/everness/sounds/everness_wood_footstep.2.ogg b/mods/everness/sounds/everness_wood_footstep.2.ogg new file mode 100644 index 0000000..f1ad2e6 Binary files /dev/null and b/mods/everness/sounds/everness_wood_footstep.2.ogg differ diff --git a/mods/everness/sounds/everness_wood_footstep.3.ogg b/mods/everness/sounds/everness_wood_footstep.3.ogg new file mode 100644 index 0000000..17a89a3 Binary files /dev/null and b/mods/everness/sounds/everness_wood_footstep.3.ogg differ diff --git a/mods/everness/sounds/everness_wood_footstep.4.ogg b/mods/everness/sounds/everness_wood_footstep.4.ogg new file mode 100644 index 0000000..8ced7cb Binary files /dev/null and b/mods/everness/sounds/everness_wood_footstep.4.ogg differ diff --git a/mods/everness/sounds/everness_wood_footstep.5.ogg b/mods/everness/sounds/everness_wood_footstep.5.ogg new file mode 100644 index 0000000..bee6a53 Binary files /dev/null and b/mods/everness/sounds/everness_wood_footstep.5.ogg differ diff --git a/mods/everness/sounds/everness_wood_footstep.6.ogg b/mods/everness/sounds/everness_wood_footstep.6.ogg new file mode 100644 index 0000000..f317c98 Binary files /dev/null and b/mods/everness/sounds/everness_wood_footstep.6.ogg differ diff --git a/mods/everness/sounds/everness_wood_hit.1.ogg b/mods/everness/sounds/everness_wood_hit.1.ogg new file mode 100644 index 0000000..14d74de Binary files /dev/null and b/mods/everness/sounds/everness_wood_hit.1.ogg differ diff --git a/mods/everness/sounds/everness_wood_hit.2.ogg b/mods/everness/sounds/everness_wood_hit.2.ogg new file mode 100644 index 0000000..f53638d Binary files /dev/null and b/mods/everness/sounds/everness_wood_hit.2.ogg differ diff --git a/mods/everness/sounds/everness_wood_hit.3.ogg b/mods/everness/sounds/everness_wood_hit.3.ogg new file mode 100644 index 0000000..a13d46e Binary files /dev/null and b/mods/everness/sounds/everness_wood_hit.3.ogg differ diff --git a/mods/everness/sounds/everness_wood_hit.4.ogg b/mods/everness/sounds/everness_wood_hit.4.ogg new file mode 100644 index 0000000..4a7d8fa Binary files /dev/null and b/mods/everness/sounds/everness_wood_hit.4.ogg differ diff --git a/mods/everness/sounds/everness_wood_hit.5.ogg b/mods/everness/sounds/everness_wood_hit.5.ogg new file mode 100644 index 0000000..0d16f4e Binary files /dev/null and b/mods/everness/sounds/everness_wood_hit.5.ogg differ diff --git a/mods/everness/sounds/everness_wood_hit.6.ogg b/mods/everness/sounds/everness_wood_hit.6.ogg new file mode 100644 index 0000000..411bd8b Binary files /dev/null and b/mods/everness/sounds/everness_wood_hit.6.ogg differ diff --git a/mods/everness/sounds/everness_wood_place.1.ogg b/mods/everness/sounds/everness_wood_place.1.ogg new file mode 100644 index 0000000..f3a5f35 Binary files /dev/null and b/mods/everness/sounds/everness_wood_place.1.ogg differ diff --git a/mods/everness/sounds/everness_wood_place.2.ogg b/mods/everness/sounds/everness_wood_place.2.ogg new file mode 100644 index 0000000..eab96e1 Binary files /dev/null and b/mods/everness/sounds/everness_wood_place.2.ogg differ diff --git a/mods/everness/sounds/everness_wood_place.3.ogg b/mods/everness/sounds/everness_wood_place.3.ogg new file mode 100644 index 0000000..9f62083 Binary files /dev/null and b/mods/everness/sounds/everness_wood_place.3.ogg differ diff --git a/mods/everness/stairs.lua b/mods/everness/stairs.lua new file mode 100644 index 0000000..113de3b --- /dev/null +++ b/mods/everness/stairs.lua @@ -0,0 +1,941 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +stairs.register_stair_and_slab( + 'coral_desert_stone', + 'everness:coral_desert_stone', + { cracky = 3 }, + { 'everness_coral_desert_stone.png' }, + 'Coral Desert Stone Stair', + 'Coral Desert Stone Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_desert_cobble', + 'everness:coral_desert_cobble', + { cracky = 3 }, + { 'everness_coral_desert_cobble.png' }, + 'Coral Desert Cobblestone Stair', + 'Coral Desert Cobblestone Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_desert_mossy_cobble', + 'everness:coral_desert_mossy_cobble', + { cracky = 3 }, + { 'everness_coral_desert_mossy_cobble.png' }, + 'Coral Mossy Cobblestone Stair', + 'Coral Mossy Cobblestone Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_brick', + 'everness:cursed_brick', + { cracky = 2 }, + { 'everness_cursed_brick.png' }, + 'Cursed Brick Stair', + 'Cursed Brick Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_brick_with_growth', + 'everness:cursed_brick_with_growth', + { cracky = 2 }, + { 'everness_cursed_brick_with_growth.png' }, + 'Cursed Brick with Growth Stair', + 'Cursed Brick with Growth Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_sandstone_block', + 'everness:cursed_sandstone_block', + { cracky = 2 }, + { 'everness_cursed_sandstone_block.png' }, + 'Cursed Sandstone Block Stair', + 'Cursed Sandstone Block Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_sandstone_brick', + 'everness:cursed_sandstone_brick', + { cracky = 2 }, + { 'everness_cursed_sandstone_brick.png' }, + 'Cursed Sandstone Brick Stair', + 'Cursed Sandstone Brick Slab', + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_stone_carved', + 'everness:cursed_stone_carved', + { cracky = 2 }, + { + { + name = 'everness_cursed_stone_carved.png', + align_style = 'world', + scale = 2 + } + }, + 'Cursed Stone Carved Stair', + 'Cursed Stone Carved Slab', + Everness.node_sound_stone_defaults(), + true +) + +-- Quartz + +stairs.register_stair_and_slab( + 'quartz_block', + 'everness:quartz_block', + { cracky = 2 }, + { + 'everness_quartz_block_top.png', + 'everness_quartz_block_bottom.png', + 'everness_quartz_block_side.png', + }, + S('Quartz Block Stair'), + S('Quartz Block Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'quartz_chiseled', + 'everness:quartz_chiseled', + { cracky = 2 }, + { + 'everness_quartz_block_chiseled_top.png', + 'everness_quartz_block_chiseled_top.png', + 'everness_quartz_block_chiseled.png', + }, + S('Quartz Chiseled Stair'), + S('Quartz Chiseled Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'quartz_pillar', + 'everness:quartz_pillar', + { cracky = 2 }, + { + 'everness_quartz_block_lines_top.png', + 'everness_quartz_block_lines_top.png', + 'everness_quartz_block_lines.png', + }, + S('Quartz Pillar Stair'), + S('Quartz Pillar Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Dry Wood + +stairs.register_stair_and_slab( + 'dry_wood', + 'everness:dry_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_dry_wood.png' }, + S('Dry Wood Stair'), + S('Dry Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +stairs.register_stair_and_slab( + 'dry_tree', + 'everness:dry_tree', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_dry_tree_top.png', 'everness_dry_tree_top.png', 'everness_dry_tree.png' }, + S('Dry Tree Trunk Stair'), + S('Dry Tree Trunk Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Coral Wood + +stairs.register_stair_and_slab( + 'coral_wood', + 'everness:coral_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 3 }, + { 'everness_coral_wood.png' }, + S('Coral Wood Stair'), + S('Coral Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Bamboo Wood + +stairs.register_stair_and_slab( + 'bamboo_wood', + 'everness:bamboo_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_dry_bamboo_block_side.png' }, + S('Bamboo Wood Stair'), + S('Bamboo Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +stairs.register_stair_and_slab( + 'bamboo_mosaic_wood', + 'everness:bamboo_mosaic_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_bamboo_mosaic.png' }, + S('Bamboo Mosaic Wood Stair'), + S('Bamboo Mosaic Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Forsaken stone + +stairs.register_stair_and_slab( + 'forsaken_desert_brick', + 'everness:forsaken_desert_brick', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_desert_brick.png' }, + S('Forsaken Desert Brick Stair'), + S('Forsaken Desert Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_desert_brick_red', + 'everness:forsaken_desert_brick_red', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_desert_brick_red.png' }, + S('Forsaken Desert Brick Red Stair'), + S('Forsaken Desert Brick Red Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_desert_chiseled_stone', + 'everness:forsaken_desert_chiseled_stone', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_desert_chiseled_stone_side.png' }, + S('Forsaken Desert Chiseled Stone Stair'), + S('Forsaken Desert Chiseled Stone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_desert_engraved_stone', + 'everness:forsaken_desert_engraved_stone', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_desert_engraved_stone.png' }, + S('Forsaken Desert Engraved Stone Stair'), + S('Forsaken Desert Engraved Stone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_desert_cobble', + 'everness:forsaken_desert_cobble', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_desert_cobble.png' }, + S('Forsaken Desert Cobblestone Stair'), + S('Forsaken Desert Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_desert_cobble_red', + 'everness:forsaken_desert_cobble_red', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_desert_cobble_red.png' }, + S('Forsaken Desert Cobblestone Red Stair'), + S('Forsaken Desert Cobblestone Red Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Baobab Wood + +stairs.register_stair_and_slab( + 'baobab_wood', + 'everness:baobab_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_baobab_wood.png' }, + S('Baobab Wood Stair'), + S('Baobab Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Sequoia Wood + +stairs.register_stair_and_slab( + 'sequoia_wood', + 'everness:sequoia_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_sequoia_wood.png' }, + S('Sequoia Wood Stair'), + S('Sequoia Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Forsaken Tundra + +stairs.register_stair_and_slab( + 'forsaken_tundra_cobble', + 'everness:forsaken_tundra_cobble', + { cracky = 3, stone = 2 }, + { 'everness_forsaken_tundra_cobblestone.png' }, + S('Forsaken Tundra Cobblestone Stair'), + S('Forsaken Tundra Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_tundra_stone', + 'everness:forsaken_tundra_stone', + { cracky = 3, stone = 1 }, + { 'everness_forsaken_tundra_stone.png' }, + S('Forsaken Tundra Stone Stair'), + S('Forsaken Tundra Stone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'forsaken_tundra_brick', + 'everness:forsaken_tundra_brick', + { cracky = 2, stone = 1 }, + { 'everness_forsaken_tundra_brick.png' }, + S('Forsaken Tundra Brick Stair'), + S('Forsaken Tundra Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Willow Wood + +stairs.register_stair_and_slab( + 'willow_wood', + 'everness:willow_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_willow_wood.png' }, + S('Willow Wood Stair'), + S('Willow Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Crystal Wood + +stairs.register_stair_and_slab( + 'crystal_wood', + 'everness:crystal_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_crystal_wood.png' }, + S('Crystal Wood Stair'), + S('Crystal Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Mese Wood + +stairs.register_stair_and_slab( + 'mese_wood', + 'everness:mese_wood', + { choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + { 'everness_mese_wood.png' }, + S('Mese Wood Stair'), + S('Mese Wood Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Magma Cobble + +stairs.register_stair_and_slab( + 'magmacobble', + 'everness:magmacobble', + { cracky = 3, stone = 1 }, + { + { + name = 'everness_magmacobble_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + } + }, + S('Magma Cobblestone Stair'), + S('Magma Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Volcanic rock + +stairs.register_stair_and_slab( + 'volcanic_rock', + 'everness:volcanic_rock', + { cracky = 1, stone = 2 }, + { 'everness_volcanic_rock.png' }, + S('Volcanic Rock Stair'), + S('Volcanic Rock Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'volcanic_rock_with_magma', + 'everness:volcanic_rock_with_magma', + { cracky = 1, stone = 2 }, + { + { + name = 'everness_volcanic_rock_with_magma_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + S('Volcanic Rock with Magma Stair'), + S('Volcanic Rock with Magma Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Coral Forest Deep Ocean + +stairs.register_stair_and_slab( + 'coral_deep_ocean_sandstone_block', + 'everness:coral_deep_ocean_sandstone_block', + { cracky = 2 }, + { 'everness_deep_ocean_sandstone_block.png' }, + S('Coral Depp Ocean Sandstone Block Stair'), + S('Coral Depp Ocean Sandstone Block Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_deep_ocean_sandstone_brick', + 'everness:coral_deep_ocean_sandstone_brick', + { cracky = 2 }, + { 'everness_deep_ocean_sandstone_brick.png' }, + S('Coral Depp Ocean Sandstone Brick Stair'), + S('Coral Depp Ocean Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Coral White Sandstone + +stairs.register_stair_and_slab( + 'coral_white_sandstone', + 'everness:coral_white_sandstone', + { cracky = 2 }, + { 'everness_coral_white_sandstone.png' }, + S('Coral White Sandstone Stair'), + S('Coral White Sandstone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_white_sandstone_pillar', + 'everness:coral_white_sandstone_pillar', + { cracky = 2 }, + { + 'everness_coral_white_sandstone.png', + 'everness_coral_white_sandstone.png', + 'everness_coral_white_sandstone_pillar.png', + }, + S('Coral White Sandstone Pillar Stair'), + S('Coral White Sandstone Pillar Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_white_sandstone_brick', + 'everness:coral_white_sandstone_brick', + { cracky = 2 }, + { 'everness_coral_white_sandstone_brick.png' }, + S('Coral White Sandstone Brick Stair'), + S('Coral White Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Coral Desert Stone + +stairs.register_stair_and_slab( + 'coral_desert_stone_block', + 'everness:coral_desert_stone_block', + { cracky = 2 }, + { 'everness_coral_desert_stone_block.png' }, + S('Coral Desert Stone Block Stair'), + S('Coral Desert Stone Block Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_desert_stone_brick', + 'everness:coral_desert_stone_brick', + { cracky = 2 }, + { 'everness_coral_desert_stone_brick.png' }, + S('Coral Desert Stone Brick Stair'), + S('Coral Desert Stone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Coral Sandstone + +stairs.register_stair_and_slab( + 'coral_sandstone', + 'everness:coral_sandstone', + { cracky = 2 }, + { 'everness_coral_sandstone.png' }, + S('Coral Sandstone Stair'), + S('Coral Sandstone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_sandstone_brick', + 'everness:coral_sandstone_brick', + { cracky = 2 }, + { 'everness_coral_sandstone_brick.png' }, + S('Coral Sandstone Brick Stair'), + S('Coral Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_sandstone_chiseled', + 'everness:coral_sandstone_chiseled', + { cracky = 2 }, + { 'everness_coral_sandstone_chiseled.png' }, + S('Coral Sandstone Chiseled Stair'), + S('Coral Sandstone Chiseled Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_sandstone_carved_1', + 'everness:coral_sandstone_carved_1', + { cracky = 2 }, + { 'everness_coral_sandstone_carved_1.png' }, + S('Coral Sandstone Carved Stair'), + S('Coral Sandstone Carved Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_lands_deep_ocean_sandstone_block', + 'everness:cursed_lands_deep_ocean_sandstone_block', + { cracky = 2 }, + { 'everness_cursed_lands_deep_ocean_sandblock.png' }, + S('Cursed Lands Deep Ocean Sandstone Block Stair'), + S('Cursed Lands Deep Ocean Sandstone Block Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'cursed_lands_deep_ocean_sandstone_brick', + 'everness:cursed_lands_deep_ocean_sandstone_brick', + { cracky = 2 }, + { 'everness_cursed_lands_deep_ocean_sand_brick.png' }, + S('Cursed Lands Deep Ocean Sandstone Brick Stair'), + S('Cursed Lands Deep Ocean Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Crystal +stairs.register_stair_and_slab( + 'crystal_forest_deep_ocean_sandstone_block', + 'everness:crystal_forest_deep_ocean_sandstone_block', + { cracky = 2 }, + { 'everness_crystal_forest_deep_ocean_sandstone_block.png' }, + S('Crystal Forest Deep Ocean Sandstone Block Stair'), + S('Crystal Forest Deep Ocean Sandstone Block Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'crystal_forest_deep_ocean_sandstone_brick', + 'everness:crystal_forest_deep_ocean_sandstone_brick', + { cracky = 2 }, + { 'everness_crystal_forest_deep_ocean_sandstone_brick.png' }, + S('Crystal Forest Deep Ocean Sandstone Brick Stair'), + S('Crystal Forest Deep Ocean Sandstone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'crystal_cobble', + 'everness:crystal_cobble', + { cracky = 2 }, + { 'everness_crystal_cobble.png' }, + S('Crystal Cobblestone Stair'), + S('Crystal Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'crystal_mossy_cobble', + 'everness:crystal_mossy_cobble', + { cracky = 2 }, + { 'everness_crystal_mossy_cobble.png' }, + S('Crystal Mossy Cobblestone Stair'), + S('Crystal Mossy Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'crystal_stone_brick', + 'everness:crystal_stone_brick', + { cracky = 2 }, + { 'everness_crystal_stone_brick.png' }, + S('Crystal Stone Brick Stair'), + S('Crystal Stone Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'everness_glass', + 'everness:glass', + { cracky = 3, oddly_breakable_by_hand = 3 }, + { 'everness_glass.png' }, + S('Everness Glass Stair'), + S('Everness Glass Slab'), + Everness.node_sound_glass_defaults(), + true +) + +-- Coral Bones + +stairs.register_stair_and_slab( + 'coral_bones_block', + 'everness:coral_bones_block', + { cracky = 2, stone = 1 }, + { 'everness_coral_bones_block.png' }, + S('Coral Bones Block Stair'), + S('Coral Bones Block Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'coral_bones_brick', + 'everness:coral_bones_brick', + { cracky = 2, stone = 1 }, + { 'everness_coral_bones_brick.png' }, + S('Coral Bones Brick Stair'), + S('Coral Bones Brick Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Mineral Waters + +stairs.register_stair_and_slab( + 'mineral_stone', + 'everness:mineral_stone', + { cracky = 3, stone = 1 }, + {{ + name = 'everness_mineral_stone.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_stone_cobble', + 'everness:mineral_stone_cobble', + { cracky = 3, stone = 2 }, + {{ + name = 'everness_mineral_cobblestone.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Cobblestone') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Cobblestone') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_stone_block', + 'everness:mineral_stone_block', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_block.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Block') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Block') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_stone_brick', + 'everness:mineral_stone_brick', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_brick.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_sandstone', + 'everness:mineral_sandstone', + { cracky = 3 }, + { 'everness_mineral_sandstone.png' }, + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_sandstone_block', + 'everness:mineral_sandstone_block', + { cracky = 2 }, + {{ + name = 'everness_mineral_sandstone_block.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Block') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Block') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_sandstone_brick', + 'everness:mineral_sandstone_brick', + { cracky = 2 }, + {{ + name = 'everness_mineral_sandstone_brick.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_sandstone_brick_block', + 'everness:mineral_sandstone_brick_block', + { cracky = 2 }, + { + { name = 'everness_mineral_sandstone_brick_block_top.png' }, + { name = 'everness_mineral_sandstone_brick_block_top.png' }, + { + name = 'everness_mineral_sandstone_brick_block.png', + align_style = 'world', + scale = 2 + } + }, + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Block') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Sandstone') .. ' ' .. S('Brick') .. ' ' .. S('Block') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_stone_brick_with_growth', + 'everness:mineral_stone_brick_with_growth', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_brick_with_growth.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Growth') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Growth') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_stone_brick_with_flower_growth', + 'everness:mineral_stone_brick_with_flower_growth', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_brick_with_flower_growth.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Flower Growth') .. ' ' .. S('Stair'), + S('Mineral') .. ' ' .. S('Stone') .. ' ' .. S('Brick') .. ' ' .. S('with Flower Growth') .. ' ' .. S('Slab'), + Everness.node_sound_stone_defaults(), + true +) + +-- Palm Wood +stairs.register_stair_and_slab( + 'palm_tree_wood', + 'everness:palm_tree_wood', + { choppy = 3, oddly_breakable_by_hand = 2, flammable = 3 }, + {{ + name = 'everness_palm_tree_wood.png', + align_style = 'world', + scale = 2 + }}, + S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Wood') .. ' ' .. S('Planks') .. ' ' .. S('Stair'), + S('Palm') .. ' ' .. S('Tree') .. ' ' .. S('Wood') .. ' ' .. S('Planks') .. ' ' .. S('Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Lava Tree Wood +stairs.register_stair_and_slab( + 'lava_tree_wood', + 'everness:lava_tree_wood', + { choppy = 3, oddly_breakable_by_hand = 2, flammable = 3 }, + {{ + name = 'everness_lava_tree_wood.png', + align_style = 'world', + scale = 2 + }}, + S('Lava Tree Wood Planks Stair'), + S('Lava Tree Wood Planks Slab'), + Everness.node_sound_wood_defaults(), + true +) + +-- Mineral Waters Under +stairs.register_stair_and_slab( + 'mineral_cave_stone', + 'everness:mineral_cave_stone', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_stone_under.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral Cave Stone Stair'), + S('Mineral Cave Stone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_cave_cobblestone', + 'everness:mineral_cave_cobblestone', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_cobblestone_under.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral Cave Cobblestone Stair'), + S('Mineral Cave Cobblestone Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_lava_stone', + 'everness:mineral_lava_stone', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_lava_stone_animated.png', + align_style = 'world', + scale = 2, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6.4, + }, + }}, + S('Mineral Lava Stone with lava Stair'), + S('Mineral Lava Stone with lava Slab'), + Everness.node_sound_stone_defaults(), + true +) + +stairs.register_stair_and_slab( + 'mineral_lava_stone_dry', + 'everness:mineral_lava_stone_dry', + { cracky = 2, stone = 1 }, + {{ + name = 'everness_mineral_lava_stone_bottom.png', + align_style = 'world', + scale = 2 + }}, + S('Mineral Lava Stone without lava Stair'), + S('Mineral Lava Stone without lava Slab'), + Everness.node_sound_stone_defaults(), + true +) diff --git a/mods/everness/textures/everness_agave_leaf_1.png b/mods/everness/textures/everness_agave_leaf_1.png new file mode 100644 index 0000000..79162db Binary files /dev/null and b/mods/everness/textures/everness_agave_leaf_1.png differ diff --git a/mods/everness/textures/everness_agave_leaf_2.png b/mods/everness/textures/everness_agave_leaf_2.png new file mode 100644 index 0000000..bb34eb4 Binary files /dev/null and b/mods/everness/textures/everness_agave_leaf_2.png differ diff --git a/mods/everness/textures/everness_agave_leaf_3.png b/mods/everness/textures/everness_agave_leaf_3.png new file mode 100644 index 0000000..4560359 Binary files /dev/null and b/mods/everness/textures/everness_agave_leaf_3.png differ diff --git a/mods/everness/textures/everness_amaranita_lantern_fur.png b/mods/everness/textures/everness_amaranita_lantern_fur.png new file mode 100644 index 0000000..9903a8b Binary files /dev/null and b/mods/everness/textures/everness_amaranita_lantern_fur.png differ diff --git a/mods/everness/textures/everness_amaranita_lantern_item.png b/mods/everness/textures/everness_amaranita_lantern_item.png new file mode 100644 index 0000000..8586f5d Binary files /dev/null and b/mods/everness/textures/everness_amaranita_lantern_item.png differ diff --git a/mods/everness/textures/everness_amaranita_lantern_light.png b/mods/everness/textures/everness_amaranita_lantern_light.png new file mode 100644 index 0000000..6966d65 Binary files /dev/null and b/mods/everness/textures/everness_amaranita_lantern_light.png differ diff --git a/mods/everness/textures/everness_amaranita_lantern_roots.png b/mods/everness/textures/everness_amaranita_lantern_roots.png new file mode 100644 index 0000000..4b0fc43 Binary files /dev/null and b/mods/everness/textures/everness_amaranita_lantern_roots.png differ diff --git a/mods/everness/textures/everness_ancient_emerald_ice.png b/mods/everness/textures/everness_ancient_emerald_ice.png new file mode 100644 index 0000000..22bc21e Binary files /dev/null and b/mods/everness/textures/everness_ancient_emerald_ice.png differ diff --git a/mods/everness/textures/everness_bamboo_block_side.png b/mods/everness/textures/everness_bamboo_block_side.png new file mode 100644 index 0000000..2484249 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_block_side.png differ diff --git a/mods/everness/textures/everness_bamboo_block_top.png b/mods/everness/textures/everness_bamboo_block_top.png new file mode 100644 index 0000000..b6cbf4a Binary files /dev/null and b/mods/everness/textures/everness_bamboo_block_top.png differ diff --git a/mods/everness/textures/everness_bamboo_forest_sun.png b/mods/everness/textures/everness_bamboo_forest_sun.png new file mode 100644 index 0000000..6818c09 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_forest_sun.png differ diff --git a/mods/everness/textures/everness_bamboo_forest_sun_tonemap.png b/mods/everness/textures/everness_bamboo_forest_sun_tonemap.png new file mode 100644 index 0000000..6a9f443 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_forest_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_bamboo_forest_sunrisebg.png b/mods/everness/textures/everness_bamboo_forest_sunrisebg.png new file mode 100644 index 0000000..0d435ae Binary files /dev/null and b/mods/everness/textures/everness_bamboo_forest_sunrisebg.png differ diff --git a/mods/everness/textures/everness_bamboo_item.png b/mods/everness/textures/everness_bamboo_item.png new file mode 100644 index 0000000..dee737c Binary files /dev/null and b/mods/everness/textures/everness_bamboo_item.png differ diff --git a/mods/everness/textures/everness_bamboo_large_1.png b/mods/everness/textures/everness_bamboo_large_1.png new file mode 100644 index 0000000..0c1a39e Binary files /dev/null and b/mods/everness/textures/everness_bamboo_large_1.png differ diff --git a/mods/everness/textures/everness_bamboo_large_2.png b/mods/everness/textures/everness_bamboo_large_2.png new file mode 100644 index 0000000..233f861 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_large_2.png differ diff --git a/mods/everness/textures/everness_bamboo_large_3.png b/mods/everness/textures/everness_bamboo_large_3.png new file mode 100644 index 0000000..1cbf3cb Binary files /dev/null and b/mods/everness/textures/everness_bamboo_large_3.png differ diff --git a/mods/everness/textures/everness_bamboo_large_bottom.png b/mods/everness/textures/everness_bamboo_large_bottom.png new file mode 100644 index 0000000..1a33d08 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_large_bottom.png differ diff --git a/mods/everness/textures/everness_bamboo_large_top.png b/mods/everness/textures/everness_bamboo_large_top.png new file mode 100644 index 0000000..e0d28df Binary files /dev/null and b/mods/everness/textures/everness_bamboo_large_top.png differ diff --git a/mods/everness/textures/everness_bamboo_mosaic.png b/mods/everness/textures/everness_bamboo_mosaic.png new file mode 100644 index 0000000..832b353 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_mosaic.png differ diff --git a/mods/everness/textures/everness_bamboo_palette.png b/mods/everness/textures/everness_bamboo_palette.png new file mode 100644 index 0000000..a2b0818 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_palette.png differ diff --git a/mods/everness/textures/everness_bamboo_small_1.png b/mods/everness/textures/everness_bamboo_small_1.png new file mode 100644 index 0000000..6368e8b Binary files /dev/null and b/mods/everness/textures/everness_bamboo_small_1.png differ diff --git a/mods/everness/textures/everness_bamboo_small_2.png b/mods/everness/textures/everness_bamboo_small_2.png new file mode 100644 index 0000000..20a7933 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_small_2.png differ diff --git a/mods/everness/textures/everness_bamboo_small_top.png b/mods/everness/textures/everness_bamboo_small_top.png new file mode 100644 index 0000000..d666ad3 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_small_top.png differ diff --git a/mods/everness/textures/everness_bamboo_sprout.png b/mods/everness/textures/everness_bamboo_sprout.png new file mode 100644 index 0000000..fcd6d51 Binary files /dev/null and b/mods/everness/textures/everness_bamboo_sprout.png differ diff --git a/mods/everness/textures/everness_baobab_savanna_sun.png b/mods/everness/textures/everness_baobab_savanna_sun.png new file mode 100644 index 0000000..ad45d71 Binary files /dev/null and b/mods/everness/textures/everness_baobab_savanna_sun.png differ diff --git a/mods/everness/textures/everness_baobab_tree_fruit.png b/mods/everness/textures/everness_baobab_tree_fruit.png new file mode 100644 index 0000000..6708fea Binary files /dev/null and b/mods/everness/textures/everness_baobab_tree_fruit.png differ diff --git a/mods/everness/textures/everness_baobab_tree_fruit_roasted.png b/mods/everness/textures/everness_baobab_tree_fruit_roasted.png new file mode 100644 index 0000000..52b6ba1 Binary files /dev/null and b/mods/everness/textures/everness_baobab_tree_fruit_roasted.png differ diff --git a/mods/everness/textures/everness_baobab_tree_leaves.png b/mods/everness/textures/everness_baobab_tree_leaves.png new file mode 100644 index 0000000..af945c9 Binary files /dev/null and b/mods/everness/textures/everness_baobab_tree_leaves.png differ diff --git a/mods/everness/textures/everness_baobab_tree_sapling.png b/mods/everness/textures/everness_baobab_tree_sapling.png new file mode 100644 index 0000000..c4fb7b0 Binary files /dev/null and b/mods/everness/textures/everness_baobab_tree_sapling.png differ diff --git a/mods/everness/textures/everness_baobab_tree_side.png b/mods/everness/textures/everness_baobab_tree_side.png new file mode 100644 index 0000000..afef95a Binary files /dev/null and b/mods/everness/textures/everness_baobab_tree_side.png differ diff --git a/mods/everness/textures/everness_baobab_tree_top.png b/mods/everness/textures/everness_baobab_tree_top.png new file mode 100644 index 0000000..e484c7f Binary files /dev/null and b/mods/everness/textures/everness_baobab_tree_top.png differ diff --git a/mods/everness/textures/everness_baobab_wood.png b/mods/everness/textures/everness_baobab_wood.png new file mode 100644 index 0000000..8e16314 Binary files /dev/null and b/mods/everness/textures/everness_baobab_wood.png differ diff --git a/mods/everness/textures/everness_bloodspore_plant.png b/mods/everness/textures/everness_bloodspore_plant.png new file mode 100644 index 0000000..b8b31c6 Binary files /dev/null and b/mods/everness/textures/everness_bloodspore_plant.png differ diff --git a/mods/everness/textures/everness_bloodspore_plant_small.png b/mods/everness/textures/everness_bloodspore_plant_small.png new file mode 100644 index 0000000..34ae437 Binary files /dev/null and b/mods/everness/textures/everness_bloodspore_plant_small.png differ diff --git a/mods/everness/textures/everness_blooming_cooksonia.png b/mods/everness/textures/everness_blooming_cooksonia.png new file mode 100644 index 0000000..98ee3cc Binary files /dev/null and b/mods/everness/textures/everness_blooming_cooksonia.png differ diff --git a/mods/everness/textures/everness_blue_crying_obsidian.png b/mods/everness/textures/everness_blue_crying_obsidian.png new file mode 100644 index 0000000..23847fc Binary files /dev/null and b/mods/everness/textures/everness_blue_crying_obsidian.png differ diff --git a/mods/everness/textures/everness_blue_vine_lantern.png b/mods/everness/textures/everness_blue_vine_lantern.png new file mode 100644 index 0000000..e497a5e Binary files /dev/null and b/mods/everness/textures/everness_blue_vine_lantern.png differ diff --git a/mods/everness/textures/everness_blue_vine_lantern_item.png b/mods/everness/textures/everness_blue_vine_lantern_item.png new file mode 100644 index 0000000..c582a60 Binary files /dev/null and b/mods/everness/textures/everness_blue_vine_lantern_item.png differ diff --git a/mods/everness/textures/everness_blue_vine_lantern_leaves.png b/mods/everness/textures/everness_blue_vine_lantern_leaves.png new file mode 100644 index 0000000..9354758 Binary files /dev/null and b/mods/everness/textures/everness_blue_vine_lantern_leaves.png differ diff --git a/mods/everness/textures/everness_blue_vine_lantern_roots.png b/mods/everness/textures/everness_blue_vine_lantern_roots.png new file mode 100644 index 0000000..6c00369 Binary files /dev/null and b/mods/everness/textures/everness_blue_vine_lantern_roots.png differ diff --git a/mods/everness/textures/everness_blue_weeping_obsidian.png b/mods/everness/textures/everness_blue_weeping_obsidian.png new file mode 100644 index 0000000..02ad34c Binary files /dev/null and b/mods/everness/textures/everness_blue_weeping_obsidian.png differ diff --git a/mods/everness/textures/everness_bone.png b/mods/everness/textures/everness_bone.png new file mode 100644 index 0000000..b6ff784 Binary files /dev/null and b/mods/everness/textures/everness_bone.png differ diff --git a/mods/everness/textures/everness_bone_top.png b/mods/everness/textures/everness_bone_top.png new file mode 100644 index 0000000..7208e8e Binary files /dev/null and b/mods/everness/textures/everness_bone_top.png differ diff --git a/mods/everness/textures/everness_bubble.png b/mods/everness/textures/everness_bubble.png new file mode 100644 index 0000000..e937bd9 Binary files /dev/null and b/mods/everness/textures/everness_bubble.png differ diff --git a/mods/everness/textures/everness_bucket_empty.png b/mods/everness/textures/everness_bucket_empty.png new file mode 100644 index 0000000..994cbaa Binary files /dev/null and b/mods/everness/textures/everness_bucket_empty.png differ diff --git a/mods/everness/textures/everness_bucket_lava.png b/mods/everness/textures/everness_bucket_lava.png new file mode 100644 index 0000000..06da103 Binary files /dev/null and b/mods/everness/textures/everness_bucket_lava.png differ diff --git a/mods/everness/textures/everness_bucket_mineral_water.png b/mods/everness/textures/everness_bucket_mineral_water.png new file mode 100644 index 0000000..a2761b8 Binary files /dev/null and b/mods/everness/textures/everness_bucket_mineral_water.png differ diff --git a/mods/everness/textures/everness_bulb_vine_1.png b/mods/everness/textures/everness_bulb_vine_1.png new file mode 100644 index 0000000..b0811d4 Binary files /dev/null and b/mods/everness/textures/everness_bulb_vine_1.png differ diff --git a/mods/everness/textures/everness_bulb_vine_2.png b/mods/everness/textures/everness_bulb_vine_2.png new file mode 100644 index 0000000..b8955c0 Binary files /dev/null and b/mods/everness/textures/everness_bulb_vine_2.png differ diff --git a/mods/everness/textures/everness_bulb_vine_end.png b/mods/everness/textures/everness_bulb_vine_end.png new file mode 100644 index 0000000..3243d66 Binary files /dev/null and b/mods/everness/textures/everness_bulb_vine_end.png differ diff --git a/mods/everness/textures/everness_cactus_blue_side.png b/mods/everness/textures/everness_cactus_blue_side.png new file mode 100644 index 0000000..74bf906 Binary files /dev/null and b/mods/everness/textures/everness_cactus_blue_side.png differ diff --git a/mods/everness/textures/everness_cactus_blue_top.png b/mods/everness/textures/everness_cactus_blue_top.png new file mode 100644 index 0000000..e16454f Binary files /dev/null and b/mods/everness/textures/everness_cactus_blue_top.png differ diff --git a/mods/everness/textures/everness_cactus_side.png b/mods/everness/textures/everness_cactus_side.png new file mode 100644 index 0000000..6d5edde Binary files /dev/null and b/mods/everness/textures/everness_cactus_side.png differ diff --git a/mods/everness/textures/everness_cactus_top.png b/mods/everness/textures/everness_cactus_top.png new file mode 100644 index 0000000..7321a79 Binary files /dev/null and b/mods/everness/textures/everness_cactus_top.png differ diff --git a/mods/everness/textures/everness_candle_flame_animated.png b/mods/everness/textures/everness_candle_flame_animated.png new file mode 100644 index 0000000..f9dfc87 Binary files /dev/null and b/mods/everness/textures/everness_candle_flame_animated.png differ diff --git a/mods/everness/textures/everness_cave_barrel_cactus_item.png b/mods/everness/textures/everness_cave_barrel_cactus_item.png new file mode 100644 index 0000000..1c716cd Binary files /dev/null and b/mods/everness/textures/everness_cave_barrel_cactus_item.png differ diff --git a/mods/everness/textures/everness_cave_barrel_cactus_mesh.png b/mods/everness/textures/everness_cave_barrel_cactus_mesh.png new file mode 100644 index 0000000..7994ad8 Binary files /dev/null and b/mods/everness/textures/everness_cave_barrel_cactus_mesh.png differ diff --git a/mods/everness/textures/everness_cave_flower_item.png b/mods/everness/textures/everness_cave_flower_item.png new file mode 100644 index 0000000..bed46f0 Binary files /dev/null and b/mods/everness/textures/everness_cave_flower_item.png differ diff --git a/mods/everness/textures/everness_cave_flower_item_particles.png b/mods/everness/textures/everness_cave_flower_item_particles.png new file mode 100644 index 0000000..958adb2 Binary files /dev/null and b/mods/everness/textures/everness_cave_flower_item_particles.png differ diff --git a/mods/everness/textures/everness_cave_flower_mesh.png b/mods/everness/textures/everness_cave_flower_mesh.png new file mode 100644 index 0000000..de6694c Binary files /dev/null and b/mods/everness/textures/everness_cave_flower_mesh.png differ diff --git a/mods/everness/textures/everness_cave_flower_mesh_particles.png b/mods/everness/textures/everness_cave_flower_mesh_particles.png new file mode 100644 index 0000000..55772a4 Binary files /dev/null and b/mods/everness/textures/everness_cave_flower_mesh_particles.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_blank_mesh.png b/mods/everness/textures/everness_ceramic_pot_blank_mesh.png new file mode 100644 index 0000000..7a3c428 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_blank_mesh.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_blank_sherd.png b/mods/everness/textures/everness_ceramic_pot_blank_sherd.png new file mode 100644 index 0000000..3e44cf1 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_blank_sherd.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_flowers_mesh.png b/mods/everness/textures/everness_ceramic_pot_flowers_mesh.png new file mode 100644 index 0000000..b41d0e1 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_flowers_mesh.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_flowers_sherd.png b/mods/everness/textures/everness_ceramic_pot_flowers_sherd.png new file mode 100644 index 0000000..bbdfc4d Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_flowers_sherd.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_lines_mesh.png b/mods/everness/textures/everness_ceramic_pot_lines_mesh.png new file mode 100644 index 0000000..60d4393 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_lines_mesh.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_lines_sherd.png b/mods/everness/textures/everness_ceramic_pot_lines_sherd.png new file mode 100644 index 0000000..7207e32 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_lines_sherd.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_tribal_mesh.png b/mods/everness/textures/everness_ceramic_pot_tribal_mesh.png new file mode 100644 index 0000000..19b7249 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_tribal_mesh.png differ diff --git a/mods/everness/textures/everness_ceramic_pot_tribal_sherd.png b/mods/everness/textures/everness_ceramic_pot_tribal_sherd.png new file mode 100644 index 0000000..412bef1 Binary files /dev/null and b/mods/everness/textures/everness_ceramic_pot_tribal_sherd.png differ diff --git a/mods/everness/textures/everness_ceramic_sherds_ore.png b/mods/everness/textures/everness_ceramic_sherds_ore.png new file mode 100644 index 0000000..351d85a Binary files /dev/null and b/mods/everness/textures/everness_ceramic_sherds_ore.png differ diff --git a/mods/everness/textures/everness_chest_front.png b/mods/everness/textures/everness_chest_front.png new file mode 100644 index 0000000..46c5b74 Binary files /dev/null and b/mods/everness/textures/everness_chest_front.png differ diff --git a/mods/everness/textures/everness_chest_inside.png b/mods/everness/textures/everness_chest_inside.png new file mode 100644 index 0000000..3a05d10 Binary files /dev/null and b/mods/everness/textures/everness_chest_inside.png differ diff --git a/mods/everness/textures/everness_chest_side.png b/mods/everness/textures/everness_chest_side.png new file mode 100644 index 0000000..211195d Binary files /dev/null and b/mods/everness/textures/everness_chest_side.png differ diff --git a/mods/everness/textures/everness_chest_top.png b/mods/everness/textures/everness_chest_top.png new file mode 100644 index 0000000..2c24e9d Binary files /dev/null and b/mods/everness/textures/everness_chest_top.png differ diff --git a/mods/everness/textures/everness_chest_ui_bg.png b/mods/everness/textures/everness_chest_ui_bg.png new file mode 100644 index 0000000..c6cc3a7 Binary files /dev/null and b/mods/everness/textures/everness_chest_ui_bg.png differ diff --git a/mods/everness/textures/everness_chest_ui_bg_hb_slot.png b/mods/everness/textures/everness_chest_ui_bg_hb_slot.png new file mode 100644 index 0000000..4d56244 Binary files /dev/null and b/mods/everness/textures/everness_chest_ui_bg_hb_slot.png differ diff --git a/mods/everness/textures/everness_chest_ui_bg_slot.png b/mods/everness/textures/everness_chest_ui_bg_slot.png new file mode 100644 index 0000000..a1f9fa8 Binary files /dev/null and b/mods/everness/textures/everness_chest_ui_bg_slot.png differ diff --git a/mods/everness/textures/everness_clover.png b/mods/everness/textures/everness_clover.png new file mode 100644 index 0000000..ebc1f08 Binary files /dev/null and b/mods/everness/textures/everness_clover.png differ diff --git a/mods/everness/textures/everness_clover_with_flowers.png b/mods/everness/textures/everness_clover_with_flowers.png new file mode 100644 index 0000000..2a4dd5e Binary files /dev/null and b/mods/everness/textures/everness_clover_with_flowers.png differ diff --git a/mods/everness/textures/everness_cobweb.png b/mods/everness/textures/everness_cobweb.png new file mode 100644 index 0000000..18a34ce Binary files /dev/null and b/mods/everness/textures/everness_cobweb.png differ diff --git a/mods/everness/textures/everness_coconut_bottom.png b/mods/everness/textures/everness_coconut_bottom.png new file mode 100644 index 0000000..e6d19b2 Binary files /dev/null and b/mods/everness/textures/everness_coconut_bottom.png differ diff --git a/mods/everness/textures/everness_coconut_item.png b/mods/everness/textures/everness_coconut_item.png new file mode 100644 index 0000000..d8aae4f Binary files /dev/null and b/mods/everness/textures/everness_coconut_item.png differ diff --git a/mods/everness/textures/everness_coconut_side.png b/mods/everness/textures/everness_coconut_side.png new file mode 100644 index 0000000..a298f01 Binary files /dev/null and b/mods/everness/textures/everness_coconut_side.png differ diff --git a/mods/everness/textures/everness_coconut_side_z.png b/mods/everness/textures/everness_coconut_side_z.png new file mode 100644 index 0000000..f184841 Binary files /dev/null and b/mods/everness/textures/everness_coconut_side_z.png differ diff --git a/mods/everness/textures/everness_coconut_top.png b/mods/everness/textures/everness_coconut_top.png new file mode 100644 index 0000000..567e6b0 Binary files /dev/null and b/mods/everness/textures/everness_coconut_top.png differ diff --git a/mods/everness/textures/everness_coral_bones.png b/mods/everness/textures/everness_coral_bones.png new file mode 100644 index 0000000..c6a050d Binary files /dev/null and b/mods/everness/textures/everness_coral_bones.png differ diff --git a/mods/everness/textures/everness_coral_bones_block.png b/mods/everness/textures/everness_coral_bones_block.png new file mode 100644 index 0000000..5057e4b Binary files /dev/null and b/mods/everness/textures/everness_coral_bones_block.png differ diff --git a/mods/everness/textures/everness_coral_bones_brick.png b/mods/everness/textures/everness_coral_bones_brick.png new file mode 100644 index 0000000..0585868 Binary files /dev/null and b/mods/everness/textures/everness_coral_bones_brick.png differ diff --git a/mods/everness/textures/everness_coral_burdock_1.png b/mods/everness/textures/everness_coral_burdock_1.png new file mode 100644 index 0000000..5b5316c Binary files /dev/null and b/mods/everness/textures/everness_coral_burdock_1.png differ diff --git a/mods/everness/textures/everness_coral_burdock_2.png b/mods/everness/textures/everness_coral_burdock_2.png new file mode 100644 index 0000000..9648a76 Binary files /dev/null and b/mods/everness/textures/everness_coral_burdock_2.png differ diff --git a/mods/everness/textures/everness_coral_bush.png b/mods/everness/textures/everness_coral_bush.png new file mode 100644 index 0000000..cd6d4e3 Binary files /dev/null and b/mods/everness/textures/everness_coral_bush.png differ diff --git a/mods/everness/textures/everness_coral_corals.png b/mods/everness/textures/everness_coral_corals.png new file mode 100644 index 0000000..04d4a5c Binary files /dev/null and b/mods/everness/textures/everness_coral_corals.png differ diff --git a/mods/everness/textures/everness_coral_desert_cobble.png b/mods/everness/textures/everness_coral_desert_cobble.png new file mode 100644 index 0000000..a3085d9 Binary files /dev/null and b/mods/everness/textures/everness_coral_desert_cobble.png differ diff --git a/mods/everness/textures/everness_coral_desert_mossy_cobble.png b/mods/everness/textures/everness_coral_desert_mossy_cobble.png new file mode 100644 index 0000000..9a83672 Binary files /dev/null and b/mods/everness/textures/everness_coral_desert_mossy_cobble.png differ diff --git a/mods/everness/textures/everness_coral_desert_stone.png b/mods/everness/textures/everness_coral_desert_stone.png new file mode 100644 index 0000000..e65571f Binary files /dev/null and b/mods/everness/textures/everness_coral_desert_stone.png differ diff --git a/mods/everness/textures/everness_coral_desert_stone_block.png b/mods/everness/textures/everness_coral_desert_stone_block.png new file mode 100644 index 0000000..469d344 Binary files /dev/null and b/mods/everness/textures/everness_coral_desert_stone_block.png differ diff --git a/mods/everness/textures/everness_coral_desert_stone_brick.png b/mods/everness/textures/everness_coral_desert_stone_brick.png new file mode 100644 index 0000000..9c66db6 Binary files /dev/null and b/mods/everness/textures/everness_coral_desert_stone_brick.png differ diff --git a/mods/everness/textures/everness_coral_dirt.png b/mods/everness/textures/everness_coral_dirt.png new file mode 100644 index 0000000..854c59f Binary files /dev/null and b/mods/everness/textures/everness_coral_dirt.png differ diff --git a/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_animated.png b/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_animated.png new file mode 100644 index 0000000..b4781c8 Binary files /dev/null and b/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_animated.png differ diff --git a/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_bottom.png b/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_bottom.png new file mode 100644 index 0000000..33fb0ba Binary files /dev/null and b/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_bottom.png differ diff --git a/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_top.png b/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_top.png new file mode 100644 index 0000000..2426110 Binary files /dev/null and b/mods/everness/textures/everness_coral_forest_deep_ocean_lantern_top.png differ diff --git a/mods/everness/textures/everness_coral_forest_sun.png b/mods/everness/textures/everness_coral_forest_sun.png new file mode 100644 index 0000000..f00c533 Binary files /dev/null and b/mods/everness/textures/everness_coral_forest_sun.png differ diff --git a/mods/everness/textures/everness_coral_forest_sun_tonemap.png b/mods/everness/textures/everness_coral_forest_sun_tonemap.png new file mode 100644 index 0000000..ed95167 Binary files /dev/null and b/mods/everness/textures/everness_coral_forest_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_coral_grass.png b/mods/everness/textures/everness_coral_grass.png new file mode 100644 index 0000000..39f664e Binary files /dev/null and b/mods/everness/textures/everness_coral_grass.png differ diff --git a/mods/everness/textures/everness_coral_grass_1.png b/mods/everness/textures/everness_coral_grass_1.png new file mode 100644 index 0000000..f47503d Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_1.png differ diff --git a/mods/everness/textures/everness_coral_grass_2.png b/mods/everness/textures/everness_coral_grass_2.png new file mode 100644 index 0000000..92c2dcc Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_2.png differ diff --git a/mods/everness/textures/everness_coral_grass_3.png b/mods/everness/textures/everness_coral_grass_3.png new file mode 100644 index 0000000..6fa6f8c Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_3.png differ diff --git a/mods/everness/textures/everness_coral_grass_4.png b/mods/everness/textures/everness_coral_grass_4.png new file mode 100644 index 0000000..3166150 Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_4.png differ diff --git a/mods/everness/textures/everness_coral_grass_5.png b/mods/everness/textures/everness_coral_grass_5.png new file mode 100644 index 0000000..8bb46ee Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_5.png differ diff --git a/mods/everness/textures/everness_coral_grass_globulagus.png b/mods/everness/textures/everness_coral_grass_globulagus.png new file mode 100644 index 0000000..a44be62 Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_globulagus.png differ diff --git a/mods/everness/textures/everness_coral_grass_orange.png b/mods/everness/textures/everness_coral_grass_orange.png new file mode 100644 index 0000000..0705608 Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_orange.png differ diff --git a/mods/everness/textures/everness_coral_grass_side.png b/mods/everness/textures/everness_coral_grass_side.png new file mode 100644 index 0000000..d6ffe4f Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_side.png differ diff --git a/mods/everness/textures/everness_coral_grass_tall.png b/mods/everness/textures/everness_coral_grass_tall.png new file mode 100644 index 0000000..deafd7a Binary files /dev/null and b/mods/everness/textures/everness_coral_grass_tall.png differ diff --git a/mods/everness/textures/everness_coral_jellyfish.png b/mods/everness/textures/everness_coral_jellyfish.png new file mode 100644 index 0000000..7cdd249 Binary files /dev/null and b/mods/everness/textures/everness_coral_jellyfish.png differ diff --git a/mods/everness/textures/everness_coral_leaves.png b/mods/everness/textures/everness_coral_leaves.png new file mode 100644 index 0000000..33ae883 Binary files /dev/null and b/mods/everness/textures/everness_coral_leaves.png differ diff --git a/mods/everness/textures/everness_coral_leaves_particle_anim.png b/mods/everness/textures/everness_coral_leaves_particle_anim.png new file mode 100644 index 0000000..8ccb10d Binary files /dev/null and b/mods/everness/textures/everness_coral_leaves_particle_anim.png differ diff --git a/mods/everness/textures/everness_coral_mushrooms_bioluminescent.png b/mods/everness/textures/everness_coral_mushrooms_bioluminescent.png new file mode 100644 index 0000000..1f3705b Binary files /dev/null and b/mods/everness/textures/everness_coral_mushrooms_bioluminescent.png differ diff --git a/mods/everness/textures/everness_coral_plant_bioluminescent.png b/mods/everness/textures/everness_coral_plant_bioluminescent.png new file mode 100644 index 0000000..d444a21 Binary files /dev/null and b/mods/everness/textures/everness_coral_plant_bioluminescent.png differ diff --git a/mods/everness/textures/everness_coral_sand.png b/mods/everness/textures/everness_coral_sand.png new file mode 100644 index 0000000..a36eb31 Binary files /dev/null and b/mods/everness/textures/everness_coral_sand.png differ diff --git a/mods/everness/textures/everness_coral_sandstone.png b/mods/everness/textures/everness_coral_sandstone.png new file mode 100644 index 0000000..b9458b8 Binary files /dev/null and b/mods/everness/textures/everness_coral_sandstone.png differ diff --git a/mods/everness/textures/everness_coral_sandstone_brick.png b/mods/everness/textures/everness_coral_sandstone_brick.png new file mode 100644 index 0000000..cf29b5b Binary files /dev/null and b/mods/everness/textures/everness_coral_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_coral_sandstone_carved_1.png b/mods/everness/textures/everness_coral_sandstone_carved_1.png new file mode 100644 index 0000000..a46c22d Binary files /dev/null and b/mods/everness/textures/everness_coral_sandstone_carved_1.png differ diff --git a/mods/everness/textures/everness_coral_sandstone_chiseled.png b/mods/everness/textures/everness_coral_sandstone_chiseled.png new file mode 100644 index 0000000..b5e2a90 Binary files /dev/null and b/mods/everness/textures/everness_coral_sandstone_chiseled.png differ diff --git a/mods/everness/textures/everness_coral_shrub.png b/mods/everness/textures/everness_coral_shrub.png new file mode 100644 index 0000000..722cc00 Binary files /dev/null and b/mods/everness/textures/everness_coral_shrub.png differ diff --git a/mods/everness/textures/everness_coral_skeleton.png b/mods/everness/textures/everness_coral_skeleton.png new file mode 100644 index 0000000..9a54140 Binary files /dev/null and b/mods/everness/textures/everness_coral_skeleton.png differ diff --git a/mods/everness/textures/everness_coral_stone_with_moss_side.png b/mods/everness/textures/everness_coral_stone_with_moss_side.png new file mode 100644 index 0000000..821b79b Binary files /dev/null and b/mods/everness/textures/everness_coral_stone_with_moss_side.png differ diff --git a/mods/everness/textures/everness_coral_stone_with_moss_top.png b/mods/everness/textures/everness_coral_stone_with_moss_top.png new file mode 100644 index 0000000..2a29008 Binary files /dev/null and b/mods/everness/textures/everness_coral_stone_with_moss_top.png differ diff --git a/mods/everness/textures/everness_coral_tree.png b/mods/everness/textures/everness_coral_tree.png new file mode 100644 index 0000000..61c1921 Binary files /dev/null and b/mods/everness/textures/everness_coral_tree.png differ diff --git a/mods/everness/textures/everness_coral_tree_bioluminescent_particle_anim.png b/mods/everness/textures/everness_coral_tree_bioluminescent_particle_anim.png new file mode 100644 index 0000000..7388073 Binary files /dev/null and b/mods/everness/textures/everness_coral_tree_bioluminescent_particle_anim.png differ diff --git a/mods/everness/textures/everness_coral_tree_bioluminescent_sapling.png b/mods/everness/textures/everness_coral_tree_bioluminescent_sapling.png new file mode 100644 index 0000000..25f2121 Binary files /dev/null and b/mods/everness/textures/everness_coral_tree_bioluminescent_sapling.png differ diff --git a/mods/everness/textures/everness_coral_tree_sapling.png b/mods/everness/textures/everness_coral_tree_sapling.png new file mode 100644 index 0000000..6440e68 Binary files /dev/null and b/mods/everness/textures/everness_coral_tree_sapling.png differ diff --git a/mods/everness/textures/everness_coral_white_sand.png b/mods/everness/textures/everness_coral_white_sand.png new file mode 100644 index 0000000..8100846 Binary files /dev/null and b/mods/everness/textures/everness_coral_white_sand.png differ diff --git a/mods/everness/textures/everness_coral_white_sandstone.png b/mods/everness/textures/everness_coral_white_sandstone.png new file mode 100644 index 0000000..c17bdbf Binary files /dev/null and b/mods/everness/textures/everness_coral_white_sandstone.png differ diff --git a/mods/everness/textures/everness_coral_white_sandstone_brick.png b/mods/everness/textures/everness_coral_white_sandstone_brick.png new file mode 100644 index 0000000..9477ab9 Binary files /dev/null and b/mods/everness/textures/everness_coral_white_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_coral_white_sandstone_pillar.png b/mods/everness/textures/everness_coral_white_sandstone_pillar.png new file mode 100644 index 0000000..f79cda2 Binary files /dev/null and b/mods/everness/textures/everness_coral_white_sandstone_pillar.png differ diff --git a/mods/everness/textures/everness_coral_wood.png b/mods/everness/textures/everness_coral_wood.png new file mode 100644 index 0000000..60df5c7 Binary files /dev/null and b/mods/everness/textures/everness_coral_wood.png differ diff --git a/mods/everness/textures/everness_creeping_moss_spores.png b/mods/everness/textures/everness_creeping_moss_spores.png new file mode 100644 index 0000000..672cc16 Binary files /dev/null and b/mods/everness/textures/everness_creeping_moss_spores.png differ diff --git a/mods/everness/textures/everness_crystal_block_cyan.png b/mods/everness/textures/everness_crystal_block_cyan.png new file mode 100644 index 0000000..9a8599f Binary files /dev/null and b/mods/everness/textures/everness_crystal_block_cyan.png differ diff --git a/mods/everness/textures/everness_crystal_block_cyan_top.png b/mods/everness/textures/everness_crystal_block_cyan_top.png new file mode 100644 index 0000000..cd70697 Binary files /dev/null and b/mods/everness/textures/everness_crystal_block_cyan_top.png differ diff --git a/mods/everness/textures/everness_crystal_block_orange.png b/mods/everness/textures/everness_crystal_block_orange.png new file mode 100644 index 0000000..938893e Binary files /dev/null and b/mods/everness/textures/everness_crystal_block_orange.png differ diff --git a/mods/everness/textures/everness_crystal_block_orange_top.png b/mods/everness/textures/everness_crystal_block_orange_top.png new file mode 100644 index 0000000..b21581c Binary files /dev/null and b/mods/everness/textures/everness_crystal_block_orange_top.png differ diff --git a/mods/everness/textures/everness_crystal_block_purple.png b/mods/everness/textures/everness_crystal_block_purple.png new file mode 100644 index 0000000..477ff36 Binary files /dev/null and b/mods/everness/textures/everness_crystal_block_purple.png differ diff --git a/mods/everness/textures/everness_crystal_block_purple_top.png b/mods/everness/textures/everness_crystal_block_purple_top.png new file mode 100644 index 0000000..e66b00e Binary files /dev/null and b/mods/everness/textures/everness_crystal_block_purple_top.png differ diff --git a/mods/everness/textures/everness_crystal_bush_leaves.png b/mods/everness/textures/everness_crystal_bush_leaves.png new file mode 100644 index 0000000..dca315a Binary files /dev/null and b/mods/everness/textures/everness_crystal_bush_leaves.png differ diff --git a/mods/everness/textures/everness_crystal_bush_sapling.png b/mods/everness/textures/everness_crystal_bush_sapling.png new file mode 100644 index 0000000..c416d83 Binary files /dev/null and b/mods/everness/textures/everness_crystal_bush_sapling.png differ diff --git a/mods/everness/textures/everness_crystal_bush_stem.png b/mods/everness/textures/everness_crystal_bush_stem.png new file mode 100644 index 0000000..6c144eb Binary files /dev/null and b/mods/everness/textures/everness_crystal_bush_stem.png differ diff --git a/mods/everness/textures/everness_crystal_cave_dirt.png b/mods/everness/textures/everness_crystal_cave_dirt.png new file mode 100644 index 0000000..63e7195 Binary files /dev/null and b/mods/everness/textures/everness_crystal_cave_dirt.png differ diff --git a/mods/everness/textures/everness_crystal_cave_dirt_side.png b/mods/everness/textures/everness_crystal_cave_dirt_side.png new file mode 100644 index 0000000..bf1c497 Binary files /dev/null and b/mods/everness/textures/everness_crystal_cave_dirt_side.png differ diff --git a/mods/everness/textures/everness_crystal_cave_dirt_top.png b/mods/everness/textures/everness_crystal_cave_dirt_top.png new file mode 100644 index 0000000..c8b5a1e Binary files /dev/null and b/mods/everness/textures/everness_crystal_cave_dirt_top.png differ diff --git a/mods/everness/textures/everness_crystal_cave_moss.png b/mods/everness/textures/everness_crystal_cave_moss.png new file mode 100644 index 0000000..d54cc74 Binary files /dev/null and b/mods/everness/textures/everness_crystal_cave_moss.png differ diff --git a/mods/everness/textures/everness_crystal_cluster_base.png b/mods/everness/textures/everness_crystal_cluster_base.png new file mode 100644 index 0000000..4aeecb4 Binary files /dev/null and b/mods/everness/textures/everness_crystal_cluster_base.png differ diff --git a/mods/everness/textures/everness_crystal_cluster_side.png b/mods/everness/textures/everness_crystal_cluster_side.png new file mode 100644 index 0000000..fafbbd2 Binary files /dev/null and b/mods/everness/textures/everness_crystal_cluster_side.png differ diff --git a/mods/everness/textures/everness_crystal_cluster_top.png b/mods/everness/textures/everness_crystal_cluster_top.png new file mode 100644 index 0000000..26d9ff4 Binary files /dev/null and b/mods/everness/textures/everness_crystal_cluster_top.png differ diff --git a/mods/everness/textures/everness_crystal_cobble.png b/mods/everness/textures/everness_crystal_cobble.png new file mode 100644 index 0000000..957d8cf Binary files /dev/null and b/mods/everness/textures/everness_crystal_cobble.png differ diff --git a/mods/everness/textures/everness_crystal_coral_dark_block.png b/mods/everness/textures/everness_crystal_coral_dark_block.png new file mode 100644 index 0000000..442e22b Binary files /dev/null and b/mods/everness/textures/everness_crystal_coral_dark_block.png differ diff --git a/mods/everness/textures/everness_crystal_coral_light_block.png b/mods/everness/textures/everness_crystal_coral_light_block.png new file mode 100644 index 0000000..da2a0a1 Binary files /dev/null and b/mods/everness/textures/everness_crystal_coral_light_block.png differ diff --git a/mods/everness/textures/everness_crystal_cyan.png b/mods/everness/textures/everness_crystal_cyan.png new file mode 100644 index 0000000..c8fea2e Binary files /dev/null and b/mods/everness/textures/everness_crystal_cyan.png differ diff --git a/mods/everness/textures/everness_crystal_dirt.png b/mods/everness/textures/everness_crystal_dirt.png new file mode 100644 index 0000000..4cc3c5b Binary files /dev/null and b/mods/everness/textures/everness_crystal_dirt.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_1.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_1.png new file mode 100644 index 0000000..00aae1d Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_1.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_2.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_2.png new file mode 100644 index 0000000..16fcba8 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_2.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_3.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_3.png new file mode 100644 index 0000000..b3524fc Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_3.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_1.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_1.png new file mode 100644 index 0000000..de66c80 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_1.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_2.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_2.png new file mode 100644 index 0000000..dd3683f Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_2.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_3.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_3.png new file mode 100644 index 0000000..79ac442 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_coral_plant_3.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_sand.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_sand.png new file mode 100644 index 0000000..d4fa164 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_sand.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_sand_bubbles.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_sand_bubbles.png new file mode 100644 index 0000000..8fa03d7 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_sand_bubbles.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_sand_with_crack.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_sand_with_crack.png new file mode 100644 index 0000000..20930c5 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_sand_with_crack.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_sandstone_block.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_sandstone_block.png new file mode 100644 index 0000000..f0e5cde Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_sandstone_block.png differ diff --git a/mods/everness/textures/everness_crystal_forest_deep_ocean_sandstone_brick.png b/mods/everness/textures/everness_crystal_forest_deep_ocean_sandstone_brick.png new file mode 100644 index 0000000..8126b45 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_deep_ocean_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_crystal_forest_moon.png b/mods/everness/textures/everness_crystal_forest_moon.png new file mode 100644 index 0000000..3331ead Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_moon.png differ diff --git a/mods/everness/textures/everness_crystal_forest_moon_tonemap.png b/mods/everness/textures/everness_crystal_forest_moon_tonemap.png new file mode 100644 index 0000000..437fcf7 Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_moon_tonemap.png differ diff --git a/mods/everness/textures/everness_crystal_forest_sun.png b/mods/everness/textures/everness_crystal_forest_sun.png new file mode 100644 index 0000000..b33167b Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_sun.png differ diff --git a/mods/everness/textures/everness_crystal_forest_sun_tonemap.png b/mods/everness/textures/everness_crystal_forest_sun_tonemap.png new file mode 100644 index 0000000..70afecb Binary files /dev/null and b/mods/everness/textures/everness_crystal_forest_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_crystal_grass.png b/mods/everness/textures/everness_crystal_grass.png new file mode 100644 index 0000000..b7345ca Binary files /dev/null and b/mods/everness/textures/everness_crystal_grass.png differ diff --git a/mods/everness/textures/everness_crystal_grass_1.png b/mods/everness/textures/everness_crystal_grass_1.png new file mode 100644 index 0000000..43cf9a2 Binary files /dev/null and b/mods/everness/textures/everness_crystal_grass_1.png differ diff --git a/mods/everness/textures/everness_crystal_grass_2.png b/mods/everness/textures/everness_crystal_grass_2.png new file mode 100644 index 0000000..386f57a Binary files /dev/null and b/mods/everness/textures/everness_crystal_grass_2.png differ diff --git a/mods/everness/textures/everness_crystal_grass_3.png b/mods/everness/textures/everness_crystal_grass_3.png new file mode 100644 index 0000000..fd8748f Binary files /dev/null and b/mods/everness/textures/everness_crystal_grass_3.png differ diff --git a/mods/everness/textures/everness_crystal_grass_side.png b/mods/everness/textures/everness_crystal_grass_side.png new file mode 100644 index 0000000..a0f91f8 Binary files /dev/null and b/mods/everness/textures/everness_crystal_grass_side.png differ diff --git a/mods/everness/textures/everness_crystal_leaves.png b/mods/everness/textures/everness_crystal_leaves.png new file mode 100644 index 0000000..226efc0 Binary files /dev/null and b/mods/everness/textures/everness_crystal_leaves.png differ diff --git a/mods/everness/textures/everness_crystal_leaves_particle_anim.png b/mods/everness/textures/everness_crystal_leaves_particle_anim.png new file mode 100644 index 0000000..604dcd6 Binary files /dev/null and b/mods/everness/textures/everness_crystal_leaves_particle_anim.png differ diff --git a/mods/everness/textures/everness_crystal_lily_flower_small.png b/mods/everness/textures/everness_crystal_lily_flower_small.png new file mode 100644 index 0000000..22c5217 Binary files /dev/null and b/mods/everness/textures/everness_crystal_lily_flower_small.png differ diff --git a/mods/everness/textures/everness_crystal_lily_leaf_small.png b/mods/everness/textures/everness_crystal_lily_leaf_small.png new file mode 100644 index 0000000..b4a3bbe Binary files /dev/null and b/mods/everness/textures/everness_crystal_lily_leaf_small.png differ diff --git a/mods/everness/textures/everness_crystal_megalith_base.png b/mods/everness/textures/everness_crystal_megalith_base.png new file mode 100644 index 0000000..94e45b6 Binary files /dev/null and b/mods/everness/textures/everness_crystal_megalith_base.png differ diff --git a/mods/everness/textures/everness_crystal_megalith_side_1.png b/mods/everness/textures/everness_crystal_megalith_side_1.png new file mode 100644 index 0000000..10e5030 Binary files /dev/null and b/mods/everness/textures/everness_crystal_megalith_side_1.png differ diff --git a/mods/everness/textures/everness_crystal_megalith_side_2.png b/mods/everness/textures/everness_crystal_megalith_side_2.png new file mode 100644 index 0000000..a44466a Binary files /dev/null and b/mods/everness/textures/everness_crystal_megalith_side_2.png differ diff --git a/mods/everness/textures/everness_crystal_megalith_side_3.png b/mods/everness/textures/everness_crystal_megalith_side_3.png new file mode 100644 index 0000000..9c5fa0f Binary files /dev/null and b/mods/everness/textures/everness_crystal_megalith_side_3.png differ diff --git a/mods/everness/textures/everness_crystal_megalith_side_4.png b/mods/everness/textures/everness_crystal_megalith_side_4.png new file mode 100644 index 0000000..8ab5d41 Binary files /dev/null and b/mods/everness/textures/everness_crystal_megalith_side_4.png differ diff --git a/mods/everness/textures/everness_crystal_megalith_side_5.png b/mods/everness/textures/everness_crystal_megalith_side_5.png new file mode 100644 index 0000000..7aeb105 Binary files /dev/null and b/mods/everness/textures/everness_crystal_megalith_side_5.png differ diff --git a/mods/everness/textures/everness_crystal_megalith_top.png b/mods/everness/textures/everness_crystal_megalith_top.png new file mode 100644 index 0000000..965305c Binary files /dev/null and b/mods/everness/textures/everness_crystal_megalith_top.png differ diff --git a/mods/everness/textures/everness_crystal_mossy_cobble.png b/mods/everness/textures/everness_crystal_mossy_cobble.png new file mode 100644 index 0000000..2e42e5a Binary files /dev/null and b/mods/everness/textures/everness_crystal_mossy_cobble.png differ diff --git a/mods/everness/textures/everness_crystal_mushrooms.png b/mods/everness/textures/everness_crystal_mushrooms.png new file mode 100644 index 0000000..3528e36 Binary files /dev/null and b/mods/everness/textures/everness_crystal_mushrooms.png differ diff --git a/mods/everness/textures/everness_crystal_orange.png b/mods/everness/textures/everness_crystal_orange.png new file mode 100644 index 0000000..eedae91 Binary files /dev/null and b/mods/everness/textures/everness_crystal_orange.png differ diff --git a/mods/everness/textures/everness_crystal_palette.png b/mods/everness/textures/everness_crystal_palette.png new file mode 100644 index 0000000..f7fdbc2 Binary files /dev/null and b/mods/everness/textures/everness_crystal_palette.png differ diff --git a/mods/everness/textures/everness_crystal_purple.png b/mods/everness/textures/everness_crystal_purple.png new file mode 100644 index 0000000..bce95b6 Binary files /dev/null and b/mods/everness/textures/everness_crystal_purple.png differ diff --git a/mods/everness/textures/everness_crystal_sand.png b/mods/everness/textures/everness_crystal_sand.png new file mode 100644 index 0000000..614af51 Binary files /dev/null and b/mods/everness/textures/everness_crystal_sand.png differ diff --git a/mods/everness/textures/everness_crystal_sandstone.png b/mods/everness/textures/everness_crystal_sandstone.png new file mode 100644 index 0000000..05e5afc Binary files /dev/null and b/mods/everness/textures/everness_crystal_sandstone.png differ diff --git a/mods/everness/textures/everness_crystal_sandstone_brick.png b/mods/everness/textures/everness_crystal_sandstone_brick.png new file mode 100644 index 0000000..8f84428 Binary files /dev/null and b/mods/everness/textures/everness_crystal_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_crystal_sandstone_chiseled.png b/mods/everness/textures/everness_crystal_sandstone_chiseled.png new file mode 100644 index 0000000..908ce93 Binary files /dev/null and b/mods/everness/textures/everness_crystal_sandstone_chiseled.png differ diff --git a/mods/everness/textures/everness_crystal_stone.png b/mods/everness/textures/everness_crystal_stone.png new file mode 100644 index 0000000..a57d060 Binary files /dev/null and b/mods/everness/textures/everness_crystal_stone.png differ diff --git a/mods/everness/textures/everness_crystal_stone_brick.png b/mods/everness/textures/everness_crystal_stone_brick.png new file mode 100644 index 0000000..aa19ecf Binary files /dev/null and b/mods/everness/textures/everness_crystal_stone_brick.png differ diff --git a/mods/everness/textures/everness_crystal_tree.png b/mods/everness/textures/everness_crystal_tree.png new file mode 100644 index 0000000..8b6c8b5 Binary files /dev/null and b/mods/everness/textures/everness_crystal_tree.png differ diff --git a/mods/everness/textures/everness_crystal_tree_large_sapling.png b/mods/everness/textures/everness_crystal_tree_large_sapling.png new file mode 100644 index 0000000..97d45ed Binary files /dev/null and b/mods/everness/textures/everness_crystal_tree_large_sapling.png differ diff --git a/mods/everness/textures/everness_crystal_tree_sapling.png b/mods/everness/textures/everness_crystal_tree_sapling.png new file mode 100644 index 0000000..a9d2da7 Binary files /dev/null and b/mods/everness/textures/everness_crystal_tree_sapling.png differ diff --git a/mods/everness/textures/everness_crystal_tree_top.png b/mods/everness/textures/everness_crystal_tree_top.png new file mode 100644 index 0000000..509af61 Binary files /dev/null and b/mods/everness/textures/everness_crystal_tree_top.png differ diff --git a/mods/everness/textures/everness_crystal_wood.png b/mods/everness/textures/everness_crystal_wood.png new file mode 100644 index 0000000..62050c7 Binary files /dev/null and b/mods/everness/textures/everness_crystal_wood.png differ diff --git a/mods/everness/textures/everness_cursed_bar.png b/mods/everness/textures/everness_cursed_bar.png new file mode 100644 index 0000000..a40c661 Binary files /dev/null and b/mods/everness/textures/everness_cursed_bar.png differ diff --git a/mods/everness/textures/everness_cursed_bar_top.png b/mods/everness/textures/everness_cursed_bar_top.png new file mode 100644 index 0000000..8230e88 Binary files /dev/null and b/mods/everness/textures/everness_cursed_bar_top.png differ diff --git a/mods/everness/textures/everness_cursed_brick.png b/mods/everness/textures/everness_cursed_brick.png new file mode 100644 index 0000000..b3a085f Binary files /dev/null and b/mods/everness/textures/everness_cursed_brick.png differ diff --git a/mods/everness/textures/everness_cursed_brick_carved.png b/mods/everness/textures/everness_cursed_brick_carved.png new file mode 100644 index 0000000..2beba64 Binary files /dev/null and b/mods/everness/textures/everness_cursed_brick_carved.png differ diff --git a/mods/everness/textures/everness_cursed_brick_mixed.png b/mods/everness/textures/everness_cursed_brick_mixed.png new file mode 100644 index 0000000..251bfb1 Binary files /dev/null and b/mods/everness/textures/everness_cursed_brick_mixed.png differ diff --git a/mods/everness/textures/everness_cursed_brick_with_growth.png b/mods/everness/textures/everness_cursed_brick_with_growth.png new file mode 100644 index 0000000..e16a26e Binary files /dev/null and b/mods/everness/textures/everness_cursed_brick_with_growth.png differ diff --git a/mods/everness/textures/everness_cursed_bush_leaves.png b/mods/everness/textures/everness_cursed_bush_leaves.png new file mode 100644 index 0000000..510f0eb Binary files /dev/null and b/mods/everness/textures/everness_cursed_bush_leaves.png differ diff --git a/mods/everness/textures/everness_cursed_bush_sapling.png b/mods/everness/textures/everness_cursed_bush_sapling.png new file mode 100644 index 0000000..55c4c06 Binary files /dev/null and b/mods/everness/textures/everness_cursed_bush_sapling.png differ diff --git a/mods/everness/textures/everness_cursed_bush_stem.png b/mods/everness/textures/everness_cursed_bush_stem.png new file mode 100644 index 0000000..8b82ab1 Binary files /dev/null and b/mods/everness/textures/everness_cursed_bush_stem.png differ diff --git a/mods/everness/textures/everness_cursed_dirt.png b/mods/everness/textures/everness_cursed_dirt.png new file mode 100644 index 0000000..c6085fb Binary files /dev/null and b/mods/everness/textures/everness_cursed_dirt.png differ diff --git a/mods/everness/textures/everness_cursed_dream_stone.png b/mods/everness/textures/everness_cursed_dream_stone.png new file mode 100644 index 0000000..f32c6c8 Binary files /dev/null and b/mods/everness/textures/everness_cursed_dream_stone.png differ diff --git a/mods/everness/textures/everness_cursed_dream_stone_particle_anim.png b/mods/everness/textures/everness_cursed_dream_stone_particle_anim.png new file mode 100644 index 0000000..565a46c Binary files /dev/null and b/mods/everness/textures/everness_cursed_dream_stone_particle_anim.png differ diff --git a/mods/everness/textures/everness_cursed_dream_tree_sapling.png b/mods/everness/textures/everness_cursed_dream_tree_sapling.png new file mode 100644 index 0000000..ebe7388 Binary files /dev/null and b/mods/everness/textures/everness_cursed_dream_tree_sapling.png differ diff --git a/mods/everness/textures/everness_cursed_dry_pine_leaves.png b/mods/everness/textures/everness_cursed_dry_pine_leaves.png new file mode 100644 index 0000000..3b7a16e Binary files /dev/null and b/mods/everness/textures/everness_cursed_dry_pine_leaves.png differ diff --git a/mods/everness/textures/everness_cursed_energy_core_animated.png b/mods/everness/textures/everness_cursed_energy_core_animated.png new file mode 100644 index 0000000..d54e365 Binary files /dev/null and b/mods/everness/textures/everness_cursed_energy_core_animated.png differ diff --git a/mods/everness/textures/everness_cursed_energy_glow_animated.png b/mods/everness/textures/everness_cursed_energy_glow_animated.png new file mode 100644 index 0000000..d0ea946 Binary files /dev/null and b/mods/everness/textures/everness_cursed_energy_glow_animated.png differ diff --git a/mods/everness/textures/everness_cursed_energy_palette.png b/mods/everness/textures/everness_cursed_energy_palette.png new file mode 100644 index 0000000..9a934cf Binary files /dev/null and b/mods/everness/textures/everness_cursed_energy_palette.png differ diff --git a/mods/everness/textures/everness_cursed_grass.png b/mods/everness/textures/everness_cursed_grass.png new file mode 100644 index 0000000..f251db3 Binary files /dev/null and b/mods/everness/textures/everness_cursed_grass.png differ diff --git a/mods/everness/textures/everness_cursed_grass_1.png b/mods/everness/textures/everness_cursed_grass_1.png new file mode 100644 index 0000000..0b1762d Binary files /dev/null and b/mods/everness/textures/everness_cursed_grass_1.png differ diff --git a/mods/everness/textures/everness_cursed_grass_side.png b/mods/everness/textures/everness_cursed_grass_side.png new file mode 100644 index 0000000..e9fed19 Binary files /dev/null and b/mods/everness/textures/everness_cursed_grass_side.png differ diff --git a/mods/everness/textures/everness_cursed_hands.png b/mods/everness/textures/everness_cursed_hands.png new file mode 100644 index 0000000..5e0f711 Binary files /dev/null and b/mods/everness/textures/everness_cursed_hands.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_alcyonacea.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_alcyonacea.png new file mode 100644 index 0000000..b8bf9da Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_alcyonacea.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_anemone.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_anemone.png new file mode 100644 index 0000000..571775d Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_anemone.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_darkilluma.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_darkilluma.png new file mode 100644 index 0000000..c0ec4f4 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_darkilluma.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_demon.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_demon.png new file mode 100644 index 0000000..41a0a88 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_demon.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_octocurse.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_octocurse.png new file mode 100644 index 0000000..a3cac62 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_octocurse.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_ostracod.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_ostracod.png new file mode 100644 index 0000000..b04681e Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_coral_ostracod.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_sand.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_sand.png new file mode 100644 index 0000000..59c6bd7 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_sand.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_sand_brick.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_sand_brick.png new file mode 100644 index 0000000..3a685b2 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_sand_brick.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_sand_with_crack.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_sand_with_crack.png new file mode 100644 index 0000000..6c43743 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_sand_with_crack.png differ diff --git a/mods/everness/textures/everness_cursed_lands_deep_ocean_sandblock.png b/mods/everness/textures/everness_cursed_lands_deep_ocean_sandblock.png new file mode 100644 index 0000000..16a236f Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_deep_ocean_sandblock.png differ diff --git a/mods/everness/textures/everness_cursed_lands_moon.png b/mods/everness/textures/everness_cursed_lands_moon.png new file mode 100644 index 0000000..703492a Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_moon.png differ diff --git a/mods/everness/textures/everness_cursed_lands_moon_tonemap.png b/mods/everness/textures/everness_cursed_lands_moon_tonemap.png new file mode 100644 index 0000000..388de37 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_moon_tonemap.png differ diff --git a/mods/everness/textures/everness_cursed_lands_sun.png b/mods/everness/textures/everness_cursed_lands_sun.png new file mode 100644 index 0000000..614f6bf Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_sun.png differ diff --git a/mods/everness/textures/everness_cursed_lands_sun_tonemap.png b/mods/everness/textures/everness_cursed_lands_sun_tonemap.png new file mode 100644 index 0000000..2eb1178 Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_cursed_lands_sunrisebg.png b/mods/everness/textures/everness_cursed_lands_sunrisebg.png new file mode 100644 index 0000000..2c845cb Binary files /dev/null and b/mods/everness/textures/everness_cursed_lands_sunrisebg.png differ diff --git a/mods/everness/textures/everness_cursed_mud.png b/mods/everness/textures/everness_cursed_mud.png new file mode 100644 index 0000000..18002ff Binary files /dev/null and b/mods/everness/textures/everness_cursed_mud.png differ diff --git a/mods/everness/textures/everness_cursed_pumpkin_bottom.png b/mods/everness/textures/everness_cursed_pumpkin_bottom.png new file mode 100644 index 0000000..477b4d6 Binary files /dev/null and b/mods/everness/textures/everness_cursed_pumpkin_bottom.png differ diff --git a/mods/everness/textures/everness_cursed_pumpkin_front.png b/mods/everness/textures/everness_cursed_pumpkin_front.png new file mode 100644 index 0000000..ce7f136 Binary files /dev/null and b/mods/everness/textures/everness_cursed_pumpkin_front.png differ diff --git a/mods/everness/textures/everness_cursed_pumpkin_side.png b/mods/everness/textures/everness_cursed_pumpkin_side.png new file mode 100644 index 0000000..3b0df67 Binary files /dev/null and b/mods/everness/textures/everness_cursed_pumpkin_side.png differ diff --git a/mods/everness/textures/everness_cursed_pumpkin_top.png b/mods/everness/textures/everness_cursed_pumpkin_top.png new file mode 100644 index 0000000..3e2815f Binary files /dev/null and b/mods/everness/textures/everness_cursed_pumpkin_top.png differ diff --git a/mods/everness/textures/everness_cursed_ribs.png b/mods/everness/textures/everness_cursed_ribs.png new file mode 100644 index 0000000..d59df35 Binary files /dev/null and b/mods/everness/textures/everness_cursed_ribs.png differ diff --git a/mods/everness/textures/everness_cursed_sand.png b/mods/everness/textures/everness_cursed_sand.png new file mode 100644 index 0000000..eadbb03 Binary files /dev/null and b/mods/everness/textures/everness_cursed_sand.png differ diff --git a/mods/everness/textures/everness_cursed_sandstone_block.png b/mods/everness/textures/everness_cursed_sandstone_block.png new file mode 100644 index 0000000..a3686e3 Binary files /dev/null and b/mods/everness/textures/everness_cursed_sandstone_block.png differ diff --git a/mods/everness/textures/everness_cursed_sandstone_brick.png b/mods/everness/textures/everness_cursed_sandstone_brick.png new file mode 100644 index 0000000..4973cc6 Binary files /dev/null and b/mods/everness/textures/everness_cursed_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_cursed_skull_pole.png b/mods/everness/textures/everness_cursed_skull_pole.png new file mode 100644 index 0000000..f5ff6d8 Binary files /dev/null and b/mods/everness/textures/everness_cursed_skull_pole.png differ diff --git a/mods/everness/textures/everness_cursed_stone.png b/mods/everness/textures/everness_cursed_stone.png new file mode 100644 index 0000000..91d9b33 Binary files /dev/null and b/mods/everness/textures/everness_cursed_stone.png differ diff --git a/mods/everness/textures/everness_cursed_stone_carved.png b/mods/everness/textures/everness_cursed_stone_carved.png new file mode 100644 index 0000000..58364bf Binary files /dev/null and b/mods/everness/textures/everness_cursed_stone_carved.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_1.png b/mods/everness/textures/everness_deep_ocean_coral_1.png new file mode 100644 index 0000000..3a2859c Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_1.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_2.png b/mods/everness/textures/everness_deep_ocean_coral_2.png new file mode 100644 index 0000000..b027e96 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_2.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_3.png b/mods/everness/textures/everness_deep_ocean_coral_3.png new file mode 100644 index 0000000..e8a3ba1 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_3.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_4.png b/mods/everness/textures/everness_deep_ocean_coral_4.png new file mode 100644 index 0000000..7c5ca47 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_4.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_plant_1.png b/mods/everness/textures/everness_deep_ocean_coral_plant_1.png new file mode 100644 index 0000000..5d6ab4f Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_plant_1.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_plant_2.png b/mods/everness/textures/everness_deep_ocean_coral_plant_2.png new file mode 100644 index 0000000..c49c9a4 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_plant_2.png differ diff --git a/mods/everness/textures/everness_deep_ocean_coral_plant_3.png b/mods/everness/textures/everness_deep_ocean_coral_plant_3.png new file mode 100644 index 0000000..f4bf2a7 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_coral_plant_3.png differ diff --git a/mods/everness/textures/everness_deep_ocean_sand.png b/mods/everness/textures/everness_deep_ocean_sand.png new file mode 100644 index 0000000..2e83075 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_sand.png differ diff --git a/mods/everness/textures/everness_deep_ocean_sandstone_block.png b/mods/everness/textures/everness_deep_ocean_sandstone_block.png new file mode 100644 index 0000000..57e9eab Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_sandstone_block.png differ diff --git a/mods/everness/textures/everness_deep_ocean_sandstone_brick.png b/mods/everness/textures/everness_deep_ocean_sandstone_brick.png new file mode 100644 index 0000000..2db2db2 Binary files /dev/null and b/mods/everness/textures/everness_deep_ocean_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_dense_emerald_ice.png b/mods/everness/textures/everness_dense_emerald_ice.png new file mode 100644 index 0000000..958191d Binary files /dev/null and b/mods/everness/textures/everness_dense_emerald_ice.png differ diff --git a/mods/everness/textures/everness_dense_vine_1.png b/mods/everness/textures/everness_dense_vine_1.png new file mode 100644 index 0000000..6714bd7 Binary files /dev/null and b/mods/everness/textures/everness_dense_vine_1.png differ diff --git a/mods/everness/textures/everness_dense_vine_2.png b/mods/everness/textures/everness_dense_vine_2.png new file mode 100644 index 0000000..db4af1b Binary files /dev/null and b/mods/everness/textures/everness_dense_vine_2.png differ diff --git a/mods/everness/textures/everness_dense_vine_end.png b/mods/everness/textures/everness_dense_vine_end.png new file mode 100644 index 0000000..6747927 Binary files /dev/null and b/mods/everness/textures/everness_dense_vine_end.png differ diff --git a/mods/everness/textures/everness_dirt.png b/mods/everness/textures/everness_dirt.png new file mode 100644 index 0000000..1c22639 Binary files /dev/null and b/mods/everness/textures/everness_dirt.png differ diff --git a/mods/everness/textures/everness_door_bamboo.png b/mods/everness/textures/everness_door_bamboo.png new file mode 100644 index 0000000..58e218d Binary files /dev/null and b/mods/everness/textures/everness_door_bamboo.png differ diff --git a/mods/everness/textures/everness_door_bamboo_item.png b/mods/everness/textures/everness_door_bamboo_item.png new file mode 100644 index 0000000..7d8e02c Binary files /dev/null and b/mods/everness/textures/everness_door_bamboo_item.png differ diff --git a/mods/everness/textures/everness_door_bone_pyrite.png b/mods/everness/textures/everness_door_bone_pyrite.png new file mode 100644 index 0000000..fa18a1b Binary files /dev/null and b/mods/everness/textures/everness_door_bone_pyrite.png differ diff --git a/mods/everness/textures/everness_door_bone_pyrite_item.png b/mods/everness/textures/everness_door_bone_pyrite_item.png new file mode 100644 index 0000000..31618ee Binary files /dev/null and b/mods/everness/textures/everness_door_bone_pyrite_item.png differ diff --git a/mods/everness/textures/everness_door_crystal_wood.png b/mods/everness/textures/everness_door_crystal_wood.png new file mode 100644 index 0000000..fc2c306 Binary files /dev/null and b/mods/everness/textures/everness_door_crystal_wood.png differ diff --git a/mods/everness/textures/everness_door_crystal_wood_item.png b/mods/everness/textures/everness_door_crystal_wood_item.png new file mode 100644 index 0000000..1d7bf50 Binary files /dev/null and b/mods/everness/textures/everness_door_crystal_wood_item.png differ diff --git a/mods/everness/textures/everness_door_cursed_steel_bar.png b/mods/everness/textures/everness_door_cursed_steel_bar.png new file mode 100644 index 0000000..303b950 Binary files /dev/null and b/mods/everness/textures/everness_door_cursed_steel_bar.png differ diff --git a/mods/everness/textures/everness_door_cursed_steel_bar_item.png b/mods/everness/textures/everness_door_cursed_steel_bar_item.png new file mode 100644 index 0000000..af539fb Binary files /dev/null and b/mods/everness/textures/everness_door_cursed_steel_bar_item.png differ diff --git a/mods/everness/textures/everness_door_cursed_wood.png b/mods/everness/textures/everness_door_cursed_wood.png new file mode 100644 index 0000000..f559b9b Binary files /dev/null and b/mods/everness/textures/everness_door_cursed_wood.png differ diff --git a/mods/everness/textures/everness_door_cursed_wood_item.png b/mods/everness/textures/everness_door_cursed_wood_item.png new file mode 100644 index 0000000..bcc6ecb Binary files /dev/null and b/mods/everness/textures/everness_door_cursed_wood_item.png differ diff --git a/mods/everness/textures/everness_door_lava_tree_wood.png b/mods/everness/textures/everness_door_lava_tree_wood.png new file mode 100644 index 0000000..1cfac4b Binary files /dev/null and b/mods/everness/textures/everness_door_lava_tree_wood.png differ diff --git a/mods/everness/textures/everness_door_lava_tree_wood_item.png b/mods/everness/textures/everness_door_lava_tree_wood_item.png new file mode 100644 index 0000000..a3450aa Binary files /dev/null and b/mods/everness/textures/everness_door_lava_tree_wood_item.png differ diff --git a/mods/everness/textures/everness_door_palm_wood.png b/mods/everness/textures/everness_door_palm_wood.png new file mode 100644 index 0000000..9a9499f Binary files /dev/null and b/mods/everness/textures/everness_door_palm_wood.png differ diff --git a/mods/everness/textures/everness_door_palm_wood_item.png b/mods/everness/textures/everness_door_palm_wood_item.png new file mode 100644 index 0000000..f553aa2 Binary files /dev/null and b/mods/everness/textures/everness_door_palm_wood_item.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_bamboo.png b/mods/everness/textures/everness_door_trapdoor_bamboo.png new file mode 100644 index 0000000..4958657 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_bamboo.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_bamboo_side.png b/mods/everness/textures/everness_door_trapdoor_bamboo_side.png new file mode 100644 index 0000000..9d4d819 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_bamboo_side.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_crystal_wood.png b/mods/everness/textures/everness_door_trapdoor_crystal_wood.png new file mode 100644 index 0000000..5e2e605 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_crystal_wood.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_crystal_wood_side.png b/mods/everness/textures/everness_door_trapdoor_crystal_wood_side.png new file mode 100644 index 0000000..6d15252 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_crystal_wood_side.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_cursed_wood.png b/mods/everness/textures/everness_door_trapdoor_cursed_wood.png new file mode 100644 index 0000000..b2a4d62 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_cursed_wood.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_cursed_wood_side.png b/mods/everness/textures/everness_door_trapdoor_cursed_wood_side.png new file mode 100644 index 0000000..c355e44 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_cursed_wood_side.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_lava_tree_wood.png b/mods/everness/textures/everness_door_trapdoor_lava_tree_wood.png new file mode 100644 index 0000000..99d3522 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_lava_tree_wood.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_lava_tree_wood_side.png b/mods/everness/textures/everness_door_trapdoor_lava_tree_wood_side.png new file mode 100644 index 0000000..ca1719b Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_lava_tree_wood_side.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_palm_wood.png b/mods/everness/textures/everness_door_trapdoor_palm_wood.png new file mode 100644 index 0000000..17ea6c6 Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_palm_wood.png differ diff --git a/mods/everness/textures/everness_door_trapdoor_palm_wood_side.png b/mods/everness/textures/everness_door_trapdoor_palm_wood_side.png new file mode 100644 index 0000000..6e96c4d Binary files /dev/null and b/mods/everness/textures/everness_door_trapdoor_palm_wood_side.png differ diff --git a/mods/everness/textures/everness_door_willow.png b/mods/everness/textures/everness_door_willow.png new file mode 100644 index 0000000..fd73c89 Binary files /dev/null and b/mods/everness/textures/everness_door_willow.png differ diff --git a/mods/everness/textures/everness_door_willow_item.png b/mods/everness/textures/everness_door_willow_item.png new file mode 100644 index 0000000..d59abda Binary files /dev/null and b/mods/everness/textures/everness_door_willow_item.png differ diff --git a/mods/everness/textures/everness_dry_bamboo_block_side.png b/mods/everness/textures/everness_dry_bamboo_block_side.png new file mode 100644 index 0000000..da19f4f Binary files /dev/null and b/mods/everness/textures/everness_dry_bamboo_block_side.png differ diff --git a/mods/everness/textures/everness_dry_bamboo_block_top.png b/mods/everness/textures/everness_dry_bamboo_block_top.png new file mode 100644 index 0000000..40632f4 Binary files /dev/null and b/mods/everness/textures/everness_dry_bamboo_block_top.png differ diff --git a/mods/everness/textures/everness_dry_branches.png b/mods/everness/textures/everness_dry_branches.png new file mode 100644 index 0000000..9ee26a5 Binary files /dev/null and b/mods/everness/textures/everness_dry_branches.png differ diff --git a/mods/everness/textures/everness_dry_branches_particle_anim.png b/mods/everness/textures/everness_dry_branches_particle_anim.png new file mode 100644 index 0000000..6efda02 Binary files /dev/null and b/mods/everness/textures/everness_dry_branches_particle_anim.png differ diff --git a/mods/everness/textures/everness_dry_dirt.png b/mods/everness/textures/everness_dry_dirt.png new file mode 100644 index 0000000..5bd5a11 Binary files /dev/null and b/mods/everness/textures/everness_dry_dirt.png differ diff --git a/mods/everness/textures/everness_dry_grass_1.png b/mods/everness/textures/everness_dry_grass_1.png new file mode 100644 index 0000000..4c69f61 Binary files /dev/null and b/mods/everness/textures/everness_dry_grass_1.png differ diff --git a/mods/everness/textures/everness_dry_grass_2.png b/mods/everness/textures/everness_dry_grass_2.png new file mode 100644 index 0000000..52504bf Binary files /dev/null and b/mods/everness/textures/everness_dry_grass_2.png differ diff --git a/mods/everness/textures/everness_dry_grass_3.png b/mods/everness/textures/everness_dry_grass_3.png new file mode 100644 index 0000000..b840382 Binary files /dev/null and b/mods/everness/textures/everness_dry_grass_3.png differ diff --git a/mods/everness/textures/everness_dry_grass_4.png b/mods/everness/textures/everness_dry_grass_4.png new file mode 100644 index 0000000..32d5ad5 Binary files /dev/null and b/mods/everness/textures/everness_dry_grass_4.png differ diff --git a/mods/everness/textures/everness_dry_grass_side.png b/mods/everness/textures/everness_dry_grass_side.png new file mode 100644 index 0000000..2bcc742 Binary files /dev/null and b/mods/everness/textures/everness_dry_grass_side.png differ diff --git a/mods/everness/textures/everness_dry_grass_top.png b/mods/everness/textures/everness_dry_grass_top.png new file mode 100644 index 0000000..8b0e4f1 Binary files /dev/null and b/mods/everness/textures/everness_dry_grass_top.png differ diff --git a/mods/everness/textures/everness_dry_tree.png b/mods/everness/textures/everness_dry_tree.png new file mode 100644 index 0000000..0b9a5d8 Binary files /dev/null and b/mods/everness/textures/everness_dry_tree.png differ diff --git a/mods/everness/textures/everness_dry_tree_sapling.png b/mods/everness/textures/everness_dry_tree_sapling.png new file mode 100644 index 0000000..7637fa3 Binary files /dev/null and b/mods/everness/textures/everness_dry_tree_sapling.png differ diff --git a/mods/everness/textures/everness_dry_tree_top.png b/mods/everness/textures/everness_dry_tree_top.png new file mode 100644 index 0000000..0657700 Binary files /dev/null and b/mods/everness/textures/everness_dry_tree_top.png differ diff --git a/mods/everness/textures/everness_dry_wood.png b/mods/everness/textures/everness_dry_wood.png new file mode 100644 index 0000000..4998783 Binary files /dev/null and b/mods/everness/textures/everness_dry_wood.png differ diff --git a/mods/everness/textures/everness_egg_plant_bottom.png b/mods/everness/textures/everness_egg_plant_bottom.png new file mode 100644 index 0000000..74f3944 Binary files /dev/null and b/mods/everness/textures/everness_egg_plant_bottom.png differ diff --git a/mods/everness/textures/everness_egg_plant_item.png b/mods/everness/textures/everness_egg_plant_item.png new file mode 100644 index 0000000..ed51a3c Binary files /dev/null and b/mods/everness/textures/everness_egg_plant_item.png differ diff --git a/mods/everness/textures/everness_egg_plant_side.png b/mods/everness/textures/everness_egg_plant_side.png new file mode 100644 index 0000000..8eb1a78 Binary files /dev/null and b/mods/everness/textures/everness_egg_plant_side.png differ diff --git a/mods/everness/textures/everness_egg_plant_top.png b/mods/everness/textures/everness_egg_plant_top.png new file mode 100644 index 0000000..c36f4f2 Binary files /dev/null and b/mods/everness/textures/everness_egg_plant_top.png differ diff --git a/mods/everness/textures/everness_emerald_ice.png b/mods/everness/textures/everness_emerald_ice.png new file mode 100644 index 0000000..413fe0f Binary files /dev/null and b/mods/everness/textures/everness_emerald_ice.png differ diff --git a/mods/everness/textures/everness_eye_vine_1.png b/mods/everness/textures/everness_eye_vine_1.png new file mode 100644 index 0000000..9f5a579 Binary files /dev/null and b/mods/everness/textures/everness_eye_vine_1.png differ diff --git a/mods/everness/textures/everness_eye_vine_2.png b/mods/everness/textures/everness_eye_vine_2.png new file mode 100644 index 0000000..a14d3c4 Binary files /dev/null and b/mods/everness/textures/everness_eye_vine_2.png differ diff --git a/mods/everness/textures/everness_eye_vine_end_bottom.png b/mods/everness/textures/everness_eye_vine_end_bottom.png new file mode 100644 index 0000000..eb77411 Binary files /dev/null and b/mods/everness/textures/everness_eye_vine_end_bottom.png differ diff --git a/mods/everness/textures/everness_eye_vine_end_side.png b/mods/everness/textures/everness_eye_vine_end_side.png new file mode 100644 index 0000000..bdda94d Binary files /dev/null and b/mods/everness/textures/everness_eye_vine_end_side.png differ diff --git a/mods/everness/textures/everness_eye_vine_end_top.png b/mods/everness/textures/everness_eye_vine_end_top.png new file mode 100644 index 0000000..9dea505 Binary files /dev/null and b/mods/everness/textures/everness_eye_vine_end_top.png differ diff --git a/mods/everness/textures/everness_farming_soil_overlay.png b/mods/everness/textures/everness_farming_soil_overlay.png new file mode 100644 index 0000000..6a38a12 Binary files /dev/null and b/mods/everness/textures/everness_farming_soil_overlay.png differ diff --git a/mods/everness/textures/everness_farming_soil_wet_overlay.png b/mods/everness/textures/everness_farming_soil_wet_overlay.png new file mode 100644 index 0000000..63791b7 Binary files /dev/null and b/mods/everness/textures/everness_farming_soil_wet_overlay.png differ diff --git a/mods/everness/textures/everness_farming_soil_wet_side_overlay.png b/mods/everness/textures/everness_farming_soil_wet_side_overlay.png new file mode 100644 index 0000000..33aa893 Binary files /dev/null and b/mods/everness/textures/everness_farming_soil_wet_side_overlay.png differ diff --git a/mods/everness/textures/everness_fence_bamboo_wood.png b/mods/everness/textures/everness_fence_bamboo_wood.png new file mode 100644 index 0000000..31d907d Binary files /dev/null and b/mods/everness/textures/everness_fence_bamboo_wood.png differ diff --git a/mods/everness/textures/everness_fence_coral_wood.png b/mods/everness/textures/everness_fence_coral_wood.png new file mode 100644 index 0000000..71a5b1d Binary files /dev/null and b/mods/everness/textures/everness_fence_coral_wood.png differ diff --git a/mods/everness/textures/everness_fence_crystal_wood.png b/mods/everness/textures/everness_fence_crystal_wood.png new file mode 100644 index 0000000..9d960af Binary files /dev/null and b/mods/everness/textures/everness_fence_crystal_wood.png differ diff --git a/mods/everness/textures/everness_fence_dry_wood.png b/mods/everness/textures/everness_fence_dry_wood.png new file mode 100644 index 0000000..c23b6d8 Binary files /dev/null and b/mods/everness/textures/everness_fence_dry_wood.png differ diff --git a/mods/everness/textures/everness_fence_lava_tree_wood.png b/mods/everness/textures/everness_fence_lava_tree_wood.png new file mode 100644 index 0000000..27afd41 Binary files /dev/null and b/mods/everness/textures/everness_fence_lava_tree_wood.png differ diff --git a/mods/everness/textures/everness_fence_palm_wood.png b/mods/everness/textures/everness_fence_palm_wood.png new file mode 100644 index 0000000..596605d Binary files /dev/null and b/mods/everness/textures/everness_fence_palm_wood.png differ diff --git a/mods/everness/textures/everness_fence_rail_bamboo_wood.png b/mods/everness/textures/everness_fence_rail_bamboo_wood.png new file mode 100644 index 0000000..6cd42a0 Binary files /dev/null and b/mods/everness/textures/everness_fence_rail_bamboo_wood.png differ diff --git a/mods/everness/textures/everness_fence_rail_coral_wood.png b/mods/everness/textures/everness_fence_rail_coral_wood.png new file mode 100644 index 0000000..c362c02 Binary files /dev/null and b/mods/everness/textures/everness_fence_rail_coral_wood.png differ diff --git a/mods/everness/textures/everness_fence_rail_crystal_wood.png b/mods/everness/textures/everness_fence_rail_crystal_wood.png new file mode 100644 index 0000000..7dba1b3 Binary files /dev/null and b/mods/everness/textures/everness_fence_rail_crystal_wood.png differ diff --git a/mods/everness/textures/everness_fence_rail_dry_wood.png b/mods/everness/textures/everness_fence_rail_dry_wood.png new file mode 100644 index 0000000..9ea22b5 Binary files /dev/null and b/mods/everness/textures/everness_fence_rail_dry_wood.png differ diff --git a/mods/everness/textures/everness_fence_rail_lava_tree_wood.png b/mods/everness/textures/everness_fence_rail_lava_tree_wood.png new file mode 100644 index 0000000..c1a1cee Binary files /dev/null and b/mods/everness/textures/everness_fence_rail_lava_tree_wood.png differ diff --git a/mods/everness/textures/everness_fence_rail_palm_wood.png b/mods/everness/textures/everness_fence_rail_palm_wood.png new file mode 100644 index 0000000..21339af Binary files /dev/null and b/mods/everness/textures/everness_fence_rail_palm_wood.png differ diff --git a/mods/everness/textures/everness_fire_animated.png b/mods/everness/textures/everness_fire_animated.png new file mode 100644 index 0000000..046e5ba Binary files /dev/null and b/mods/everness/textures/everness_fire_animated.png differ diff --git a/mods/everness/textures/everness_flame_particle.png b/mods/everness/textures/everness_flame_particle.png new file mode 100644 index 0000000..5f9d72d Binary files /dev/null and b/mods/everness/textures/everness_flame_particle.png differ diff --git a/mods/everness/textures/everness_flame_permanent.png b/mods/everness/textures/everness_flame_permanent.png new file mode 100644 index 0000000..a5f857d Binary files /dev/null and b/mods/everness/textures/everness_flame_permanent.png differ diff --git a/mods/everness/textures/everness_flame_permanent_blue.png b/mods/everness/textures/everness_flame_permanent_blue.png new file mode 100644 index 0000000..8fa0338 Binary files /dev/null and b/mods/everness/textures/everness_flame_permanent_blue.png differ diff --git a/mods/everness/textures/everness_flame_permanent_blue_item.png b/mods/everness/textures/everness_flame_permanent_blue_item.png new file mode 100644 index 0000000..caf90b7 Binary files /dev/null and b/mods/everness/textures/everness_flame_permanent_blue_item.png differ diff --git a/mods/everness/textures/everness_flame_permanent_item.png b/mods/everness/textures/everness_flame_permanent_item.png new file mode 100644 index 0000000..20b637c Binary files /dev/null and b/mods/everness/textures/everness_flame_permanent_item.png differ diff --git a/mods/everness/textures/everness_flame_permanent_purple.png b/mods/everness/textures/everness_flame_permanent_purple.png new file mode 100644 index 0000000..1c2cb2a Binary files /dev/null and b/mods/everness/textures/everness_flame_permanent_purple.png differ diff --git a/mods/everness/textures/everness_flame_permanent_purple_item.png b/mods/everness/textures/everness_flame_permanent_purple_item.png new file mode 100644 index 0000000..ac2343b Binary files /dev/null and b/mods/everness/textures/everness_flame_permanent_purple_item.png differ diff --git a/mods/everness/textures/everness_floating_crystal_animated.png b/mods/everness/textures/everness_floating_crystal_animated.png new file mode 100644 index 0000000..00665ac Binary files /dev/null and b/mods/everness/textures/everness_floating_crystal_animated.png differ diff --git a/mods/everness/textures/everness_flowered_vine_1.png b/mods/everness/textures/everness_flowered_vine_1.png new file mode 100644 index 0000000..214e236 Binary files /dev/null and b/mods/everness/textures/everness_flowered_vine_1.png differ diff --git a/mods/everness/textures/everness_flowered_vine_2.png b/mods/everness/textures/everness_flowered_vine_2.png new file mode 100644 index 0000000..2671189 Binary files /dev/null and b/mods/everness/textures/everness_flowered_vine_2.png differ diff --git a/mods/everness/textures/everness_flowered_vine_end.png b/mods/everness/textures/everness_flowered_vine_end.png new file mode 100644 index 0000000..2c7a7e9 Binary files /dev/null and b/mods/everness/textures/everness_flowered_vine_end.png differ diff --git a/mods/everness/textures/everness_flowers.png b/mods/everness/textures/everness_flowers.png new file mode 100644 index 0000000..f142aa0 Binary files /dev/null and b/mods/everness/textures/everness_flowers.png differ diff --git a/mods/everness/textures/everness_flowers_magenta.png b/mods/everness/textures/everness_flowers_magenta.png new file mode 100644 index 0000000..46523fe Binary files /dev/null and b/mods/everness/textures/everness_flowers_magenta.png differ diff --git a/mods/everness/textures/everness_flowers_magenta_side_x.png b/mods/everness/textures/everness_flowers_magenta_side_x.png new file mode 100644 index 0000000..b180cc7 Binary files /dev/null and b/mods/everness/textures/everness_flowers_magenta_side_x.png differ diff --git a/mods/everness/textures/everness_flowers_magenta_side_z.png b/mods/everness/textures/everness_flowers_magenta_side_z.png new file mode 100644 index 0000000..6cfdbc5 Binary files /dev/null and b/mods/everness/textures/everness_flowers_magenta_side_z.png differ diff --git a/mods/everness/textures/everness_flowers_side_x.png b/mods/everness/textures/everness_flowers_side_x.png new file mode 100644 index 0000000..674e02c Binary files /dev/null and b/mods/everness/textures/everness_flowers_side_x.png differ diff --git a/mods/everness/textures/everness_flowers_side_z.png b/mods/everness/textures/everness_flowers_side_z.png new file mode 100644 index 0000000..6e3a45a Binary files /dev/null and b/mods/everness/textures/everness_flowers_side_z.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_brick.png b/mods/everness/textures/everness_forsaken_desert_brick.png new file mode 100644 index 0000000..0a67cf2 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_brick.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_brick_red.png b/mods/everness/textures/everness_forsaken_desert_brick_red.png new file mode 100644 index 0000000..cf57a2e Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_brick_red.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_chiseled_stone_bottom.png b/mods/everness/textures/everness_forsaken_desert_chiseled_stone_bottom.png new file mode 100644 index 0000000..244b4c1 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_chiseled_stone_bottom.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_chiseled_stone_side.png b/mods/everness/textures/everness_forsaken_desert_chiseled_stone_side.png new file mode 100644 index 0000000..177c9eb Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_chiseled_stone_side.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_chiseled_stone_top.png b/mods/everness/textures/everness_forsaken_desert_chiseled_stone_top.png new file mode 100644 index 0000000..7fb7da2 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_chiseled_stone_top.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_cobble.png b/mods/everness/textures/everness_forsaken_desert_cobble.png new file mode 100644 index 0000000..a370004 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_cobble.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_cobble_red.png b/mods/everness/textures/everness_forsaken_desert_cobble_red.png new file mode 100644 index 0000000..c61cf20 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_cobble_red.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_dry_ocean_dirt.png b/mods/everness/textures/everness_forsaken_desert_dry_ocean_dirt.png new file mode 100644 index 0000000..2047391 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_dry_ocean_dirt.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_engraved_stone.png b/mods/everness/textures/everness_forsaken_desert_engraved_stone.png new file mode 100644 index 0000000..dc2f9aa Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_engraved_stone.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_plant_1.png b/mods/everness/textures/everness_forsaken_desert_plant_1.png new file mode 100644 index 0000000..2c7844e Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_plant_1.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_plant_2.png b/mods/everness/textures/everness_forsaken_desert_plant_2.png new file mode 100644 index 0000000..7077742 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_plant_2.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_plant_3.png b/mods/everness/textures/everness_forsaken_desert_plant_3.png new file mode 100644 index 0000000..a9f5258 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_plant_3.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_sand.png b/mods/everness/textures/everness_forsaken_desert_sand.png new file mode 100644 index 0000000..9b1e1d5 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_sand.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_stone.png b/mods/everness/textures/everness_forsaken_desert_stone.png new file mode 100644 index 0000000..b326f29 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_stone.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_sun.png b/mods/everness/textures/everness_forsaken_desert_sun.png new file mode 100644 index 0000000..7141472 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_sun.png differ diff --git a/mods/everness/textures/everness_forsaken_desert_sun_tonemap.png b/mods/everness/textures/everness_forsaken_desert_sun_tonemap.png new file mode 100644 index 0000000..706d5c9 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_desert_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_forsaken_fire_item.png b/mods/everness/textures/everness_forsaken_fire_item.png new file mode 100644 index 0000000..2128db1 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_fire_item.png differ diff --git a/mods/everness/textures/everness_forsaken_fire_mesh.png b/mods/everness/textures/everness_forsaken_fire_mesh.png new file mode 100644 index 0000000..2d1df3a Binary files /dev/null and b/mods/everness/textures/everness_forsaken_fire_mesh.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_beach_sand.png b/mods/everness/textures/everness_forsaken_tundra_beach_sand.png new file mode 100644 index 0000000..6babf7f Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_beach_sand.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_beach_sand_with_shells.png b/mods/everness/textures/everness_forsaken_tundra_beach_sand_with_shells.png new file mode 100644 index 0000000..f1fb61c Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_beach_sand_with_shells.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_brick.png b/mods/everness/textures/everness_forsaken_tundra_brick.png new file mode 100644 index 0000000..70330e0 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_brick.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_cobblestone.png b/mods/everness/textures/everness_forsaken_tundra_cobblestone.png new file mode 100644 index 0000000..9879b56 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_cobblestone.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_dirt.png b/mods/everness/textures/everness_forsaken_tundra_dirt.png new file mode 100644 index 0000000..03c2d86 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_dirt.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_grass.png b/mods/everness/textures/everness_forsaken_tundra_grass.png new file mode 100644 index 0000000..bc4610d Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_grass.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_grass_side.png b/mods/everness/textures/everness_forsaken_tundra_grass_side.png new file mode 100644 index 0000000..0d230ca Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_grass_side.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_rocks_side.png b/mods/everness/textures/everness_forsaken_tundra_rocks_side.png new file mode 100644 index 0000000..b3c1766 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_rocks_side.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_rocks_top.png b/mods/everness/textures/everness_forsaken_tundra_rocks_top.png new file mode 100644 index 0000000..6f61771 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_rocks_top.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_stone.png b/mods/everness/textures/everness_forsaken_tundra_stone.png new file mode 100644 index 0000000..a1d9d65 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_stone.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_sun.png b/mods/everness/textures/everness_forsaken_tundra_sun.png new file mode 100644 index 0000000..c90a4b8 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_sun.png differ diff --git a/mods/everness/textures/everness_forsaken_tundra_sun_tonemap.png b/mods/everness/textures/everness_forsaken_tundra_sun_tonemap.png new file mode 100644 index 0000000..b136f55 Binary files /dev/null and b/mods/everness/textures/everness_forsaken_tundra_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_forsythia_item.png b/mods/everness/textures/everness_forsythia_item.png new file mode 100644 index 0000000..c1be02e Binary files /dev/null and b/mods/everness/textures/everness_forsythia_item.png differ diff --git a/mods/everness/textures/everness_forsythia_mesh.png b/mods/everness/textures/everness_forsythia_mesh.png new file mode 100644 index 0000000..948b8a8 Binary files /dev/null and b/mods/everness/textures/everness_forsythia_mesh.png differ diff --git a/mods/everness/textures/everness_frosted_coral.png b/mods/everness/textures/everness_frosted_coral.png new file mode 100644 index 0000000..7ece478 Binary files /dev/null and b/mods/everness/textures/everness_frosted_coral.png differ diff --git a/mods/everness/textures/everness_frosted_ice.png b/mods/everness/textures/everness_frosted_ice.png new file mode 100644 index 0000000..5397907 Binary files /dev/null and b/mods/everness/textures/everness_frosted_ice.png differ diff --git a/mods/everness/textures/everness_frosted_ice_translucent.png b/mods/everness/textures/everness_frosted_ice_translucent.png new file mode 100644 index 0000000..66a7c47 Binary files /dev/null and b/mods/everness/textures/everness_frosted_ice_translucent.png differ diff --git a/mods/everness/textures/everness_frosted_icesheet_sun.png b/mods/everness/textures/everness_frosted_icesheet_sun.png new file mode 100644 index 0000000..cd84674 Binary files /dev/null and b/mods/everness/textures/everness_frosted_icesheet_sun.png differ diff --git a/mods/everness/textures/everness_frosted_icesheet_sun_tonemap.png b/mods/everness/textures/everness_frosted_icesheet_sun_tonemap.png new file mode 100644 index 0000000..209c925 Binary files /dev/null and b/mods/everness/textures/everness_frosted_icesheet_sun_tonemap.png differ diff --git a/mods/everness/textures/everness_frosted_icicle.png b/mods/everness/textures/everness_frosted_icicle.png new file mode 100644 index 0000000..4b2d36e Binary files /dev/null and b/mods/everness/textures/everness_frosted_icicle.png differ diff --git a/mods/everness/textures/everness_frosted_snow.png b/mods/everness/textures/everness_frosted_snow.png new file mode 100644 index 0000000..dc52ca0 Binary files /dev/null and b/mods/everness/textures/everness_frosted_snow.png differ diff --git a/mods/everness/textures/everness_glass.png b/mods/everness/textures/everness_glass.png new file mode 100644 index 0000000..296a076 Binary files /dev/null and b/mods/everness/textures/everness_glass.png differ diff --git a/mods/everness/textures/everness_glass_detail.png b/mods/everness/textures/everness_glass_detail.png new file mode 100644 index 0000000..2f71c56 Binary files /dev/null and b/mods/everness/textures/everness_glass_detail.png differ diff --git a/mods/everness/textures/everness_glossy_mushroom_bottom.png b/mods/everness/textures/everness_glossy_mushroom_bottom.png new file mode 100644 index 0000000..1eec6b6 Binary files /dev/null and b/mods/everness/textures/everness_glossy_mushroom_bottom.png differ diff --git a/mods/everness/textures/everness_glossy_mushroom_side_x.png b/mods/everness/textures/everness_glossy_mushroom_side_x.png new file mode 100644 index 0000000..d45eedf Binary files /dev/null and b/mods/everness/textures/everness_glossy_mushroom_side_x.png differ diff --git a/mods/everness/textures/everness_glossy_mushroom_side_z.png b/mods/everness/textures/everness_glossy_mushroom_side_z.png new file mode 100644 index 0000000..89fbde1 Binary files /dev/null and b/mods/everness/textures/everness_glossy_mushroom_side_z.png differ diff --git a/mods/everness/textures/everness_glossy_mushroom_top.png b/mods/everness/textures/everness_glossy_mushroom_top.png new file mode 100644 index 0000000..91d0675 Binary files /dev/null and b/mods/everness/textures/everness_glossy_mushroom_top.png differ diff --git a/mods/everness/textures/everness_glowing_pillar_item.png b/mods/everness/textures/everness_glowing_pillar_item.png new file mode 100644 index 0000000..e3211e4 Binary files /dev/null and b/mods/everness/textures/everness_glowing_pillar_item.png differ diff --git a/mods/everness/textures/everness_glowing_pillar_leaves.png b/mods/everness/textures/everness_glowing_pillar_leaves.png new file mode 100644 index 0000000..2c995d1 Binary files /dev/null and b/mods/everness/textures/everness_glowing_pillar_leaves.png differ diff --git a/mods/everness/textures/everness_glowing_pillar_luminophor.png b/mods/everness/textures/everness_glowing_pillar_luminophor.png new file mode 100644 index 0000000..0f46b6b Binary files /dev/null and b/mods/everness/textures/everness_glowing_pillar_luminophor.png differ diff --git a/mods/everness/textures/everness_glowing_pillar_roots.png b/mods/everness/textures/everness_glowing_pillar_roots.png new file mode 100644 index 0000000..73bb563 Binary files /dev/null and b/mods/everness/textures/everness_glowing_pillar_roots.png differ diff --git a/mods/everness/textures/everness_golden_vine_1.png b/mods/everness/textures/everness_golden_vine_1.png new file mode 100644 index 0000000..5aece8d Binary files /dev/null and b/mods/everness/textures/everness_golden_vine_1.png differ diff --git a/mods/everness/textures/everness_golden_vine_2.png b/mods/everness/textures/everness_golden_vine_2.png new file mode 100644 index 0000000..954963d Binary files /dev/null and b/mods/everness/textures/everness_golden_vine_2.png differ diff --git a/mods/everness/textures/everness_golden_vine_end.png b/mods/everness/textures/everness_golden_vine_end.png new file mode 100644 index 0000000..93a5237 Binary files /dev/null and b/mods/everness/textures/everness_golden_vine_end.png differ diff --git a/mods/everness/textures/everness_grass_extras_1.png b/mods/everness/textures/everness_grass_extras_1.png new file mode 100644 index 0000000..bc4fff7 Binary files /dev/null and b/mods/everness/textures/everness_grass_extras_1.png differ diff --git a/mods/everness/textures/everness_grass_extras_2.png b/mods/everness/textures/everness_grass_extras_2.png new file mode 100644 index 0000000..7cd81b0 Binary files /dev/null and b/mods/everness/textures/everness_grass_extras_2.png differ diff --git a/mods/everness/textures/everness_grass_side.png b/mods/everness/textures/everness_grass_side.png new file mode 100644 index 0000000..4ca5934 Binary files /dev/null and b/mods/everness/textures/everness_grass_side.png differ diff --git a/mods/everness/textures/everness_grass_top.png b/mods/everness/textures/everness_grass_top.png new file mode 100644 index 0000000..8bcfb27 Binary files /dev/null and b/mods/everness/textures/everness_grass_top.png differ diff --git a/mods/everness/textures/everness_gravel.png b/mods/everness/textures/everness_gravel.png new file mode 100644 index 0000000..d9ba4f9 Binary files /dev/null and b/mods/everness/textures/everness_gravel.png differ diff --git a/mods/everness/textures/everness_hammer_handle_mesh.png b/mods/everness/textures/everness_hammer_handle_mesh.png new file mode 100644 index 0000000..97cf5df Binary files /dev/null and b/mods/everness/textures/everness_hammer_handle_mesh.png differ diff --git a/mods/everness/textures/everness_hammer_item.png b/mods/everness/textures/everness_hammer_item.png new file mode 100644 index 0000000..1f47262 Binary files /dev/null and b/mods/everness/textures/everness_hammer_item.png differ diff --git a/mods/everness/textures/everness_hammer_mesh.png b/mods/everness/textures/everness_hammer_mesh.png new file mode 100644 index 0000000..3ce797d Binary files /dev/null and b/mods/everness/textures/everness_hammer_mesh.png differ diff --git a/mods/everness/textures/everness_hammer_mesh_transparent.png b/mods/everness/textures/everness_hammer_mesh_transparent.png new file mode 100644 index 0000000..d58bd90 Binary files /dev/null and b/mods/everness/textures/everness_hammer_mesh_transparent.png differ diff --git a/mods/everness/textures/everness_hammer_sharp_handle_mesh.png b/mods/everness/textures/everness_hammer_sharp_handle_mesh.png new file mode 100644 index 0000000..452e4b2 Binary files /dev/null and b/mods/everness/textures/everness_hammer_sharp_handle_mesh.png differ diff --git a/mods/everness/textures/everness_hammer_sharp_item.png b/mods/everness/textures/everness_hammer_sharp_item.png new file mode 100644 index 0000000..1fecdba Binary files /dev/null and b/mods/everness/textures/everness_hammer_sharp_item.png differ diff --git a/mods/everness/textures/everness_hammer_sharp_mesh.png b/mods/everness/textures/everness_hammer_sharp_mesh.png new file mode 100644 index 0000000..7864138 Binary files /dev/null and b/mods/everness/textures/everness_hammer_sharp_mesh.png differ diff --git a/mods/everness/textures/everness_hollow_tree_side.png b/mods/everness/textures/everness_hollow_tree_side.png new file mode 100644 index 0000000..ff9874b Binary files /dev/null and b/mods/everness/textures/everness_hollow_tree_side.png differ diff --git a/mods/everness/textures/everness_hollow_tree_top.png b/mods/everness/textures/everness_hollow_tree_top.png new file mode 100644 index 0000000..550b357 Binary files /dev/null and b/mods/everness/textures/everness_hollow_tree_top.png differ diff --git a/mods/everness/textures/everness_icecobble.png b/mods/everness/textures/everness_icecobble.png new file mode 100644 index 0000000..da3cdc7 Binary files /dev/null and b/mods/everness/textures/everness_icecobble.png differ diff --git a/mods/everness/textures/everness_illumi_root.png b/mods/everness/textures/everness_illumi_root.png new file mode 100644 index 0000000..86d109a Binary files /dev/null and b/mods/everness/textures/everness_illumi_root.png differ diff --git a/mods/everness/textures/everness_invisible_node_overlay.png b/mods/everness/textures/everness_invisible_node_overlay.png new file mode 100644 index 0000000..7fc8806 Binary files /dev/null and b/mods/everness/textures/everness_invisible_node_overlay.png differ diff --git a/mods/everness/textures/everness_ivis_moss.png b/mods/everness/textures/everness_ivis_moss.png new file mode 100644 index 0000000..0ccbdcf Binary files /dev/null and b/mods/everness/textures/everness_ivis_moss.png differ diff --git a/mods/everness/textures/everness_ivis_vine_1.png b/mods/everness/textures/everness_ivis_vine_1.png new file mode 100644 index 0000000..014d54b Binary files /dev/null and b/mods/everness/textures/everness_ivis_vine_1.png differ diff --git a/mods/everness/textures/everness_ivis_vine_2.png b/mods/everness/textures/everness_ivis_vine_2.png new file mode 100644 index 0000000..fe3cbc5 Binary files /dev/null and b/mods/everness/textures/everness_ivis_vine_2.png differ diff --git a/mods/everness/textures/everness_ivis_vine_end.png b/mods/everness/textures/everness_ivis_vine_end.png new file mode 100644 index 0000000..cb8572f Binary files /dev/null and b/mods/everness/textures/everness_ivis_vine_end.png differ diff --git a/mods/everness/textures/everness_lava_flowing_animated.png b/mods/everness/textures/everness_lava_flowing_animated.png new file mode 100644 index 0000000..aaef22e Binary files /dev/null and b/mods/everness/textures/everness_lava_flowing_animated.png differ diff --git a/mods/everness/textures/everness_lava_source_animated.png b/mods/everness/textures/everness_lava_source_animated.png new file mode 100644 index 0000000..9b02ec3 Binary files /dev/null and b/mods/everness/textures/everness_lava_source_animated.png differ diff --git a/mods/everness/textures/everness_lava_tree.png b/mods/everness/textures/everness_lava_tree.png new file mode 100644 index 0000000..455bc8f Binary files /dev/null and b/mods/everness/textures/everness_lava_tree.png differ diff --git a/mods/everness/textures/everness_lava_tree_animated.png b/mods/everness/textures/everness_lava_tree_animated.png new file mode 100644 index 0000000..afc5fb5 Binary files /dev/null and b/mods/everness/textures/everness_lava_tree_animated.png differ diff --git a/mods/everness/textures/everness_lava_tree_leaves.png b/mods/everness/textures/everness_lava_tree_leaves.png new file mode 100644 index 0000000..2f440af Binary files /dev/null and b/mods/everness/textures/everness_lava_tree_leaves.png differ diff --git a/mods/everness/textures/everness_lava_tree_sapling.png b/mods/everness/textures/everness_lava_tree_sapling.png new file mode 100644 index 0000000..a01889e Binary files /dev/null and b/mods/everness/textures/everness_lava_tree_sapling.png differ diff --git a/mods/everness/textures/everness_lava_tree_top.png b/mods/everness/textures/everness_lava_tree_top.png new file mode 100644 index 0000000..0f942f4 Binary files /dev/null and b/mods/everness/textures/everness_lava_tree_top.png differ diff --git a/mods/everness/textures/everness_lava_tree_wood.png b/mods/everness/textures/everness_lava_tree_wood.png new file mode 100644 index 0000000..d070eef Binary files /dev/null and b/mods/everness/textures/everness_lava_tree_wood.png differ diff --git a/mods/everness/textures/everness_logo.png b/mods/everness/textures/everness_logo.png new file mode 100644 index 0000000..ff7a051 Binary files /dev/null and b/mods/everness/textures/everness_logo.png differ diff --git a/mods/everness/textures/everness_lootchest_marker_side.png b/mods/everness/textures/everness_lootchest_marker_side.png new file mode 100644 index 0000000..6f69ca2 Binary files /dev/null and b/mods/everness/textures/everness_lootchest_marker_side.png differ diff --git a/mods/everness/textures/everness_lootchest_marker_top.png b/mods/everness/textures/everness_lootchest_marker_top.png new file mode 100644 index 0000000..c3650d9 Binary files /dev/null and b/mods/everness/textures/everness_lootchest_marker_top.png differ diff --git a/mods/everness/textures/everness_lotus_flower_mesh_not_animated.png b/mods/everness/textures/everness_lotus_flower_mesh_not_animated.png new file mode 100644 index 0000000..4f305b6 Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_mesh_not_animated.png differ diff --git a/mods/everness/textures/everness_lotus_flower_pink_item.png b/mods/everness/textures/everness_lotus_flower_pink_item.png new file mode 100644 index 0000000..f186dcf Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_pink_item.png differ diff --git a/mods/everness/textures/everness_lotus_flower_pink_mesh.png b/mods/everness/textures/everness_lotus_flower_pink_mesh.png new file mode 100644 index 0000000..d57a990 Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_pink_mesh.png differ diff --git a/mods/everness/textures/everness_lotus_flower_pink_mesh_animated.png b/mods/everness/textures/everness_lotus_flower_pink_mesh_animated.png new file mode 100644 index 0000000..33bccc3 Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_pink_mesh_animated.png differ diff --git a/mods/everness/textures/everness_lotus_flower_purple_item.png b/mods/everness/textures/everness_lotus_flower_purple_item.png new file mode 100644 index 0000000..75483b9 Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_purple_item.png differ diff --git a/mods/everness/textures/everness_lotus_flower_purple_mesh.png b/mods/everness/textures/everness_lotus_flower_purple_mesh.png new file mode 100644 index 0000000..5901af6 Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_purple_mesh.png differ diff --git a/mods/everness/textures/everness_lotus_flower_purple_mesh_animated.png b/mods/everness/textures/everness_lotus_flower_purple_mesh_animated.png new file mode 100644 index 0000000..be97d39 Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_purple_mesh_animated.png differ diff --git a/mods/everness/textures/everness_lotus_flower_white_item.png b/mods/everness/textures/everness_lotus_flower_white_item.png new file mode 100644 index 0000000..97ebafa Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_white_item.png differ diff --git a/mods/everness/textures/everness_lotus_flower_white_mesh.png b/mods/everness/textures/everness_lotus_flower_white_mesh.png new file mode 100644 index 0000000..741ed7f Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_white_mesh.png differ diff --git a/mods/everness/textures/everness_lotus_flower_white_mesh_animated.png b/mods/everness/textures/everness_lotus_flower_white_mesh_animated.png new file mode 100644 index 0000000..69dba1c Binary files /dev/null and b/mods/everness/textures/everness_lotus_flower_white_mesh_animated.png differ diff --git a/mods/everness/textures/everness_lotus_leaf_2_item.png b/mods/everness/textures/everness_lotus_leaf_2_item.png new file mode 100644 index 0000000..01f01fd Binary files /dev/null and b/mods/everness/textures/everness_lotus_leaf_2_item.png differ diff --git a/mods/everness/textures/everness_lotus_leaf_2_y.png b/mods/everness/textures/everness_lotus_leaf_2_y.png new file mode 100644 index 0000000..2d812d4 Binary files /dev/null and b/mods/everness/textures/everness_lotus_leaf_2_y.png differ diff --git a/mods/everness/textures/everness_lotus_leaf_3_item.png b/mods/everness/textures/everness_lotus_leaf_3_item.png new file mode 100644 index 0000000..4fd9160 Binary files /dev/null and b/mods/everness/textures/everness_lotus_leaf_3_item.png differ diff --git a/mods/everness/textures/everness_lotus_leaf_3_y.png b/mods/everness/textures/everness_lotus_leaf_3_y.png new file mode 100644 index 0000000..7e097f1 Binary files /dev/null and b/mods/everness/textures/everness_lotus_leaf_3_y.png differ diff --git a/mods/everness/textures/everness_lotus_leaf_item.png b/mods/everness/textures/everness_lotus_leaf_item.png new file mode 100644 index 0000000..5dbcc65 Binary files /dev/null and b/mods/everness/textures/everness_lotus_leaf_item.png differ diff --git a/mods/everness/textures/everness_lotus_leaf_y.png b/mods/everness/textures/everness_lotus_leaf_y.png new file mode 100644 index 0000000..386145e Binary files /dev/null and b/mods/everness/textures/everness_lotus_leaf_y.png differ diff --git a/mods/everness/textures/everness_lumabus_bulb_purple.png b/mods/everness/textures/everness_lumabus_bulb_purple.png new file mode 100644 index 0000000..0bffd34 Binary files /dev/null and b/mods/everness/textures/everness_lumabus_bulb_purple.png differ diff --git a/mods/everness/textures/everness_lumabus_leaves.png b/mods/everness/textures/everness_lumabus_leaves.png new file mode 100644 index 0000000..02bbfd5 Binary files /dev/null and b/mods/everness/textures/everness_lumabus_leaves.png differ diff --git a/mods/everness/textures/everness_lumabus_vine_1.png b/mods/everness/textures/everness_lumabus_vine_1.png new file mode 100644 index 0000000..7eb189e Binary files /dev/null and b/mods/everness/textures/everness_lumabus_vine_1.png differ diff --git a/mods/everness/textures/everness_lumabus_vine_2.png b/mods/everness/textures/everness_lumabus_vine_2.png new file mode 100644 index 0000000..67bbc8f Binary files /dev/null and b/mods/everness/textures/everness_lumabus_vine_2.png differ diff --git a/mods/everness/textures/everness_lumabus_vine_end.png b/mods/everness/textures/everness_lumabus_vine_end.png new file mode 100644 index 0000000..e5694e9 Binary files /dev/null and b/mods/everness/textures/everness_lumabus_vine_end.png differ diff --git a/mods/everness/textures/everness_lumecorn_item.png b/mods/everness/textures/everness_lumecorn_item.png new file mode 100644 index 0000000..912046d Binary files /dev/null and b/mods/everness/textures/everness_lumecorn_item.png differ diff --git a/mods/everness/textures/everness_lumecorn_leaf.png b/mods/everness/textures/everness_lumecorn_leaf.png new file mode 100644 index 0000000..584c059 Binary files /dev/null and b/mods/everness/textures/everness_lumecorn_leaf.png differ diff --git a/mods/everness/textures/everness_lumecorn_light.png b/mods/everness/textures/everness_lumecorn_light.png new file mode 100644 index 0000000..a7801c2 Binary files /dev/null and b/mods/everness/textures/everness_lumecorn_light.png differ diff --git a/mods/everness/textures/everness_lumecorn_root.png b/mods/everness/textures/everness_lumecorn_root.png new file mode 100644 index 0000000..abe7905 Binary files /dev/null and b/mods/everness/textures/everness_lumecorn_root.png differ diff --git a/mods/everness/textures/everness_luminous_mushroom_bottom.png b/mods/everness/textures/everness_luminous_mushroom_bottom.png new file mode 100644 index 0000000..7c281bf Binary files /dev/null and b/mods/everness/textures/everness_luminous_mushroom_bottom.png differ diff --git a/mods/everness/textures/everness_luminous_mushroom_side_x.png b/mods/everness/textures/everness_luminous_mushroom_side_x.png new file mode 100644 index 0000000..241d274 Binary files /dev/null and b/mods/everness/textures/everness_luminous_mushroom_side_x.png differ diff --git a/mods/everness/textures/everness_luminous_mushroom_side_z.png b/mods/everness/textures/everness_luminous_mushroom_side_z.png new file mode 100644 index 0000000..82a20a6 Binary files /dev/null and b/mods/everness/textures/everness_luminous_mushroom_side_z.png differ diff --git a/mods/everness/textures/everness_luminous_mushroom_top.png b/mods/everness/textures/everness_luminous_mushroom_top.png new file mode 100644 index 0000000..db0045f Binary files /dev/null and b/mods/everness/textures/everness_luminous_mushroom_top.png differ diff --git a/mods/everness/textures/everness_magmacobble.png b/mods/everness/textures/everness_magmacobble.png new file mode 100644 index 0000000..4dae6f5 Binary files /dev/null and b/mods/everness/textures/everness_magmacobble.png differ diff --git a/mods/everness/textures/everness_magmacobble_animated.png b/mods/everness/textures/everness_magmacobble_animated.png new file mode 100644 index 0000000..be276a3 Binary files /dev/null and b/mods/everness/textures/everness_magmacobble_animated.png differ diff --git a/mods/everness/textures/everness_marsh_grass.png b/mods/everness/textures/everness_marsh_grass.png new file mode 100644 index 0000000..82d1845 Binary files /dev/null and b/mods/everness/textures/everness_marsh_grass.png differ diff --git a/mods/everness/textures/everness_mcl_bucket_lava.png b/mods/everness/textures/everness_mcl_bucket_lava.png new file mode 100644 index 0000000..0e87a0a Binary files /dev/null and b/mods/everness/textures/everness_mcl_bucket_lava.png differ diff --git a/mods/everness/textures/everness_mcl_bucket_mineral_water.png b/mods/everness/textures/everness_mcl_bucket_mineral_water.png new file mode 100644 index 0000000..8819a7b Binary files /dev/null and b/mods/everness/textures/everness_mcl_bucket_mineral_water.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bamboo_lower.png b/mods/everness/textures/everness_mcl_doors_door_bamboo_lower.png new file mode 100644 index 0000000..e99e155 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bamboo_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bamboo_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_bamboo_lower_bottompart.png new file mode 100644 index 0000000..919616f Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bamboo_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bamboo_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_bamboo_lower_side.png new file mode 100644 index 0000000..334d1a2 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bamboo_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bamboo_upper.png b/mods/everness/textures/everness_mcl_doors_door_bamboo_upper.png new file mode 100644 index 0000000..2bc9ed5 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bamboo_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bamboo_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_bamboo_upper_side.png new file mode 100644 index 0000000..334d1a2 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bamboo_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bamboo_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_bamboo_upper_toppart.png new file mode 100644 index 0000000..919616f Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bamboo_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower.png b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower.png new file mode 100644 index 0000000..a4e4791 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower_bottompart.png new file mode 100644 index 0000000..b34352a Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower_side.png new file mode 100644 index 0000000..c301fac Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper.png b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper.png new file mode 100644 index 0000000..6042fe1 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper_side.png new file mode 100644 index 0000000..c301fac Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper_toppart.png new file mode 100644 index 0000000..b34352a Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_bone_pyrite_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower.png b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower.png new file mode 100644 index 0000000..8aa5e60 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower_bottompart.png new file mode 100644 index 0000000..41b12e1 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower_side.png new file mode 100644 index 0000000..cfe2ece Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper.png b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper.png new file mode 100644 index 0000000..08cecb2 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper_side.png new file mode 100644 index 0000000..cfe2ece Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper_toppart.png new file mode 100644 index 0000000..41b12e1 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_crystal_wood_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_lower.png b/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_lower.png new file mode 100644 index 0000000..03a468d Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_lower_bottompart.png new file mode 100644 index 0000000..c0dee60 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_lower_side.png new file mode 100644 index 0000000..7f3d7e9 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_upper.png b/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_upper.png new file mode 100644 index 0000000..1c83eef Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_upper_side.png new file mode 100644 index 0000000..967f222 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_upper_toppart.png new file mode 100644 index 0000000..c0dee60 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_steel_bar_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower.png b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower.png new file mode 100644 index 0000000..57f9cab Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower_bottompart.png new file mode 100644 index 0000000..9f240c8 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower_side.png new file mode 100644 index 0000000..c097825 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper.png b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper.png new file mode 100644 index 0000000..5aeb3e3 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper_side.png new file mode 100644 index 0000000..c097825 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper_toppart.png new file mode 100644 index 0000000..9f240c8 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_cursed_wood_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_lava_tree_lower.png b/mods/everness/textures/everness_mcl_doors_door_lava_tree_lower.png new file mode 100644 index 0000000..38f1fa6 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_lava_tree_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_lava_tree_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_lava_tree_lower_bottompart.png new file mode 100644 index 0000000..eec260f Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_lava_tree_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_lava_tree_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_lava_tree_lower_side.png new file mode 100644 index 0000000..6d05cab Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_lava_tree_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_lava_tree_upper.png b/mods/everness/textures/everness_mcl_doors_door_lava_tree_upper.png new file mode 100644 index 0000000..5945ca3 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_lava_tree_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_lava_tree_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_lava_tree_upper_side.png new file mode 100644 index 0000000..532dc80 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_lava_tree_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_lava_tree_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_lava_tree_upper_toppart.png new file mode 100644 index 0000000..eec260f Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_lava_tree_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_palm_wood_lower.png b/mods/everness/textures/everness_mcl_doors_door_palm_wood_lower.png new file mode 100644 index 0000000..defc7f4 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_palm_wood_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_palm_wood_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_palm_wood_lower_bottompart.png new file mode 100644 index 0000000..25671cc Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_palm_wood_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_palm_wood_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_palm_wood_lower_side.png new file mode 100644 index 0000000..d232e9a Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_palm_wood_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_palm_wood_upper.png b/mods/everness/textures/everness_mcl_doors_door_palm_wood_upper.png new file mode 100644 index 0000000..7513fa8 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_palm_wood_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_palm_wood_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_palm_wood_upper_side.png new file mode 100644 index 0000000..0da43a3 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_palm_wood_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_palm_wood_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_palm_wood_upper_toppart.png new file mode 100644 index 0000000..25671cc Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_palm_wood_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_willow_lower.png b/mods/everness/textures/everness_mcl_doors_door_willow_lower.png new file mode 100644 index 0000000..ecdab33 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_willow_lower.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_willow_lower_bottompart.png b/mods/everness/textures/everness_mcl_doors_door_willow_lower_bottompart.png new file mode 100644 index 0000000..3ec3f8d Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_willow_lower_bottompart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_willow_lower_side.png b/mods/everness/textures/everness_mcl_doors_door_willow_lower_side.png new file mode 100644 index 0000000..476c6f6 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_willow_lower_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_willow_upper.png b/mods/everness/textures/everness_mcl_doors_door_willow_upper.png new file mode 100644 index 0000000..af7a280 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_willow_upper.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_willow_upper_side.png b/mods/everness/textures/everness_mcl_doors_door_willow_upper_side.png new file mode 100644 index 0000000..338d42f Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_willow_upper_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_door_willow_upper_toppart.png b/mods/everness/textures/everness_mcl_doors_door_willow_upper_toppart.png new file mode 100644 index 0000000..3ec3f8d Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_door_willow_upper_toppart.png differ diff --git a/mods/everness/textures/everness_mcl_doors_trapdoor_bamboo_side.png b/mods/everness/textures/everness_mcl_doors_trapdoor_bamboo_side.png new file mode 100644 index 0000000..57e431b Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_trapdoor_bamboo_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_trapdoor_crystal_wood_side.png b/mods/everness/textures/everness_mcl_doors_trapdoor_crystal_wood_side.png new file mode 100644 index 0000000..7de4f63 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_trapdoor_crystal_wood_side.png differ diff --git a/mods/everness/textures/everness_mcl_doors_trapdoor_cursed_wood_side.png b/mods/everness/textures/everness_mcl_doors_trapdoor_cursed_wood_side.png new file mode 100644 index 0000000..e4fd656 Binary files /dev/null and b/mods/everness/textures/everness_mcl_doors_trapdoor_cursed_wood_side.png differ diff --git a/mods/everness/textures/everness_mese_leaves.png b/mods/everness/textures/everness_mese_leaves.png new file mode 100644 index 0000000..e8b1785 Binary files /dev/null and b/mods/everness/textures/everness_mese_leaves.png differ diff --git a/mods/everness/textures/everness_mese_tree_fruit_item.png b/mods/everness/textures/everness_mese_tree_fruit_item.png new file mode 100644 index 0000000..b19295d Binary files /dev/null and b/mods/everness/textures/everness_mese_tree_fruit_item.png differ diff --git a/mods/everness/textures/everness_mese_tree_fruit_side.png b/mods/everness/textures/everness_mese_tree_fruit_side.png new file mode 100644 index 0000000..f623255 Binary files /dev/null and b/mods/everness/textures/everness_mese_tree_fruit_side.png differ diff --git a/mods/everness/textures/everness_mese_tree_fruit_top.png b/mods/everness/textures/everness_mese_tree_fruit_top.png new file mode 100644 index 0000000..51b9783 Binary files /dev/null and b/mods/everness/textures/everness_mese_tree_fruit_top.png differ diff --git a/mods/everness/textures/everness_mese_tree_sapling.png b/mods/everness/textures/everness_mese_tree_sapling.png new file mode 100644 index 0000000..34a6971 Binary files /dev/null and b/mods/everness/textures/everness_mese_tree_sapling.png differ diff --git a/mods/everness/textures/everness_mese_tree_side_animated.png b/mods/everness/textures/everness_mese_tree_side_animated.png new file mode 100644 index 0000000..80b387b Binary files /dev/null and b/mods/everness/textures/everness_mese_tree_side_animated.png differ diff --git a/mods/everness/textures/everness_mese_tree_top.png b/mods/everness/textures/everness_mese_tree_top.png new file mode 100644 index 0000000..eea2c5f Binary files /dev/null and b/mods/everness/textures/everness_mese_tree_top.png differ diff --git a/mods/everness/textures/everness_mese_wood.png b/mods/everness/textures/everness_mese_wood.png new file mode 100644 index 0000000..f974520 Binary files /dev/null and b/mods/everness/textures/everness_mese_wood.png differ diff --git a/mods/everness/textures/everness_mineral_cave_moss.png b/mods/everness/textures/everness_mineral_cave_moss.png new file mode 100644 index 0000000..592978d Binary files /dev/null and b/mods/everness/textures/everness_mineral_cave_moss.png differ diff --git a/mods/everness/textures/everness_mineral_cave_moss_grass.png b/mods/everness/textures/everness_mineral_cave_moss_grass.png new file mode 100644 index 0000000..abe5a67 Binary files /dev/null and b/mods/everness/textures/everness_mineral_cave_moss_grass.png differ diff --git a/mods/everness/textures/everness_mineral_cave_moss_side.png b/mods/everness/textures/everness_mineral_cave_moss_side.png new file mode 100644 index 0000000..2831a53 Binary files /dev/null and b/mods/everness/textures/everness_mineral_cave_moss_side.png differ diff --git a/mods/everness/textures/everness_mineral_coal.png b/mods/everness/textures/everness_mineral_coal.png new file mode 100644 index 0000000..6d1386b Binary files /dev/null and b/mods/everness/textures/everness_mineral_coal.png differ diff --git a/mods/everness/textures/everness_mineral_cobblestone.png b/mods/everness/textures/everness_mineral_cobblestone.png new file mode 100644 index 0000000..7f5193e Binary files /dev/null and b/mods/everness/textures/everness_mineral_cobblestone.png differ diff --git a/mods/everness/textures/everness_mineral_cobblestone_under.png b/mods/everness/textures/everness_mineral_cobblestone_under.png new file mode 100644 index 0000000..f555844 Binary files /dev/null and b/mods/everness/textures/everness_mineral_cobblestone_under.png differ diff --git a/mods/everness/textures/everness_mineral_lava_stone_animated.png b/mods/everness/textures/everness_mineral_lava_stone_animated.png new file mode 100644 index 0000000..8fd6416 Binary files /dev/null and b/mods/everness/textures/everness_mineral_lava_stone_animated.png differ diff --git a/mods/everness/textures/everness_mineral_lava_stone_bottom.png b/mods/everness/textures/everness_mineral_lava_stone_bottom.png new file mode 100644 index 0000000..7daef6c Binary files /dev/null and b/mods/everness/textures/everness_mineral_lava_stone_bottom.png differ diff --git a/mods/everness/textures/everness_mineral_lava_stone_side.png b/mods/everness/textures/everness_mineral_lava_stone_side.png new file mode 100644 index 0000000..4964dac Binary files /dev/null and b/mods/everness/textures/everness_mineral_lava_stone_side.png differ diff --git a/mods/everness/textures/everness_mineral_pyrite.png b/mods/everness/textures/everness_mineral_pyrite.png new file mode 100644 index 0000000..9ffed6d Binary files /dev/null and b/mods/everness/textures/everness_mineral_pyrite.png differ diff --git a/mods/everness/textures/everness_mineral_sand.png b/mods/everness/textures/everness_mineral_sand.png new file mode 100644 index 0000000..050d2f1 Binary files /dev/null and b/mods/everness/textures/everness_mineral_sand.png differ diff --git a/mods/everness/textures/everness_mineral_sandstone.png b/mods/everness/textures/everness_mineral_sandstone.png new file mode 100644 index 0000000..97b3481 Binary files /dev/null and b/mods/everness/textures/everness_mineral_sandstone.png differ diff --git a/mods/everness/textures/everness_mineral_sandstone_block.png b/mods/everness/textures/everness_mineral_sandstone_block.png new file mode 100644 index 0000000..65be9d4 Binary files /dev/null and b/mods/everness/textures/everness_mineral_sandstone_block.png differ diff --git a/mods/everness/textures/everness_mineral_sandstone_brick.png b/mods/everness/textures/everness_mineral_sandstone_brick.png new file mode 100644 index 0000000..24df3e2 Binary files /dev/null and b/mods/everness/textures/everness_mineral_sandstone_brick.png differ diff --git a/mods/everness/textures/everness_mineral_sandstone_brick_block.png b/mods/everness/textures/everness_mineral_sandstone_brick_block.png new file mode 100644 index 0000000..eb1f1b6 Binary files /dev/null and b/mods/everness/textures/everness_mineral_sandstone_brick_block.png differ diff --git a/mods/everness/textures/everness_mineral_sandstone_brick_block_top.png b/mods/everness/textures/everness_mineral_sandstone_brick_block_top.png new file mode 100644 index 0000000..4640748 Binary files /dev/null and b/mods/everness/textures/everness_mineral_sandstone_brick_block_top.png differ diff --git a/mods/everness/textures/everness_mineral_stone.png b/mods/everness/textures/everness_mineral_stone.png new file mode 100644 index 0000000..a80064c Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone.png differ diff --git a/mods/everness/textures/everness_mineral_stone_block.png b/mods/everness/textures/everness_mineral_stone_block.png new file mode 100644 index 0000000..60bcd91 Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone_block.png differ diff --git a/mods/everness/textures/everness_mineral_stone_brick.png b/mods/everness/textures/everness_mineral_stone_brick.png new file mode 100644 index 0000000..71b61c3 Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone_brick.png differ diff --git a/mods/everness/textures/everness_mineral_stone_brick_with_flower_growth.png b/mods/everness/textures/everness_mineral_stone_brick_with_flower_growth.png new file mode 100644 index 0000000..c0afa72 Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone_brick_with_flower_growth.png differ diff --git a/mods/everness/textures/everness_mineral_stone_brick_with_growth.png b/mods/everness/textures/everness_mineral_stone_brick_with_growth.png new file mode 100644 index 0000000..3d1ff2f Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone_brick_with_growth.png differ diff --git a/mods/everness/textures/everness_mineral_stone_under.png b/mods/everness/textures/everness_mineral_stone_under.png new file mode 100644 index 0000000..49bb611 Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone_under.png differ diff --git a/mods/everness/textures/everness_mineral_stone_under_top.png b/mods/everness/textures/everness_mineral_stone_under_top.png new file mode 100644 index 0000000..2ed666d Binary files /dev/null and b/mods/everness/textures/everness_mineral_stone_under_top.png differ diff --git a/mods/everness/textures/everness_mineral_torch_animated.png b/mods/everness/textures/everness_mineral_torch_animated.png new file mode 100644 index 0000000..f0369a2 Binary files /dev/null and b/mods/everness/textures/everness_mineral_torch_animated.png differ diff --git a/mods/everness/textures/everness_mineral_torch_item.png b/mods/everness/textures/everness_mineral_torch_item.png new file mode 100644 index 0000000..7cbba88 Binary files /dev/null and b/mods/everness/textures/everness_mineral_torch_item.png differ diff --git a/mods/everness/textures/everness_mineral_torch_mesh.png b/mods/everness/textures/everness_mineral_torch_mesh.png new file mode 100644 index 0000000..d03cef4 Binary files /dev/null and b/mods/everness/textures/everness_mineral_torch_mesh.png differ diff --git a/mods/everness/textures/everness_mineral_water.png b/mods/everness/textures/everness_mineral_water.png new file mode 100644 index 0000000..3127c5e Binary files /dev/null and b/mods/everness/textures/everness_mineral_water.png differ diff --git a/mods/everness/textures/everness_mineral_water_flowing_animated.png b/mods/everness/textures/everness_mineral_water_flowing_animated.png new file mode 100644 index 0000000..c969db1 Binary files /dev/null and b/mods/everness/textures/everness_mineral_water_flowing_animated.png differ diff --git a/mods/everness/textures/everness_mineral_water_source_animated.png b/mods/everness/textures/everness_mineral_water_source_animated.png new file mode 100644 index 0000000..2610d44 Binary files /dev/null and b/mods/everness/textures/everness_mineral_water_source_animated.png differ diff --git a/mods/everness/textures/everness_mineral_water_weed_1.png b/mods/everness/textures/everness_mineral_water_weed_1.png new file mode 100644 index 0000000..9ff88fd Binary files /dev/null and b/mods/everness/textures/everness_mineral_water_weed_1.png differ diff --git a/mods/everness/textures/everness_mineral_water_weed_2.png b/mods/everness/textures/everness_mineral_water_weed_2.png new file mode 100644 index 0000000..e1c9b88 Binary files /dev/null and b/mods/everness/textures/everness_mineral_water_weed_2.png differ diff --git a/mods/everness/textures/everness_mineral_water_weed_3.png b/mods/everness/textures/everness_mineral_water_weed_3.png new file mode 100644 index 0000000..fe87dcd Binary files /dev/null and b/mods/everness/textures/everness_mineral_water_weed_3.png differ diff --git a/mods/everness/textures/everness_mineral_waters_skybox.png b/mods/everness/textures/everness_mineral_waters_skybox.png new file mode 100644 index 0000000..9d9002b Binary files /dev/null and b/mods/everness/textures/everness_mineral_waters_skybox.png differ diff --git a/mods/everness/textures/everness_mold_stone.png b/mods/everness/textures/everness_mold_stone.png new file mode 100644 index 0000000..8686605 Binary files /dev/null and b/mods/everness/textures/everness_mold_stone.png differ diff --git a/mods/everness/textures/everness_mold_stone_with_moss_side.png b/mods/everness/textures/everness_mold_stone_with_moss_side.png new file mode 100644 index 0000000..288d30f Binary files /dev/null and b/mods/everness/textures/everness_mold_stone_with_moss_side.png differ diff --git a/mods/everness/textures/everness_mold_stone_with_moss_top.png b/mods/everness/textures/everness_mold_stone_with_moss_top.png new file mode 100644 index 0000000..aa030f4 Binary files /dev/null and b/mods/everness/textures/everness_mold_stone_with_moss_top.png differ diff --git a/mods/everness/textures/everness_moss_block.png b/mods/everness/textures/everness_moss_block.png new file mode 100644 index 0000000..884b259 Binary files /dev/null and b/mods/everness/textures/everness_moss_block.png differ diff --git a/mods/everness/textures/everness_mtg_bucket_lava.png b/mods/everness/textures/everness_mtg_bucket_lava.png new file mode 100644 index 0000000..17b2a60 Binary files /dev/null and b/mods/everness/textures/everness_mtg_bucket_lava.png differ diff --git a/mods/everness/textures/everness_mtg_bucket_mineral_water.png b/mods/everness/textures/everness_mtg_bucket_mineral_water.png new file mode 100644 index 0000000..f8fcaef Binary files /dev/null and b/mods/everness/textures/everness_mtg_bucket_mineral_water.png differ diff --git a/mods/everness/textures/everness_mud.png b/mods/everness/textures/everness_mud.png new file mode 100644 index 0000000..a818be2 Binary files /dev/null and b/mods/everness/textures/everness_mud.png differ diff --git a/mods/everness/textures/everness_mud_2.png b/mods/everness/textures/everness_mud_2.png new file mode 100644 index 0000000..b199c37 Binary files /dev/null and b/mods/everness/textures/everness_mud_2.png differ diff --git a/mods/everness/textures/everness_ngrass_1.png b/mods/everness/textures/everness_ngrass_1.png new file mode 100644 index 0000000..795ec99 Binary files /dev/null and b/mods/everness/textures/everness_ngrass_1.png differ diff --git a/mods/everness/textures/everness_ngrass_2.png b/mods/everness/textures/everness_ngrass_2.png new file mode 100644 index 0000000..96bd4d6 Binary files /dev/null and b/mods/everness/textures/everness_ngrass_2.png differ diff --git a/mods/everness/textures/everness_palm_tree_leaves.png b/mods/everness/textures/everness_palm_tree_leaves.png new file mode 100644 index 0000000..75680f8 Binary files /dev/null and b/mods/everness/textures/everness_palm_tree_leaves.png differ diff --git a/mods/everness/textures/everness_palm_tree_sapling.png b/mods/everness/textures/everness_palm_tree_sapling.png new file mode 100644 index 0000000..86ff9dd Binary files /dev/null and b/mods/everness/textures/everness_palm_tree_sapling.png differ diff --git a/mods/everness/textures/everness_palm_tree_side.png b/mods/everness/textures/everness_palm_tree_side.png new file mode 100644 index 0000000..5aa9434 Binary files /dev/null and b/mods/everness/textures/everness_palm_tree_side.png differ diff --git a/mods/everness/textures/everness_palm_tree_top.png b/mods/everness/textures/everness_palm_tree_top.png new file mode 100644 index 0000000..e9f1402 Binary files /dev/null and b/mods/everness/textures/everness_palm_tree_top.png differ diff --git a/mods/everness/textures/everness_palm_tree_wood.png b/mods/everness/textures/everness_palm_tree_wood.png new file mode 100644 index 0000000..2af89a8 Binary files /dev/null and b/mods/everness/textures/everness_palm_tree_wood.png differ diff --git a/mods/everness/textures/everness_particle.png b/mods/everness/textures/everness_particle.png new file mode 100644 index 0000000..63f3496 Binary files /dev/null and b/mods/everness/textures/everness_particle.png differ diff --git a/mods/everness/textures/everness_pick_archeological.png b/mods/everness/textures/everness_pick_archeological.png new file mode 100644 index 0000000..b304bad Binary files /dev/null and b/mods/everness/textures/everness_pick_archeological.png differ diff --git a/mods/everness/textures/everness_pick_illuminating.png b/mods/everness/textures/everness_pick_illuminating.png new file mode 100644 index 0000000..3ed4647 Binary files /dev/null and b/mods/everness/textures/everness_pick_illuminating.png differ diff --git a/mods/everness/textures/everness_pyrite_block.png b/mods/everness/textures/everness_pyrite_block.png new file mode 100644 index 0000000..c1ddc0a Binary files /dev/null and b/mods/everness/textures/everness_pyrite_block.png differ diff --git a/mods/everness/textures/everness_pyrite_block_forged.png b/mods/everness/textures/everness_pyrite_block_forged.png new file mode 100644 index 0000000..73b3ff3 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_block_forged.png differ diff --git a/mods/everness/textures/everness_pyrite_block_polished.png b/mods/everness/textures/everness_pyrite_block_polished.png new file mode 100644 index 0000000..917ff74 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_block_polished.png differ diff --git a/mods/everness/textures/everness_pyrite_block_slab_brick.png b/mods/everness/textures/everness_pyrite_block_slab_brick.png new file mode 100644 index 0000000..a274c33 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_block_slab_brick.png differ diff --git a/mods/everness/textures/everness_pyrite_block_spiral.png b/mods/everness/textures/everness_pyrite_block_spiral.png new file mode 100644 index 0000000..caae4cf Binary files /dev/null and b/mods/everness/textures/everness_pyrite_block_spiral.png differ diff --git a/mods/everness/textures/everness_pyrite_glass.png b/mods/everness/textures/everness_pyrite_glass.png new file mode 100644 index 0000000..514aa91 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_glass.png differ diff --git a/mods/everness/textures/everness_pyrite_ingot.png b/mods/everness/textures/everness_pyrite_ingot.png new file mode 100644 index 0000000..4ecd149 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_ingot.png differ diff --git a/mods/everness/textures/everness_pyrite_lantern.png b/mods/everness/textures/everness_pyrite_lantern.png new file mode 100644 index 0000000..08607ac Binary files /dev/null and b/mods/everness/textures/everness_pyrite_lantern.png differ diff --git a/mods/everness/textures/everness_pyrite_lump.png b/mods/everness/textures/everness_pyrite_lump.png new file mode 100644 index 0000000..ad0179a Binary files /dev/null and b/mods/everness/textures/everness_pyrite_lump.png differ diff --git a/mods/everness/textures/everness_pyrite_pillar_bottom.png b/mods/everness/textures/everness_pyrite_pillar_bottom.png new file mode 100644 index 0000000..a304fd0 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_pillar_bottom.png differ diff --git a/mods/everness/textures/everness_pyrite_pillar_middle.png b/mods/everness/textures/everness_pyrite_pillar_middle.png new file mode 100644 index 0000000..280a9dc Binary files /dev/null and b/mods/everness/textures/everness_pyrite_pillar_middle.png differ diff --git a/mods/everness/textures/everness_pyrite_pillar_small.png b/mods/everness/textures/everness_pyrite_pillar_small.png new file mode 100644 index 0000000..4ebbd56 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_pillar_small.png differ diff --git a/mods/everness/textures/everness_pyrite_pillar_top.png b/mods/everness/textures/everness_pyrite_pillar_top.png new file mode 100644 index 0000000..967afc9 Binary files /dev/null and b/mods/everness/textures/everness_pyrite_pillar_top.png differ diff --git a/mods/everness/textures/everness_pyriteblock_brick.png b/mods/everness/textures/everness_pyriteblock_brick.png new file mode 100644 index 0000000..36df0b4 Binary files /dev/null and b/mods/everness/textures/everness_pyriteblock_brick.png differ diff --git a/mods/everness/textures/everness_quartz.png b/mods/everness/textures/everness_quartz.png new file mode 100644 index 0000000..0e80948 Binary files /dev/null and b/mods/everness/textures/everness_quartz.png differ diff --git a/mods/everness/textures/everness_quartz_block_bottom.png b/mods/everness/textures/everness_quartz_block_bottom.png new file mode 100644 index 0000000..2f3098a Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_bottom.png differ diff --git a/mods/everness/textures/everness_quartz_block_chiseled.png b/mods/everness/textures/everness_quartz_block_chiseled.png new file mode 100644 index 0000000..88deb47 Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_chiseled.png differ diff --git a/mods/everness/textures/everness_quartz_block_chiseled_top.png b/mods/everness/textures/everness_quartz_block_chiseled_top.png new file mode 100644 index 0000000..b656447 Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_chiseled_top.png differ diff --git a/mods/everness/textures/everness_quartz_block_lines.png b/mods/everness/textures/everness_quartz_block_lines.png new file mode 100644 index 0000000..129d745 Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_lines.png differ diff --git a/mods/everness/textures/everness_quartz_block_lines_top.png b/mods/everness/textures/everness_quartz_block_lines_top.png new file mode 100644 index 0000000..fc573e0 Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_lines_top.png differ diff --git a/mods/everness/textures/everness_quartz_block_side.png b/mods/everness/textures/everness_quartz_block_side.png new file mode 100644 index 0000000..c674050 Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_side.png differ diff --git a/mods/everness/textures/everness_quartz_block_top.png b/mods/everness/textures/everness_quartz_block_top.png new file mode 100644 index 0000000..aff4bd7 Binary files /dev/null and b/mods/everness/textures/everness_quartz_block_top.png differ diff --git a/mods/everness/textures/everness_quartz_ore.png b/mods/everness/textures/everness_quartz_ore.png new file mode 100644 index 0000000..6d2b939 Binary files /dev/null and b/mods/everness/textures/everness_quartz_ore.png differ diff --git a/mods/everness/textures/everness_red_castor_1.png b/mods/everness/textures/everness_red_castor_1.png new file mode 100644 index 0000000..2b44d7c Binary files /dev/null and b/mods/everness/textures/everness_red_castor_1.png differ diff --git a/mods/everness/textures/everness_red_castor_2.png b/mods/everness/textures/everness_red_castor_2.png new file mode 100644 index 0000000..1dc3a82 Binary files /dev/null and b/mods/everness/textures/everness_red_castor_2.png differ diff --git a/mods/everness/textures/everness_red_castor_3.png b/mods/everness/textures/everness_red_castor_3.png new file mode 100644 index 0000000..41d4e80 Binary files /dev/null and b/mods/everness/textures/everness_red_castor_3.png differ diff --git a/mods/everness/textures/everness_red_castor_4.png b/mods/everness/textures/everness_red_castor_4.png new file mode 100644 index 0000000..cf276c7 Binary files /dev/null and b/mods/everness/textures/everness_red_castor_4.png differ diff --git a/mods/everness/textures/everness_reeds_vine_1.png b/mods/everness/textures/everness_reeds_vine_1.png new file mode 100644 index 0000000..f19eb0c Binary files /dev/null and b/mods/everness/textures/everness_reeds_vine_1.png differ diff --git a/mods/everness/textures/everness_reeds_vine_2.png b/mods/everness/textures/everness_reeds_vine_2.png new file mode 100644 index 0000000..9817eb3 Binary files /dev/null and b/mods/everness/textures/everness_reeds_vine_2.png differ diff --git a/mods/everness/textures/everness_reeds_vine_end.png b/mods/everness/textures/everness_reeds_vine_end.png new file mode 100644 index 0000000..5f75f4e Binary files /dev/null and b/mods/everness/textures/everness_reeds_vine_end.png differ diff --git a/mods/everness/textures/everness_rising_soul_particle.png b/mods/everness/textures/everness_rising_soul_particle.png new file mode 100644 index 0000000..dd1b8b5 Binary files /dev/null and b/mods/everness/textures/everness_rising_soul_particle.png differ diff --git a/mods/everness/textures/everness_rose_bush_item.png b/mods/everness/textures/everness_rose_bush_item.png new file mode 100644 index 0000000..104811b Binary files /dev/null and b/mods/everness/textures/everness_rose_bush_item.png differ diff --git a/mods/everness/textures/everness_rose_bush_mesh.png b/mods/everness/textures/everness_rose_bush_mesh.png new file mode 100644 index 0000000..0ea633e Binary files /dev/null and b/mods/everness/textures/everness_rose_bush_mesh.png differ diff --git a/mods/everness/textures/everness_scull_with_candle_inventory.png b/mods/everness/textures/everness_scull_with_candle_inventory.png new file mode 100644 index 0000000..cc1001d Binary files /dev/null and b/mods/everness/textures/everness_scull_with_candle_inventory.png differ diff --git a/mods/everness/textures/everness_sequoia_tree_leaves.png b/mods/everness/textures/everness_sequoia_tree_leaves.png new file mode 100644 index 0000000..a22a654 Binary files /dev/null and b/mods/everness/textures/everness_sequoia_tree_leaves.png differ diff --git a/mods/everness/textures/everness_sequoia_tree_sapling.png b/mods/everness/textures/everness_sequoia_tree_sapling.png new file mode 100644 index 0000000..882f8fd Binary files /dev/null and b/mods/everness/textures/everness_sequoia_tree_sapling.png differ diff --git a/mods/everness/textures/everness_sequoia_tree_side.png b/mods/everness/textures/everness_sequoia_tree_side.png new file mode 100644 index 0000000..a48c52f Binary files /dev/null and b/mods/everness/textures/everness_sequoia_tree_side.png differ diff --git a/mods/everness/textures/everness_sequoia_tree_top.png b/mods/everness/textures/everness_sequoia_tree_top.png new file mode 100644 index 0000000..1e9149e Binary files /dev/null and b/mods/everness/textures/everness_sequoia_tree_top.png differ diff --git a/mods/everness/textures/everness_sequoia_wood.png b/mods/everness/textures/everness_sequoia_wood.png new file mode 100644 index 0000000..57d949a Binary files /dev/null and b/mods/everness/textures/everness_sequoia_wood.png differ diff --git a/mods/everness/textures/everness_shell_of_underwarer_breathing.png b/mods/everness/textures/everness_shell_of_underwarer_breathing.png new file mode 100644 index 0000000..ba74cf4 Binary files /dev/null and b/mods/everness/textures/everness_shell_of_underwarer_breathing.png differ diff --git a/mods/everness/textures/everness_shovel_silk.png b/mods/everness/textures/everness_shovel_silk.png new file mode 100644 index 0000000..9620a38 Binary files /dev/null and b/mods/everness/textures/everness_shovel_silk.png differ diff --git a/mods/everness/textures/everness_smoke_cloud_particle_animated.png b/mods/everness/textures/everness_smoke_cloud_particle_animated.png new file mode 100644 index 0000000..84a8e26 Binary files /dev/null and b/mods/everness/textures/everness_smoke_cloud_particle_animated.png differ diff --git a/mods/everness/textures/everness_smoke_cloud_particle_static.png b/mods/everness/textures/everness_smoke_cloud_particle_static.png new file mode 100644 index 0000000..54c775c Binary files /dev/null and b/mods/everness/textures/everness_smoke_cloud_particle_static.png differ diff --git a/mods/everness/textures/everness_snowcobble.png b/mods/everness/textures/everness_snowcobble.png new file mode 100644 index 0000000..73b8c4e Binary files /dev/null and b/mods/everness/textures/everness_snowcobble.png differ diff --git a/mods/everness/textures/everness_soul_sandstone.png b/mods/everness/textures/everness_soul_sandstone.png new file mode 100644 index 0000000..133f3d8 Binary files /dev/null and b/mods/everness/textures/everness_soul_sandstone.png differ diff --git a/mods/everness/textures/everness_soul_sandstone_veined_side.png b/mods/everness/textures/everness_soul_sandstone_veined_side.png new file mode 100644 index 0000000..6b5c41c Binary files /dev/null and b/mods/everness/textures/everness_soul_sandstone_veined_side.png differ diff --git a/mods/everness/textures/everness_soul_sandstone_veined_top.png b/mods/everness/textures/everness_soul_sandstone_veined_top.png new file mode 100644 index 0000000..8fd3ad4 Binary files /dev/null and b/mods/everness/textures/everness_soul_sandstone_veined_top.png differ diff --git a/mods/everness/textures/everness_spine_kelp.png b/mods/everness/textures/everness_spine_kelp.png new file mode 100644 index 0000000..b64a592 Binary files /dev/null and b/mods/everness/textures/everness_spine_kelp.png differ diff --git a/mods/everness/textures/everness_staghorn_coral_inv.png b/mods/everness/textures/everness_staghorn_coral_inv.png new file mode 100644 index 0000000..52e2e36 Binary files /dev/null and b/mods/everness/textures/everness_staghorn_coral_inv.png differ diff --git a/mods/everness/textures/everness_staghorn_coral_nodebox_bottom.png b/mods/everness/textures/everness_staghorn_coral_nodebox_bottom.png new file mode 100644 index 0000000..c09c537 Binary files /dev/null and b/mods/everness/textures/everness_staghorn_coral_nodebox_bottom.png differ diff --git a/mods/everness/textures/everness_staghorn_coral_nodebox_side.png b/mods/everness/textures/everness_staghorn_coral_nodebox_side.png new file mode 100644 index 0000000..cc3c229 Binary files /dev/null and b/mods/everness/textures/everness_staghorn_coral_nodebox_side.png differ diff --git a/mods/everness/textures/everness_staghorn_coral_nodebox_top.png b/mods/everness/textures/everness_staghorn_coral_nodebox_top.png new file mode 100644 index 0000000..2de773c Binary files /dev/null and b/mods/everness/textures/everness_staghorn_coral_nodebox_top.png differ diff --git a/mods/everness/textures/everness_starfish.png b/mods/everness/textures/everness_starfish.png new file mode 100644 index 0000000..41ff675 Binary files /dev/null and b/mods/everness/textures/everness_starfish.png differ diff --git a/mods/everness/textures/everness_stone.png b/mods/everness/textures/everness_stone.png new file mode 100644 index 0000000..6085b8c Binary files /dev/null and b/mods/everness/textures/everness_stone.png differ diff --git a/mods/everness/textures/everness_sulfur_stone.png b/mods/everness/textures/everness_sulfur_stone.png new file mode 100644 index 0000000..731ee2b Binary files /dev/null and b/mods/everness/textures/everness_sulfur_stone.png differ diff --git a/mods/everness/textures/everness_tenanea_flowers_vine_1.png b/mods/everness/textures/everness_tenanea_flowers_vine_1.png new file mode 100644 index 0000000..7c1d0c3 Binary files /dev/null and b/mods/everness/textures/everness_tenanea_flowers_vine_1.png differ diff --git a/mods/everness/textures/everness_tenanea_flowers_vine_2.png b/mods/everness/textures/everness_tenanea_flowers_vine_2.png new file mode 100644 index 0000000..c0e20e5 Binary files /dev/null and b/mods/everness/textures/everness_tenanea_flowers_vine_2.png differ diff --git a/mods/everness/textures/everness_tenanea_flowers_vine_end.png b/mods/everness/textures/everness_tenanea_flowers_vine_end.png new file mode 100644 index 0000000..847e6f8 Binary files /dev/null and b/mods/everness/textures/everness_tenanea_flowers_vine_end.png differ diff --git a/mods/everness/textures/everness_termite_block.png b/mods/everness/textures/everness_termite_block.png new file mode 100644 index 0000000..17d85c2 Binary files /dev/null and b/mods/everness/textures/everness_termite_block.png differ diff --git a/mods/everness/textures/everness_tinted_glass_base.png b/mods/everness/textures/everness_tinted_glass_base.png new file mode 100644 index 0000000..0339e8a Binary files /dev/null and b/mods/everness/textures/everness_tinted_glass_base.png differ diff --git a/mods/everness/textures/everness_tinted_glass_detail.png b/mods/everness/textures/everness_tinted_glass_detail.png new file mode 100644 index 0000000..4c4deca Binary files /dev/null and b/mods/everness/textures/everness_tinted_glass_detail.png differ diff --git a/mods/everness/textures/everness_trapdoor_cursed_steel_bar.png b/mods/everness/textures/everness_trapdoor_cursed_steel_bar.png new file mode 100644 index 0000000..e8d54d3 Binary files /dev/null and b/mods/everness/textures/everness_trapdoor_cursed_steel_bar.png differ diff --git a/mods/everness/textures/everness_trapdoor_cursed_steel_bar_side.png b/mods/everness/textures/everness_trapdoor_cursed_steel_bar_side.png new file mode 100644 index 0000000..b6424ff Binary files /dev/null and b/mods/everness/textures/everness_trapdoor_cursed_steel_bar_side.png differ diff --git a/mods/everness/textures/everness_twisted_crystal_grass.png b/mods/everness/textures/everness_twisted_crystal_grass.png new file mode 100644 index 0000000..3430cce Binary files /dev/null and b/mods/everness/textures/everness_twisted_crystal_grass.png differ diff --git a/mods/everness/textures/everness_twisted_crystal_spire.png b/mods/everness/textures/everness_twisted_crystal_spire.png new file mode 100644 index 0000000..bf21e77 Binary files /dev/null and b/mods/everness/textures/everness_twisted_crystal_spire.png differ diff --git a/mods/everness/textures/everness_twisted_crystal_spire_item.png b/mods/everness/textures/everness_twisted_crystal_spire_item.png new file mode 100644 index 0000000..160eeb8 Binary files /dev/null and b/mods/everness/textures/everness_twisted_crystal_spire_item.png differ diff --git a/mods/everness/textures/everness_twisted_vine_1.png b/mods/everness/textures/everness_twisted_vine_1.png new file mode 100644 index 0000000..57ff10d Binary files /dev/null and b/mods/everness/textures/everness_twisted_vine_1.png differ diff --git a/mods/everness/textures/everness_twisted_vine_2.png b/mods/everness/textures/everness_twisted_vine_2.png new file mode 100644 index 0000000..bad978d Binary files /dev/null and b/mods/everness/textures/everness_twisted_vine_2.png differ diff --git a/mods/everness/textures/everness_twisted_vine_end.png b/mods/everness/textures/everness_twisted_vine_end.png new file mode 100644 index 0000000..c4ca5d2 Binary files /dev/null and b/mods/everness/textures/everness_twisted_vine_end.png differ diff --git a/mods/everness/textures/everness_venus_trap_item.png b/mods/everness/textures/everness_venus_trap_item.png new file mode 100644 index 0000000..a165206 Binary files /dev/null and b/mods/everness/textures/everness_venus_trap_item.png differ diff --git a/mods/everness/textures/everness_venus_trap_mesh.png b/mods/everness/textures/everness_venus_trap_mesh.png new file mode 100644 index 0000000..59e3641 Binary files /dev/null and b/mods/everness/textures/everness_venus_trap_mesh.png differ diff --git a/mods/everness/textures/everness_vine_cave_1.png b/mods/everness/textures/everness_vine_cave_1.png new file mode 100644 index 0000000..b3beb2c Binary files /dev/null and b/mods/everness/textures/everness_vine_cave_1.png differ diff --git a/mods/everness/textures/everness_vine_cave_2.png b/mods/everness/textures/everness_vine_cave_2.png new file mode 100644 index 0000000..5249305 Binary files /dev/null and b/mods/everness/textures/everness_vine_cave_2.png differ diff --git a/mods/everness/textures/everness_vine_cave_end.png b/mods/everness/textures/everness_vine_cave_end.png new file mode 100644 index 0000000..549fff6 Binary files /dev/null and b/mods/everness/textures/everness_vine_cave_end.png differ diff --git a/mods/everness/textures/everness_vine_shears.png b/mods/everness/textures/everness_vine_shears.png new file mode 100644 index 0000000..85bc9be Binary files /dev/null and b/mods/everness/textures/everness_vine_shears.png differ diff --git a/mods/everness/textures/everness_volcanic_rock.png b/mods/everness/textures/everness_volcanic_rock.png new file mode 100644 index 0000000..fc2eddf Binary files /dev/null and b/mods/everness/textures/everness_volcanic_rock.png differ diff --git a/mods/everness/textures/everness_volcanic_rock_with_magma_animated.png b/mods/everness/textures/everness_volcanic_rock_with_magma_animated.png new file mode 100644 index 0000000..1148155 Binary files /dev/null and b/mods/everness/textures/everness_volcanic_rock_with_magma_animated.png differ diff --git a/mods/everness/textures/everness_volcanic_sulfur_stone.png b/mods/everness/textures/everness_volcanic_sulfur_stone.png new file mode 100644 index 0000000..f6889b6 Binary files /dev/null and b/mods/everness/textures/everness_volcanic_sulfur_stone.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_blue.png b/mods/everness/textures/everness_wall_vine_cave_blue.png new file mode 100644 index 0000000..39df69f Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_blue.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_blue_item.png b/mods/everness/textures/everness_wall_vine_cave_blue_item.png new file mode 100644 index 0000000..b345b26 Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_blue_item.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_cyan.png b/mods/everness/textures/everness_wall_vine_cave_cyan.png new file mode 100644 index 0000000..0e8e79c Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_cyan.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_cyan_item.png b/mods/everness/textures/everness_wall_vine_cave_cyan_item.png new file mode 100644 index 0000000..6660801 Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_cyan_item.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_green.png b/mods/everness/textures/everness_wall_vine_cave_green.png new file mode 100644 index 0000000..e42458f Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_green.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_green_item.png b/mods/everness/textures/everness_wall_vine_cave_green_item.png new file mode 100644 index 0000000..e68e45c Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_green_item.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_violet.png b/mods/everness/textures/everness_wall_vine_cave_violet.png new file mode 100644 index 0000000..741887e Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_violet.png differ diff --git a/mods/everness/textures/everness_wall_vine_cave_violet_item.png b/mods/everness/textures/everness_wall_vine_cave_violet_item.png new file mode 100644 index 0000000..80ca072 Binary files /dev/null and b/mods/everness/textures/everness_wall_vine_cave_violet_item.png differ diff --git a/mods/everness/textures/everness_water_geyser_item.png b/mods/everness/textures/everness_water_geyser_item.png new file mode 100644 index 0000000..5d966c1 Binary files /dev/null and b/mods/everness/textures/everness_water_geyser_item.png differ diff --git a/mods/everness/textures/everness_water_geyser_particle.png b/mods/everness/textures/everness_water_geyser_particle.png new file mode 100644 index 0000000..2778728 Binary files /dev/null and b/mods/everness/textures/everness_water_geyser_particle.png differ diff --git a/mods/everness/textures/everness_weeping_obsidian.png b/mods/everness/textures/everness_weeping_obsidian.png new file mode 100644 index 0000000..c1a5931 Binary files /dev/null and b/mods/everness/textures/everness_weeping_obsidian.png differ diff --git a/mods/everness/textures/everness_whispering_gourd_vine_1.png b/mods/everness/textures/everness_whispering_gourd_vine_1.png new file mode 100644 index 0000000..5fa9128 Binary files /dev/null and b/mods/everness/textures/everness_whispering_gourd_vine_1.png differ diff --git a/mods/everness/textures/everness_whispering_gourd_vine_2.png b/mods/everness/textures/everness_whispering_gourd_vine_2.png new file mode 100644 index 0000000..f1a3e19 Binary files /dev/null and b/mods/everness/textures/everness_whispering_gourd_vine_2.png differ diff --git a/mods/everness/textures/everness_whispering_gourd_vine_end.png b/mods/everness/textures/everness_whispering_gourd_vine_end.png new file mode 100644 index 0000000..c444052 Binary files /dev/null and b/mods/everness/textures/everness_whispering_gourd_vine_end.png differ diff --git a/mods/everness/textures/everness_willow_leaves.png b/mods/everness/textures/everness_willow_leaves.png new file mode 100644 index 0000000..e0234ff Binary files /dev/null and b/mods/everness/textures/everness_willow_leaves.png differ diff --git a/mods/everness/textures/everness_willow_sapling.png b/mods/everness/textures/everness_willow_sapling.png new file mode 100644 index 0000000..0b20ff3 Binary files /dev/null and b/mods/everness/textures/everness_willow_sapling.png differ diff --git a/mods/everness/textures/everness_willow_tree_sapling.png b/mods/everness/textures/everness_willow_tree_sapling.png new file mode 100644 index 0000000..433a55e Binary files /dev/null and b/mods/everness/textures/everness_willow_tree_sapling.png differ diff --git a/mods/everness/textures/everness_willow_tree_side.png b/mods/everness/textures/everness_willow_tree_side.png new file mode 100644 index 0000000..d928294 Binary files /dev/null and b/mods/everness/textures/everness_willow_tree_side.png differ diff --git a/mods/everness/textures/everness_willow_tree_top.png b/mods/everness/textures/everness_willow_tree_top.png new file mode 100644 index 0000000..2bc50d0 Binary files /dev/null and b/mods/everness/textures/everness_willow_tree_top.png differ diff --git a/mods/everness/textures/everness_willow_vine_1.png b/mods/everness/textures/everness_willow_vine_1.png new file mode 100644 index 0000000..b0fce66 Binary files /dev/null and b/mods/everness/textures/everness_willow_vine_1.png differ diff --git a/mods/everness/textures/everness_willow_vine_2.png b/mods/everness/textures/everness_willow_vine_2.png new file mode 100644 index 0000000..61af58c Binary files /dev/null and b/mods/everness/textures/everness_willow_vine_2.png differ diff --git a/mods/everness/textures/everness_willow_vine_end.png b/mods/everness/textures/everness_willow_vine_end.png new file mode 100644 index 0000000..ec68967 Binary files /dev/null and b/mods/everness/textures/everness_willow_vine_end.png differ diff --git a/mods/everness/textures/everness_willow_wood.png b/mods/everness/textures/everness_willow_wood.png new file mode 100644 index 0000000..826a77b Binary files /dev/null and b/mods/everness/textures/everness_willow_wood.png differ diff --git a/mods/everness/textures/everness_xpanes_edge_pyrite.png b/mods/everness/textures/everness_xpanes_edge_pyrite.png new file mode 100644 index 0000000..458e78e Binary files /dev/null and b/mods/everness/textures/everness_xpanes_edge_pyrite.png differ diff --git a/mods/everness/tools.lua b/mods/everness/tools.lua new file mode 100644 index 0000000..1b51598 --- /dev/null +++ b/mods/everness/tools.lua @@ -0,0 +1,402 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +Everness:register_tool('everness:vine_shears', { + description = S('Vine Shears'), + inventory_image = 'everness_vine_shears.png', + wield_image = 'everness_vine_shears.png', + wield_scale = { x = 2, y = 2, z = 1 }, + sound = { breaks = 'everness_tool_breaks' }, + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level = 0, + groupcaps = { + snappy = { times = { [3] = 0.2 }, uses = 30, maxlevel = 3 }, + wool = { times = { [3] = 0.2 }, uses = 30, maxlevel = 3 } + } + }, + groups = { + -- Everness + vine_shears = 1 + }, + -- MCL + _mcl_toollike_wield = true, + _mcl_diggroups = { + shearsy = { speed = 1.5, level = 1, uses = 238 }, + shearsy_wool = { speed = 5, level = 1, uses = 238 }, + shearsy_cobweb = { speed = 15, level = 1, uses = 238 } + }, +}) + +Everness:register_tool('everness:pick_illuminating', { + description = 'Illuminating Pickaxe (secondary use to place temporary illuminating crystal)', + short_description = 'Illuminating Pickaxe', + inventory_image = 'everness_pick_illuminating.png', + wield_scale = { x = 2, y = 2, z = 1 }, + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 3, + groupcaps = { + cracky = { times = { [1] = 2.0, [2] = 1.0, [3] = 0.50 }, uses = 60, maxlevel = 3 } + }, + damage_groups = { fleshy = 5 }, + }, + sound = { breaks = 'everness_tool_breaks' }, + groups = { pickaxe = 1, enchantability = 10 }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == 'node' then + local pos = core.get_pointed_thing_position(pointed_thing) + + if not pos or not placer then + return itemstack + end + + local player_name = placer:get_player_name() + local pointed_node = core.get_node(pos) + local pointed_node_def = core.registered_nodes[pointed_node.name] + local pos_placer = placer:get_pos() + + if not pointed_node then + return itemstack + end + + -- check if we have to use default on_place first + if pointed_node_def.on_rightclick then + return pointed_node_def.on_rightclick(pos, pointed_node, placer, itemstack, pointed_thing) + end + + if not core.is_protected(pointed_thing.above, player_name) and + not core.is_protected(pointed_thing.under, player_name) + and core.get_node(pointed_thing.above).name == 'air' + then + -- place crystal + if core.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + core.add_particlespawner({ + amount = 50, + time = 1, + size = { + min = 0.5, + max = 1, + }, + exptime = 2, + pos = vector.new(pos_placer.x, pos_placer.y, pos_placer.z), + texture = { + name = 'everness_particle.png^[colorize:#FFEE83:255', + alpha_tween = { + 1, 0.5, + style = 'fwd', + reps = 1 + }, + scale_tween = { + 1, 0.5, + style = 'fwd', + reps = 1 + } + }, + radius = { min = 0.5, max = 0.7 }, + attract = { + kind = 'point', + strength = 1, + origin = vector.new(pointed_thing.above.x, pointed_thing.above.y, pointed_thing.above.z), + }, + glow = 12 + }) + end + + core.set_node(pointed_thing.above, { name = 'everness:floating_crystal' }) + core.get_node_timer(pointed_thing.above):start(math.random(85, 95)) + + if not core.settings:get_bool('creative_mode') + or not core.check_player_privs(placer:get_player_name(), { creative = true }) + then + local wear_to_add = 65535 / (150 - 1) + + if itemstack:get_wear() + wear_to_add > 65535 then + local itemstack_def = itemstack:get_definition() + -- Break tool + core.sound_play(itemstack_def.sound.breaks, { + pos = pos, + gain = 0.5 + }, true) + end + + itemstack:add_wear(wear_to_add) + end + + return itemstack + end + end + + return itemstack + end, + -- MCL + _mcl_toollike_wield = true, + _mcl_diggroups = { + pickaxey = { speed = 8, level = 5, uses = 1562 } + }, +}) + +Everness:register_tool('everness:pick_archeological', { + description = 'Archeological pickaxe has the ability to get rare items from certain ores. (Use to get different kinds of ceramic sherds from ores with ceramic sherds)', + short_description = 'Archeological pickaxe', + inventory_image = 'everness_pick_archeological.png', + wield_scale = { x = 2, y = 2, z = 1 }, + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level = 0, + groupcaps = { + cracky = { times = { [3] = 1.60 }, uses = 20, maxlevel = 1 } + }, + damage_groups = { fleshy = 2 }, + }, + sound = { breaks = 'everness_tool_breaks' }, + groups = { + -- MTG + pickaxe = 1, + -- X Enchanting + enchantability = 10, + -- Everness + archeological_drop = 1 + }, + -- MCL + _mcl_toollike_wield = true, + _mcl_diggroups = { + pickaxey = { speed = 2, level = 2, uses = 500 } + }, +}) + +Everness:register_tool('everness:shovel_silk', { + description = S('Silk Shovel'), + inventory_image = 'everness_shovel_silk.png', + wield_image = 'everness_shovel_silk.png^[transformR90', + wield_scale = { x = 2, y = 2, z = 1 }, + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level = 1, + groupcaps = { + crumbly = { times = { [1] = 1.10,[2] = 0.50,[3] = 0.30 }, uses = 30, maxlevel = 3 }, + }, + damage_groups = { fleshy = 4 }, + }, + sound = { + breaks = 'everness_tool_breaks' + }, + -- no `shovel` group so it cannot be enchanted + -- groups = { shovel = 1 } + -- MCL + _mcl_toollike_wield = true, + _mcl_diggroups = { + shovely = { speed = 8, level = 5, uses = 1562 } + }, +}) + +local old_handle_node_drops = core.handle_node_drops + +function core.handle_node_drops(pos, drops, digger) + if not digger + or not digger:is_player() + or digger:get_wielded_item():get_name() ~= 'everness:shovel_silk' + then + return old_handle_node_drops(pos, drops, digger) + end + + local node = core.get_node(pos) + + -- Silk Touch + if (core.get_item_group(node.name, 'crumbly') > 0 or core.get_item_group(node.name, 'shovely') > 0) + and core.get_item_group(node.name, 'no_silktouch') == 0 + then + -- drop raw item/node + return old_handle_node_drops(pos, { ItemStack(node.name) }, digger) + end + + return old_handle_node_drops(pos, drops, digger) +end + +Everness:register_tool('everness:shell_of_underwater_breathing', { + description = S('Shell of Underwater Breating'), + inventory_image = 'everness_shell_of_underwarer_breathing.png', + wield_image = 'everness_shell_of_underwarer_breathing.png', + wield_scale = { x = 2, y = 2, z = 1 }, + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 0, + groupcaps = { + crumbly = { times = { [2] = 3.00,[3] = 0.70 }, uses = 0, maxlevel = 1 }, + snappy = { times = { [3] = 0.40 }, uses = 0, maxlevel = 1 }, + oddly_breakable_by_hand = { times = { [1] = 3.50,[2] = 2.00,[3] = 0.70 }, uses = 0 } + }, + damage_groups = { fleshy = 1 }, + }, + sound = { breaks = 'everness_tool_breaks' }, + on_place = function(itemstack, placer, pointed_thing) + return Everness:use_shell_of_underwater_breathing(itemstack, placer, pointed_thing) + end, + on_secondary_use = function(itemstack, user, pointed_thing) + return Everness:use_shell_of_underwater_breathing(itemstack, user, pointed_thing) + end, + -- MCL + _mcl_toollike_wield = true, +}) + +-- +-- Hammer +-- + +core.register_on_mods_loaded(function() + -- Populate `cid_data` for later VoxelManipulation by hammer + for name, def in pairs(core.registered_nodes) do + if def.walkable and def.pointable and def.diggable then + Everness.hammer_cid_data[core.get_content_id(name)] = { + name = name, + drops = def.drops, + can_dig = def.can_dig, + sounds = def.sounds + } + end + end +end) + +core.register_on_dignode(function(pos, oldnode, digger) + if not digger or not digger.get_wielded_item then + return + end + + local wielditem = digger:get_wielded_item() + local itemname = wielditem:get_name() + + if itemname == 'everness:hammer' or itemname == 'everness:hammer_sharp' then + Everness.hammer_after_dig_node(pos, oldnode, nil, digger) + end +end) + +Everness:register_node('everness:hammer', { + description = S('Hammer'), + mod_origin = 'evermess', + inventory_image = 'everness_hammer_item.png', + use_texture_alpha = 'clip', + drawtype = 'mesh', + mesh = 'everness_hammer_pick.obj', + tiles = { 'everness_hammer_mesh.png', 'everness_hammer_handle_mesh.png', 'everness_hammer_mesh_transparent.png' }, + wield_scale = { x = 2, y = 2, z = 2 }, + node_placement_prediction = '', + range = 4.0, + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level = 3, + groupcaps = { + cracky = { times = { [1] = 2.0, [2] = 1.0, [3] = 0.50 }, uses = 30, maxlevel = 3 }, + }, + damage_groups = { fleshy = 5 }, + -- MCL + punch_attack_uses = 781, + }, + stack_max = 1, + sound = { breaks = 'everness_tool_breaks' }, + -- MCL + _mcl_toollike_wield = true, + groups = { + -- MCL + tool = 1, + dig_speed_class = 5 + }, + -- MCL + _mcl_diggroups = { + pickaxey = { speed = 8, level = 5, uses = 1562 } + }, + on_place = function(itemstack, placer, pointed_thing) + -- disable placing (returns `nil`) + if pointed_thing.type == 'node' then + local pos = core.get_pointed_thing_position(pointed_thing) + + if not pos or not placer then + return + end + + local pointed_node = core.get_node(pos) + local pointed_node_def = core.registered_nodes[pointed_node.name] + + if not pointed_node then + return + end + + -- check if we have to use default on_place first + if pointed_node_def.on_rightclick then + return pointed_node_def.on_rightclick(pos, pointed_node, placer, itemstack, pointed_thing) + end + end + end +}) + +Everness:register_node('everness:hammer_sharp', { + description = S('Sharp') .. ' ' .. S('Hammer'), + mod_origin = 'evermess', + inventory_image = 'everness_hammer_sharp_item.png', + use_texture_alpha = 'clip', + drawtype = 'mesh', + mesh = 'everness_hammer_pick.obj', + tiles = { 'everness_hammer_sharp_mesh.png', 'everness_hammer_sharp_handle_mesh.png', 'everness_hammer_mesh_transparent.png' }, + wield_scale = { x = 2, y = 2, z = 2 }, + node_placement_prediction = '', + range = 4.0, + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level = 3, + groupcaps = { + cracky = { times = { [1] = 2.0, [2] = 1.0, [3] = 0.50 }, uses = 30, maxlevel = 3 }, + }, + damage_groups = { fleshy = 5 }, + -- MCL + punch_attack_uses = 781, + }, + stack_max = 1, + sound = { breaks = 'everness_tool_breaks' }, + -- MCL + _mcl_toollike_wield = true, + groups = { + -- MCL + tool = 1, + dig_speed_class = 5 + }, + -- MCL + _mcl_diggroups = { + pickaxey = { speed = 8, level = 5, uses = 1562 } + }, + on_place = function(itemstack, placer, pointed_thing) + -- disable placing (returns `nil`) + if pointed_thing.type == 'node' then + local pos = core.get_pointed_thing_position(pointed_thing) + + if not pos or not placer then + return + end + + local pointed_node = core.get_node(pos) + local pointed_node_def = core.registered_nodes[pointed_node.name] + + if not pointed_node then + return + end + + -- check if we have to use default on_place first + if pointed_node_def.on_rightclick then + return pointed_node_def.on_rightclick(pos, pointed_node, placer, itemstack, pointed_thing) + end + end + end +}) diff --git a/mods/everness/torches.lua b/mods/everness/torches.lua new file mode 100644 index 0000000..ad6f218 --- /dev/null +++ b/mods/everness/torches.lua @@ -0,0 +1,242 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + + Authors of source code + ---------------------- + Originally by celeron55, Perttu Ahola (LGPLv2.1+) + Various Luanti developers and contributors (LGPLv2.1+) + + The torch code was derived by sofar from the 'torches' mod by + BlockMen (LGPLv2.1+) +--]] + +local S = core.get_translator(core.get_current_modname()) + +local function on_flood(pos, oldnode, newnode) + core.add_item(pos, ItemStack('everness:mineral_torch 1')) + -- Play flame-extinguish sound if liquid is not an 'igniter' + local nodedef = core.registered_items[newnode.name] + + if not ( + nodedef + and nodedef.groups + and nodedef.groups.igniter + and nodedef.groups.igniter > 0 + ) then + core.sound_play('default_cool_lava', + { + pos = pos, + max_hear_distance = 16, + gain = 0.07 + }, + true + ) + end + -- Remove the torch node + return false +end + +Everness:register_node('everness:mineral_torch', { + description = S('Mineral') .. ' ' .. S('Torch'), + drawtype = 'mesh', + mesh = 'everness_mineral_torch.obj', + inventory_image = 'everness_mineral_torch_item.png', + wield_image = 'everness_mineral_torch_item.png', + wield_scale = { x = 2, y = 2, z = 1 }, + tiles = { + { name = 'everness_mineral_torch_mesh.png' }, + { + name = 'everness_mineral_torch_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 36, + aspect_h = 6, + length = 1 + }, + backface_culling = false + } + }, + use_texture_alpha = 'blend', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + liquids_pointable = false, + light_source = 12, + groups = { + choppy = 2, + dig_immediate = 3, + flammable = 1, + attached_node = 1, + torch = 1 + }, + drop = 'everness:mineral_torch', + selection_box = { + type = 'wallmounted', + wall_bottom = { -1 / 8, -1 / 2, -1 / 8, 1 / 8, 2 / 16, 1 / 8 }, + }, + sounds = Everness.node_sound_wood_defaults(), + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = core.get_node(under) + local def = core.registered_nodes[node.name] + + if def + and def.on_rightclick + and not ( + placer + and placer:is_player() + and placer:get_player_control().sneak + ) + then + return def.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + local above = pointed_thing.above + local wdir = core.dir_to_wallmounted(vector.subtract(under, above)) + + local fakestack = itemstack + + if wdir == 0 then + fakestack:set_name('everness:mineral_torch_ceiling') + elseif wdir == 1 then + fakestack:set_name('everness:mineral_torch') + else + fakestack:set_name('everness:mineral_torch_wall') + end + + itemstack = core.item_place(fakestack, placer, pointed_thing, wdir) + + itemstack:set_name('everness:mineral_torch') + + return itemstack + end, + floodable = true, + on_flood = on_flood, + on_rotate = false +}) + +Everness:register_node('everness:mineral_torch_wall', { + drawtype = 'mesh', + mesh = 'everness_mineral_torch_wall.obj', + tiles = { + { name = 'everness_mineral_torch_mesh.png' }, + { + name = 'everness_mineral_torch_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 36, + aspect_h = 6, + length = 1 + }, + backface_culling = false + } + }, + use_texture_alpha = 'blend', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + light_source = 12, + groups = { + choppy = 2, + dig_immediate = 3, + flammable = 1, + not_in_creative_inventory = 1, + attached_node = 1, + torch = 1 + }, + drop = 'everness:mineral_torch', + selection_box = { + type = 'wallmounted', + wall_side = { -1 / 2, -1 / 2, -1 / 8, -1 / 8, 1 / 8, 1 / 8 }, + }, + sounds = Everness.node_sound_wood_defaults(), + floodable = true, + on_flood = on_flood, + on_rotate = false +}) + +Everness:register_node('everness:mineral_torch_ceiling', { + drawtype = 'mesh', + mesh = 'everness_mineral_torch_ceiling.obj', + tiles = { + { name = 'everness_mineral_torch_mesh.png' }, + { + name = 'everness_mineral_torch_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 36, + aspect_h = 6, + length = 1 + }, + backface_culling = false + } + }, + use_texture_alpha = 'blend', + paramtype = 'light', + paramtype2 = 'wallmounted', + sunlight_propagates = true, + walkable = false, + light_source = 12, + groups = { + choppy = 2, + dig_immediate = 3, + flammable = 1, + not_in_creative_inventory = 1, + attached_node = 1, + torch = 1 + }, + drop = 'everness:mineral_torch', + selection_box = { + type = 'wallmounted', + wall_top = { -1 / 8, -1 / 16, -5 / 16, 1 / 8, 1 / 2, 1 / 8 }, + }, + sounds = Everness.node_sound_wood_defaults(), + floodable = true, + on_flood = on_flood, + on_rotate = false +}) + +core.register_craft({ + output = 'everness:mineral_torch 16', + recipe = { + { 'everness:lotus_flower_pink' }, + { 'everness:palm_tree_wood' }, + } +}) + +core.register_craft({ + output = 'everness:mineral_torch 16', + recipe = { + { 'everness:lotus_flower_purple' }, + { 'everness:palm_tree_wood' }, + } +}) + +core.register_craft({ + output = 'everness:mineral_torch 16', + recipe = { + { 'everness:lotus_flower_white' }, + { 'everness:palm_tree_wood' }, + } +}) + +core.register_craft({ + type = 'fuel', + recipe = 'everness:mineral_torch', + burntime = 4, +}) diff --git a/mods/everness/trees.lua b/mods/everness/trees.lua new file mode 100644 index 0000000..44c39bf --- /dev/null +++ b/mods/everness/trees.lua @@ -0,0 +1,184 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +function Everness.grow_coral_tree(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_coral_tree_from_sapling.mts' + core.place_schematic({ x = pos.x - 14, y = pos.y, z = pos.z - 14 }, path, 'random', nil, false) +end + +function Everness.coral_tree_bioluminescent(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_coral_tree_bioluminescent_from_sapling.mts' + core.place_schematic({ x = pos.x - 7, y = pos.y, z = pos.z - 7 }, path, 'random', nil, false) +end + +function Everness.grow_crystal_bush(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_crystal_bush.mts' + core.place_schematic({ x = pos.x - 1, y = pos.y, z = pos.z - 1 }, + path, '0', nil, false) +end + +function Everness.grow_cursed_bush(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_cursed_bush.mts' + core.place_schematic({ x = pos.x - 1, y = pos.y, z = pos.z - 1 }, + path, '0', nil, false) +end + +function Everness.grow_baobab_tree(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_baobab_tree_from_sapling.mts' + core.place_schematic({ x = pos.x - 12, y = pos.y, z = pos.z - 12 }, + path, '0', nil, false) +end + +function Everness.grow_dry_tree(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_dry_tree_from_sapling.mts' + core.place_schematic({ x = pos.x - 3, y = pos.y, z = pos.z - 3 }, + path, 'random', nil, false) +end + +function Everness.grow_willow_tree(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_willow_tree_from_sapling.mts' + core.place_schematic({ x = pos.x - 19, y = pos.y, z = pos.z - 19 }, + path, 'random', nil, false) + + -- trigger vines + core.after(1, function(v_pos) + local size = { x = 39, y = 27, z = 39 } + local positions = core.find_nodes_in_area( + vector.round(vector.new(v_pos.x - (size.x / 2), v_pos.y, v_pos.z - (size.z / 2))), + vector.round(vector.new(v_pos.x + (size.x / 2), v_pos.y + size.y, v_pos.z + (size.z / 2))), + { 'group:vine' } + ) + + for _, vine_pos in ipairs(positions) do + Everness:tick_vine(vine_pos) + end + end, pos) +end + +function Everness.grow_sequoia_tree(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_giant_sequoia_tree_from_sapling.mts' + core.place_schematic({ x = pos.x - 12, y = pos.y, z = pos.z - 12 }, + path, 'random', nil, false) +end + +function Everness.grow_crystal_tree(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_crystal_tree.mts' + core.place_schematic({ x = pos.x - 6, y = pos.y, z = pos.z - 6 }, + path, 'random', nil, false) +end + +function Everness.grow_crystal_large_tree(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_crystal_tree_large.mts' + core.place_schematic({ x = pos.x - 10, y = pos.y, z = pos.z - 10 }, + path, 'random', nil, false) +end + +function Everness.grow_cursed_dream_tree(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_cursed_dream_tree_from_sapling.mts' + core.place_schematic({ x = pos.x - 8, y = pos.y, z = pos.z - 8 }, + path, 'random', nil, false) +end + +function Everness.grow_mese_tree(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_mese_tree.mts' + core.place_schematic({ x = pos.x - 3, y = pos.y, z = pos.z - 3 }, + path, 'random', nil, false) +end + +function Everness.grow_palm_tree(pos) + local path = core.get_modpath('everness') .. '/schematics/everness_palm_tree_from_sapling.mts' + core.place_schematic({ x = pos.x - 7, y = pos.y, z = pos.z - 7 }, + path, '0', nil, false) +end + +function Everness.grow_lava_tree(pos) + local schem_everness_lava_tree = core.read_schematic(core.get_modpath('everness') .. '/schematics/everness_lava_tree.mts', {}) + local lava_nodes = core.find_nodes_in_area_under_air( + vector.subtract(pos, 1), + vector.add(pos, 1), + { 'group:lava' } + ) + local replacements + + if #lava_nodes > 0 then + replacements = { + ['everness:lava_tree'] = 'everness:lava_tree_with_lava', + } + end + + core.place_schematic( + pos, + schem_everness_lava_tree, + 'random', + replacements, + false, + 'place_center_x, place_center_z' + ) +end + +function Everness.grow_sapling(pos, groups_under) + if not Everness.can_grow(pos, groups_under) then + -- try again 5 min later + core.get_node_timer(pos):start(300) + return + end + + local node = core.get_node(pos) + + if node.name == 'everness:coral_tree_sapling' then + core.log('action', 'A coral tree sapling grows into a tree at ' .. core.pos_to_string(pos)) + Everness.grow_coral_tree(pos) + elseif node.name == 'everness:coral_tree_bioluminescent_sapling' then + core.log('action', 'A coral tree bioluminescent sapling grows into a tree at ' .. core.pos_to_string(pos)) + Everness.coral_tree_bioluminescent(pos) + elseif node.name == 'everness:crystal_bush_sapling' then + core.log('action', 'A crystal bush sapling grows into a bush at ' .. core.pos_to_string(pos)) + Everness.grow_crystal_bush(pos) + elseif node.name == 'everness:cursed_bush_sapling' then + core.log('action', 'A cursed bush sapling grows into a bush at ' .. core.pos_to_string(pos)) + Everness.grow_cursed_bush(pos) + elseif node.name == 'everness:baobab_sapling' then + core.log('action', 'A baobab sapling grows into a tree at ' .. core.pos_to_string(pos)) + Everness.grow_baobab_tree(pos) + elseif node.name == 'everness:dry_tree_sapling' then + core.log('action', 'A dry tree sapling grows into a tree at ' .. core.pos_to_string(pos)) + Everness.grow_dry_tree(pos) + elseif node.name == 'everness:willow_tree_sapling' then + core.log('action', 'A willow tree sapling grows into a tree at ' .. core.pos_to_string(pos)) + Everness.grow_willow_tree(pos) + elseif node.name == 'everness:sequoia_tree_sapling' then + core.log('action', 'A sequoia tree sapling grows into a tree at ' .. core.pos_to_string(pos)) + Everness.grow_sequoia_tree(pos) + elseif node.name == 'everness:crystal_tree_sapling' then + core.log('action', 'A crystal tree sapling grows into a tree at ' .. core.pos_to_string(pos)) + Everness.grow_crystal_tree(pos) + elseif node.name == 'everness:crystal_tree_large_sapling' then + core.log('action', 'A crystal tree large sapling grows into a tree at ' .. core.pos_to_string(pos)) + Everness.grow_crystal_large_tree(pos) + elseif node.name == 'everness:cursed_dream_tree_sapling' then + core.log('action', 'A cursed dream tree large sapling grows into a tree at ' .. core.pos_to_string(pos)) + Everness.grow_cursed_dream_tree(pos) + elseif node.name == 'everness:mese_tree_sapling' then + core.log('action', 'A mese tree sapling grows into a tree at ' .. core.pos_to_string(pos)) + Everness.grow_mese_tree(pos) + elseif node.name == 'everness:palm_tree_sapling' then + core.log('action', 'A palm tree sapling grows into a tree at ' .. core.pos_to_string(pos)) + Everness.grow_palm_tree(pos) + elseif node.name == 'everness:lava_tree_sapling' then + core.log('action', 'A lava tree sapling grows into a tree at ' .. core.pos_to_string(pos)) + Everness.grow_lava_tree(pos) + end +end diff --git a/mods/everness/vines.lua b/mods/everness/vines.lua new file mode 100644 index 0000000..be17e75 --- /dev/null +++ b/mods/everness/vines.lua @@ -0,0 +1,332 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +local function register_vine(name, def, overrides) + local _overrides = overrides and table.copy(overrides) or {} + local _def = table.copy(def) + local _name = name + + _def.walkable = false + _def.climbable = true + _def.sunlight_propagates = true + _def.paramtype = 'light' + _def.buildable_to = false + _def.drawtype = 'plantlike' + _def.paramtype2 = 'meshoptions' + _def.place_param2 = 8 + _def.visual_scale = 1.1 + _def.light_source = 7 + _def.selection_box = def.selection_box or { + type = 'fixed', + fixed = { -4 / 16, -8 / 16, -4 / 16, 4 / 16, 8 / 16, 4 / 16 } + } + _def.groups = { + -- MTG + vine = 1, + snappy = 3, + -- Everness + falling_vines = 1, + no_silktouch = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + axey = 1, + shearsy = 1, + swordy = 1, + deco_block = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + fire_encouragement = 15, + fire_flammability = 100, + -- ALL + flammable = 2, + } + + if _overrides.groups then + Everness.mergeTables(_def.groups, _overrides.groups) + end + + -- MCL + _def._mcl_shears_drop = true + _def._mcl_blast_resistance = 0.2 + _def._mcl_hardness = 0.2 + _def.on_rotate = function() + return false + end + _def.sounds = Everness.node_sound_leaves_defaults() + _def.waving = 1 + _def.on_destruct = function(pos) + local pos_below = vector.new(pos.x, pos.y - 1, pos.z) + local node_below = core.get_node(pos_below) + + if core.get_item_group(node_below.name, 'vine') > 0 then + core.remove_node(pos_below) + end + end + _def.after_dig_node = function(pos, oldnode, oldmetadata, digger) + local pos_above = vector.new(pos.x, pos.y + 1, pos.z) + Everness:tick_vine(pos_above) + end + _def.on_construct = function(pos) + Everness:tick_vine(pos) + end + + local grow_vine_node_names = {} + local grow_vine_end_node_name = '' + + for i = 1, 3 do + local _d = table.copy(_def) + local _n = _name + local first = i == 1 + local last = i == 3 + + if last then + -- end + _n = _n .. '_end' + _d.groups.vine_end = 1 + grow_vine_end_node_name = 'everness:' .. _n + _d.tiles = { 'everness_' .. _n .. '.png' } + _d.wield_image = 'everness_' .. _n .. '.png' + _d.inventory_image = 'everness_' .. _n .. '.png' + + _d.drop = { + max_items = 1, + items = { + { + tool_groups = { 'vine_shears' }, + items = { 'everness:' .. _n } + } + } + } + + if _overrides.last_def then + -- custom, not 'plantlike' drawtype + for k, v in pairs(_overrides.last_def) do + _d[k] = v + end + + if not _overrides.last_def.place_param2 then + _d.place_param2 = nil + end + end + else + -- 1, 2.. + _n = _n .. '_' .. i + _d.tiles = { 'everness_' .. _n .. '.png' } + _d.wield_image = 'everness_' .. _n .. '.png' + _d.inventory_image = 'everness_' .. _n .. '.png' + + _d.drop = { + max_items = 1, + items = { + { + tool_groups = { 'vine_shears' }, + items = { 'everness:' .. _n } + } + } + } + + table.insert(grow_vine_node_names, 'everness:' .. _n) + end + + if not first then + -- 2.., end + _d.light_source = 12 + end + + _d.on_timer = function(pos, elapsed) + Everness:grow_vine(pos, elapsed, { + node_names = grow_vine_node_names, + end_node_name = grow_vine_end_node_name, + end_node_param2 = _overrides.end_node_param2 and _overrides.end_node_param2 or nil + }) + end + + Everness:register_node('everness:' .. _n, _d) + end +end + +-- Cave vine + +register_vine('vine_cave', { + description = S('Cave Vine') +}) + +core.register_alias('everness:vine_cave', 'everness:vine_cave_1') +core.register_alias('everness:vine_cave_with_mese_leaves', 'everness:vine_cave_2') + +-- Whispering Gourd Vine + +register_vine('whispering_gourd_vine', { + description = S('Whispering Gourd Vine') +}) + +-- Bulb Vine + +register_vine('bulb_vine', { + description = S('Bulb Vine') +}) + +-- Willow Vine + +register_vine('willow_vine', { + description = S('Willow Vine') +}, { + groups = { + falling_vines = 0 + } +}) + +-- Eye Vine + +register_vine('eye_vine', + { + description = S('Eye Vine'), + }, + { + end_node_param2 = 0, + last_def = { + tiles = { + 'everness_eye_vine_end_top.png', + 'everness_eye_vine_end_bottom.png', + 'everness_eye_vine_end_side.png', + }, + wield_image = 'everness_eye_vine_end_bottom.png', + inventory_image = 'everness_eye_vine_end_bottom.png', + drawtype = 'normal', + paramtype2 = 'facedir', + sunlight_propagates = false, + visual_scale = 1, + selection_box = { + type = 'fixed', + fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + drop = { + max_items = 1, + items = { + { + tool_groups = { 'vine_shears' }, + items = { 'everness:eye_vine_lantern' } + } + } + } + } + } +) + +-- Lumabus Vine + +register_vine('lumabus_vine', + { + description = S('Lumabus Vine') + }, + { + end_node_param2 = 0, + last_def = { + tiles = { + 'everness_lumabus_bulb_purple.png', + { + name = 'everness_lumabus_leaves.png', + backface_culling = false + } + }, + use_texture_alpha = 'clip', + drawtype = 'mesh', + mesh = 'everness_lumabus.obj', + paramtype2 = 'wallmounted', + sunlight_propagates = false, + visual_scale = 1, + selection_box = { + type = 'fixed', + fixed = { + -1 / 2 + 3 / 16, + -1 / 2, + -1 / 2 + 3 / 16, + 1 / 2 - 3 / 16, + 1 / 2 - 6 / 16, + 1 / 2 - 3 / 16 + } + }, + drop = { + max_items = 1, + items = { + { + tool_groups = { 'vine_shears' }, + items = { 'everness:lumabus_vine_lantern' } + } + } + } + }, + } +) + +-- Ivis Vine + +register_vine('ivis_vine', { + description = S('Ivis Vine') +}) + +-- Flowered vine + +register_vine('flowered_vine', { + description = S('Flowered Vine') +}) + +-- Reeds vine + +register_vine('reeds_vine', { + description = S('Reeds Vine') +}) + +-- Tenanea Flowers vine + +register_vine('tenanea_flowers_vine', { + description = S('Tenanea Flowers Vine') +}) + +-- Twisted vine + +register_vine('twisted_vine', { + description = S('Twisted Vine') +}) + +-- Golden vine + +register_vine('golden_vine', { + description = S('Golden Vine') +}) + +-- Dense vine + +register_vine('dense_vine', { + description = S('Dense Vine') +}) + +-- LBMs + +Everness:register_lbm({ + label = 'Grows vines', + name = 'everness:vines', + nodenames = { 'group:vine' }, + run_at_every_load = true, + action = function(pos, node) + Everness:tick_vine(pos) + end, +}) diff --git a/mods/everness/vines_wall.lua b/mods/everness/vines_wall.lua new file mode 100644 index 0000000..b854c35 --- /dev/null +++ b/mods/everness/vines_wall.lua @@ -0,0 +1,113 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +local function register_vine_wall(name, def, overrides) + local _def = table.copy(def) + local _name = name + + _def.short_description = _def.short_description or _def.description + _def.drawtype = 'mesh' + _def.tiles = _def.tiles or { + { name = 'everness_' .. _name .. '.png' } + } + _def.inventory_image = 'everness_' .. _name .. '_item.png' + _def.wield_image = 'everness_' .. _name .. '_item.png' + _def.mesh = 'everness_vine_wall.obj' + _def.use_texture_alpha = 'clip' + _def.paramtype = 'light' + _def.paramtype2 = 'wallmounted' + _def.sunlight_propagates = true + _def.walkable = false + _def.climbable = true + _def.buildable_to = false + _def.sounds = Everness.node_sound_leaves_defaults() + _def.groups = { + -- MTG + vine = 1, + snappy = 3, + -- Everness + -- falling_vines = 1, + no_silktouch = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + axey = 1, + shearsy = 1, + swordy = 1, + deco_block = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + fire_encouragement = 15, + fire_flammability = 100, + -- ALL + flammable = 2, + attached_node = 1, + } + _def._mcl_blast_resistance = 0.2 + _def._mcl_hardness = 0.2 + _def.selection_box = { + type = 'fixed', + fixed = { + -8 / 16, + -8 / 16, + -8 / 16, + 8 / 16, + -5 / 16, + 8 / 16 + } + } + _def.collision_box = { + type = 'fixed', + fixed = { + -8 / 16, + -8 / 16, + -8 / 16, + 8 / 16, + -5 / 16, + 8 / 16 + } + } + _def.waving = 3 + _def.light_source = _def.light_source or 4 + + _def.on_rotate = function() + return false + end + + Everness:register_node('everness:' .. _name, _def) +end + +-- Cave vine + +-- register_vine_wall('wall_vine_cave_green', { +-- description = S('Wall Cave Vine Green'), +-- }) + +register_vine_wall('wall_vine_cave_blue', { + description = S('Wall Cave Vine Blue'), +}) + +register_vine_wall('wall_vine_cave_cyan', { + description = S('Wall Cave Vine Cyan'), +}) + +register_vine_wall('wall_vine_cave_violet', { + description = S('Wall Cave Vine Violet'), +}) diff --git a/mods/everness/walls.lua b/mods/everness/walls.lua new file mode 100644 index 0000000..ee36df8 --- /dev/null +++ b/mods/everness/walls.lua @@ -0,0 +1,302 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2025 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = core.get_translator(core.get_current_modname()) + +walls.register( + 'everness:coral_desert_cobble_wall', + S('Coral Cobblestone Wall'), + { 'everness_coral_desert_cobble.png' }, + 'everness:coral_desert_cobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:coral_desert_mossy_cobble_wall', + S('Coral Mossy Cobblestone Wall'), + { 'everness_coral_desert_mossy_cobble.png' }, + 'everness:coral_desert_mossy_cobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:cursed_brick_wall', + S('Cursed Brick Wall'), + { 'everness_cursed_brick.png' }, + 'everness:cursed_brick', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:cursed_brick_with_growth_wall', + S('Cursed Brick with Growth Wall'), + { 'everness_cursed_brick_with_growth.png' }, + 'everness:cursed_brick_with_growth', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_tundra_cobble_wall', + S('Forsaken Tundra Cobblestone Wall'), + { 'everness_forsaken_tundra_cobblestone.png' }, + 'everness:forsaken_tundra_cobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_tundra_stone_wall', + S('Forsaken Tundra Stone Wall'), + { 'everness_forsaken_tundra_stone.png' }, + 'everness:forsaken_tundra_stone', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_tundra_brick_wall', + S('Forsaken Tundra Brick Wall'), + { 'everness_forsaken_tundra_brick.png' }, + 'everness:forsaken_tundra_brick', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:magmacobble_wall', + S('Magma Cobblestone Wall'), + { + { + name = 'everness_magmacobble_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + 'everness:magmacobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:volcanic_rock_wall', + S('Volcanic Rock Wall'), + { 'everness_volcanic_rock.png' }, + 'everness:volcanic_rock', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:volcanic_rock_with_magma_wall', + S('Volcanic Rock with Magma Wall'), + { + { + name = 'everness_volcanic_rock_with_magma_animated.png', + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + 'everness:volcanic_rock_with_magma', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:coral_bones_block_wall', + S('Coral Bones Block Wall'), + { 'everness_coral_bones_block.png' }, + 'everness:coral_bones_block', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:coral_bones_brick_wall', + S('Coral Bones Brick Wall'), + { 'everness_coral_bones_brick.png' }, + 'everness:coral_bones_brick', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:coral_deep_ocean_sandstone_brick_wall', + S('Coral Bones Brick Wall'), + { 'everness_deep_ocean_sandstone_brick.png' }, + 'everness:coral_deep_ocean_sandstone_brick', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:coral_deep_ocean_sandstone_block_wall', + S('Coral Bones Brick Wall'), + { 'everness_deep_ocean_sandstone_block.png' }, + 'everness:coral_deep_ocean_sandstone_block', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:crystal_cobble_wall', + S('Crystal Cobblestone Wall'), + { 'everness_crystal_cobble.png' }, + 'everness:crystal_cobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:crystal_mossy_cobble_wall', + S('Crystal Mossy Cobblestone Wall'), + { 'everness_crystal_mossy_cobble.png' }, + 'everness:crystal_mossy_cobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:cursed_sandstone_brick_wall', + S('Cursed Sandstone Brick Wall'), + { 'everness_cursed_sandstone_brick.png' }, + 'everness:cursed_sandstone_brick', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:cursed_sandstone_block_wall', + S('Cursed Sandstone Block Wall'), + { 'everness_cursed_sandstone_block.png' }, + 'everness:cursed_sandstone_block', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:cursed_stone_carved_wall', + S('Cursed Stone Carved Wall'), + { + { + name = 'everness_cursed_stone_carved.png', + align_style = 'world', + scale = 2 + } + }, + 'everness:cursed_stone_carved', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_desert_cobble_wall', + S('Forsaken Desert Cobblestone Wall'), + { 'everness_forsaken_desert_cobble.png' }, + 'everness:forsaken_desert_cobble', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_desert_cobble_red_wall', + S('Forsaken Desert Cobblestone Red Wall'), + { 'everness_forsaken_desert_cobble_red.png' }, + 'everness:forsaken_desert_cobble_red', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_desert_brick_wall', + S('Forsaken Desert Brick Wall'), + { 'everness_forsaken_desert_brick.png' }, + 'everness:forsaken_desert_brick', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_desert_brick_red_wall', + S('Forsaken Desert Brick Red Wall'), + { 'everness_forsaken_desert_brick_red.png' }, + 'everness:forsaken_desert_brick_red', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_desert_chiseled_stone_wall', + S('Forsaken Desert Chiseled Stone'), + { + 'everness_forsaken_desert_chiseled_stone_top.png', + 'everness_forsaken_desert_chiseled_stone_bottom.png', + 'everness_forsaken_desert_chiseled_stone_side.png' + }, + 'everness:forsaken_desert_chiseled_stone', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:forsaken_desert_engraved_stone_wall', + S('Forsaken Desert Engraved Stone Wall'), + { 'everness_forsaken_desert_engraved_stone.png' }, + 'everness:forsaken_desert_engraved_stone', + Everness.node_sound_stone_defaults() +) + +-- Mineral Waters Under +walls.register( + 'everness:mineral_cave_stone_wall', + S('Mineral Cave Stone Wall'), + {{ + name = 'everness_mineral_stone_under.png', + align_style = 'world', + scale = 2 + }}, + 'everness:mineral_cave_stone', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:mineral_cave_cobblestone_wall', + S('Mineral Cave Cobblestone Wall'), + {{ + name = 'everness_mineral_cobblestone_under.png', + align_style = 'world', + scale = 2 + }}, + 'everness:mineral_cave_cobblestone', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:mineral_lava_stone_wall', + S('Mineral Lava Stone with lava Wall'), + {{ + name = 'everness_mineral_lava_stone_animated.png', + align_style = 'world', + scale = 2, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6.4, + }, + }}, + 'everness:mineral_lava_stone', + Everness.node_sound_stone_defaults() +) + +walls.register( + 'everness:mineral_lava_stone_dry_wall', + S('Mineral Lava Stone without lava Wall'), + {{ + name = 'everness_mineral_lava_stone_bottom.png', + align_style = 'world', + scale = 2 + }}, + 'everness:mineral_lava_stone_dry', + Everness.node_sound_stone_defaults() +) diff --git a/mods/xdecor/.luacheckrc b/mods/xdecor/.luacheckrc new file mode 100644 index 0000000..45fb59f --- /dev/null +++ b/mods/xdecor/.luacheckrc @@ -0,0 +1,14 @@ +allow_defined_top = true + +read_globals = { + "minetest", + "vector", "ItemStack", + "default", + "stairs", "doors", "xpanes", + "xdecor", + table = {fields = {"copy"}}, + string = {fields = {"split"}}, + "unpack", + "stairsplus", + "mesecon" +} diff --git a/mods/xdecor/API.md b/mods/xdecor/API.md new file mode 100644 index 0000000..49dfdb3 --- /dev/null +++ b/mods/xdecor/API.md @@ -0,0 +1,154 @@ +# API for X-Decor-libre + +X-Decor-libre is mostly self-contained but it allows for limited extension with +a simple API. Not that extensibility is not the main goal of this mod. + +The function documentation can be found in the respective source code files +under the header "--[[ API FUNCTIONS ]]". + +These are the features: + +## Add custom tool enchantments + +You can register tools to be able to be enchanted at the enchanting table. + +See `src/enchanting.lua` for details. + +## Add custom hammers + +You can add a custom hammer for repairing tools at the workbench, +using custom stats. + +See `src/workbench.lua` for details. + +## Add cut nodes + +You can register "cut" node variants of an existing node which can +be created at the workbench. +This will add thin stairs, half stairs, panels, microcubes, etc. + +See `src/workbench.lua` for details. + +## Cauldron compatibility + +The cauldron needs to interact with various items and nodes to +work properly. It uses ingredients and bowls for soup, and +fire nodes to get heated. + +If your mod adds fire or hot nodes, bowls or food, this section +is relevant for you. + +### Soup ingredients + +The cauldron soup accepts a variety of food items as ingredients for the soup. +It uses a heuristic to determine which items it accepts as ingredient. + +This heuristic may sometimes fail and recognize strange items as ingredient. +To explicitly mark any item as a soup ingredient for xdecor, add the group +`xdecor_soup_ingredient = 1` to it. To explicitly tell xdecor that an item +is NOT a soup ingredient, use `xdecor_soup_ingredient = -1` instead. +The `-1` should only be used if actually necessary. + +#### Information about the heuristic + +Any item without a valid `xdecor_soup_ingredient` group will be checked +by against a heuristic to determine if it counts as a soup +ingredient or not. Items that do have this group with a valid +value are not subject to the heuristic. + +First, the heuristic checks if the item is 'eatable'. This basically +checks if the function `core.item_eat` or (`minetest.item_eat`) is called. +If the item is eatable, it counts as ingredient. + +If not, then the heuristic looks at the part of the technical itemname after +the colon for certain keywords like 'apple', 'meat', 'potato' etc. +(for the full list, see `ingredients_list` in `src/cooking.lua`). +If a keyword was found, the item counts as an ingredient, otherwise not. + +There is also a small blacklist that disqualifies a few items +from Minetest Game. + +### Heater nodes + +Cauldrons need a fire below to get heated. All nodes with the group `fire` +or `xdecor_cauldron_heater=1` will heat up the cauldron. You can use the latter +group if adding the `fire` group would create problems. + +### Bowls + +Players can use the `xdecor:bowl` item to collect soup from a cauldron. +But other mods also have their own bowls which may not be recognized by +X-Decor-libre. + +The following items are recognized as bowls that can collect soup from +the cauldron: + +* Items with group `xdecor_soup_bowl=1` (recommended) +* `farming:bowl` (hardcoded) +* `x_farming:bowl` (hardcoded) + +If you want to make your bowl compatible with the cauldron, add the group +`xdecor_soup_bowl=1` to it. **Only use this for empty bowls!** + +**Please test your bowl!** + +When any valid bowl is used at the cauldron, it turns into `xdecor:bowl_soup`. +If the soup is eaten, the item will become the original bowl again, even +if it was a custom bowl. +For custom bowls (not from X-Decor-libre), the `xdecor:bowl_soup` item +remembers the name of the original bowl in the metadata under +`original_bowl`. If `original_bowl` is the empty string, or contains the +name of an unknown item, `xdecor:bowl` is the assumed default. +(However, an unknown item in `original_bowl` will trigger a warning.) + + +## Custom Chess bot (experimental) + +You can replace the (very weak) Chess computer player with a custom one. +See `src/chess.lua` for details (`realchess.set_chessbot`). + +Note this feature is relatively experimental, but it has survived +first initial tests. + +## Groups + +This mod introduces the following groups: + +* `potted_flower=1`: Potted flower +* `food_bowl=1`: Empty bowl +* `lever=X`: Lever (1 = off, 2 = on) +* `pressure_plate=X`: Pressure plate (1 = off, 2 = on) +* `cauldron=X`: Cauldron + * `1`: Empty cauldron + * `2`: Cauldron with cold liquid + * `3`: Cauldron with boiling liquid +* `xdecor_cut=1`: For nodes cut by the workbench (not the normal slab, normal stair, inner or outer stair). + Cut nodes will also receive one of the following groups to specify the shape: + * `xdecor_cut_microslab=1`: Microslab + * `xdecor_cut_nanoslab=1`: Nanoslab + * `xdecor_cut_panel=1`: Panel + * `xdecor_cut_doublepanel=1`: Double panel + * `xdecor_cut_micropanel=1`: Micropanel + * `xdecor_cut_cube=1`: Cube + * `xdecor_cut_halfstair=1`: Half stair + * `xdecor_cut_thinstair=1`: Thin stair +* `not_cuttable=1`: Prevent this node from being cut by the workbench +* `repair_hammer=1`: A hammer that repairs tools (do not add this group manually, see `src/workbench.lua`) +* `chess_piece=X`: Chess piece for Chess (see `src/chess.lua` for details) +* `enchanted_tool=1`: Enchanted tool + * `enchantment_durable=1`: Enchanted tool with Durability enchantment + * `enchantment_fast=1`: Enchanted tool with Efficiency enchantment + * `enchantment_sharp=1`: Enchanted tool with Sharpness enchantment + +These groups are for cauldron features (please read the “Cauldron compatibility” +section above before using them): + +* `xdecor_soup_ingredient=1`: Add this item as a possible soup ingredient +* `xdecor_soup_ingredient=-1`: Exclude this item as a possible soup ingredient +* `xdecor_cauldron_heater=1`: If placed below cauldron, it will heat it up +* `xdecor_soup_bowl=1`: A bowl that can collect soup from the cauldron + +These groups are reserved for internal use: + +* `xdecor_actuator=X`: A node that can turned on and off and toggles neighboring doors. 1 = off, 2 = on. Used by lever and pressure plate +* `sittable=1`: Player can sit down on this node (also needs to call `xdecor.sit` to function) diff --git a/mods/xdecor/CHESS_README.md b/mods/xdecor/CHESS_README.md new file mode 100644 index 0000000..8956b57 --- /dev/null +++ b/mods/xdecor/CHESS_README.md @@ -0,0 +1,550 @@ +# Chess + +## Introduction + +You can play Chess in X-Decor-libre! + +While the game of Chess is well-known and widespread and its +rules are well-documented all over the Internet and elsewhere, +the devil still lies in the detail. + +In X-Decor-libre, the game of Chess is closely modeled after +the FIDE Laws of Chess from January 2023. However, for a +computer version of Chess, there are still some details +that might need explanation. + + + +## Objective + +Chess is played between two players on a chessboard. One player plays +with white pieces while the other one plays with black pieces. +The goal of the game is to put the king of the opponent under attack +in such a way they have no legal move. This is known as ‘checkmate’. +It is not allowed to put one’s king in danger, to leave him in danger +or to capture the opponent’s king. + +## How to play + +You need a chessboard to play. Craft yourself a chessboard like this: + + BWB + sss + +* B = Black Dye +* W = White Dye +* s = Wooden Slab (from apple tree) + +Place the chessboard and examine it. You will see a close-up of the chessboard. + +### The Chess interface + +On the screen that pops up, you can choose to play against the +computer (Singleplayer) or another player on the server (Multiplayer). +You may also use the multiplayer option to play against yourself. +The computer player is quite weak. + +Click on the corresponding button to start the game. + +Once the game has started, you see the following things: + +To the left, the large chessboard consisting of 8×8 dark and white squares. +The pieces are put on the chessboard. If there is no active game, +the chessboard is empty. + +During a game, the interface has the following meaning: + +Above and below the chessboard, plaques show the name of the players. +Above the chessboard is the player playing Black and below it +the player playing White. +An arrow left of the plaque shows whose turn it is. The name plaques +may also show the “game status”, such as victory, checkmate (=loss), +draw, being “in check”, etc. + +On the right side, a list of moves that have been made is shown. +It is written in a figurine long algebraic notation (see appendix). + +The two boxes below the list of moves is where all the captured pieces +go. This has no gameplay significance but it may serve as a visual +aid to see how badly hurt the player’s “armies” are. + +The top right corner is used for starting a new game. Press +“New Game” to start a new game. This ends the current game. + +The bottom right corner right corner is used for special +player actions, such as resigning or claiming a draw. + +Note that during a game, the buttons only work for the two players +playing Chess. They don’t work for anyone else. + +## The rules of Chess + +### Starting a game + +Select Singleplayer or Multiplayer. In Singleplayer, you choose +the color you play as by clicking the corresponding button. + +White always plays first. + +In multiplayer, anyone can make the first move. +The player making the first move as White will play as White, +the player making the first move as Black will play as Black. +After that, the players are “locked” to their colors and +nobody else can play as White or Black. + +### The chessboard + +The chessboard is a board of 8×8 squares alternating between light +and dark squares. Each square is either empty or holds exactly one +chess piece. + +### The Chess pieces and how they move + +Each player starts with the same pieces on opposing sides of the board, +only their color is different. + +There are 4 types of moves you can make: + +* Normal move: You pick up the piece and place it to an empty square +* Capturing move: You pick up the piece and place it on top of an opposing piece + Your piece will land on that square and the opponent’s piece is removed +* En passant: Special capturing move of the pawn (see below) +* Castling: Special king+rook move (see below) + +It is not possible to place your piece on your own pieces. +It is not possible to capture a king or your own pieces. +Any square on which a piece could capture another piece in theory +(even if it is actually empty) is considered to be “attacked”. + +For most pieces, the rules for making a normal move and +a capturing move are identical. Only for the pawn it is different +(read below). + +If the square of the king is attacked, he and the player playing him +is considered to be in “check”. +While a player is in check, any move which would leave their own +king under attack is not allowed. + +#### How to actually move + +Each move can be made by clicking on the piece to pick it up and then +clicking again on the destination. The destination is either an empty +square or a square occupied by an opponent’s piece (which will be captured). +You can also do the same via drag-and-drop. + +Once you made a valid move by placing the piece to its destination, it is +final and cannot be taken back. This ends your move and it’s your +opponent’s turn (exception: promotion, see below). + +If you pick up a piece and put it back, nothing happens, it is still +your turn and you can still do your move normally. Also, if you try +to make an invalid move, nothing happens as well. + +(Nerd info: For the purposes of the FIDE Laws of Chess, pieces are never +considered “touched” here. Thus, article 4 of the FIDE Laws of Chess has +no effect.) + +#### Rook + +The rook looks like a tower and can move to any of square that lies +in a straight horizontal or vertical line from it. +It cannot move beyond pieces that are in the way. + +The rook may be involved in Castling, see “King” below. + +#### Bishop + +The bishop can move to any square on a diagonal line from it. +It cannot move beyond pieces that are in the way. + +#### Queen + +The queen combines the powers of the rook and bishop and can +move to any square in a straight horizontal, vertical +or diagonal line from it. +It cannot move beyond pieces that are in the way. + +#### Knight + +The knight looks like a horse and can move to any square closest to +it that is not in its same horizontal line (also known as “rank”), +vertical line (also known as “file”), or diagonal of the board. +To illustrate this: + + ..X.X.. + .X...X. + ...n... + .X...X. + ..X.X.. + +In this diagram, “n” represents the knight and the Xes are all the +possible squares it can theoretically reach. The dots are empty +squares. + +Unlike the other pieces, pieces are never “in the way” of the knight. +You might say the knight can “jump over” other pieces. + +#### King + +The king can move exactly one square in any direction: horizontally, +vertically or diagonally. However, the king can never move to any square that +is attacked by an opponent’s piece. + +The king also has a special move called “Castling”. + +##### Castling + +Castling is a special move in which two pieces move at once. +Both the king and a rook move horizontally from their starting positions. +The king will move two squares horizontally and a rook will be +moved next to him. + +Each player has two possible castling moves available, involving each +of the 2 starting rooks. + +Castling has several conditions: + +- The king must not have moved yet +- The rook you wish to castle with must not have moved yet +- All of the squares between king and rook must be empty +- The king must not be under attack +- The king’s destination as well the square it crosses must not be under attack +- You can castle only horizontally + +If all the conditions are met, here’s how you castle: + +Place the king two squares towards the rook you want to castle with. +This square is where the king will end up. The rook will then +automatically move towards the king and “jump” to the square +behind the king, from the rook’s viewpoint. + +**Remember**: You *must* move the king (not the rook) if you want +to castle. If you move the rook instead, this is considered +to be a regular move of the rook alone. + +#### Pawn + +The pawn has various ways to move. +The pawn has a “walking direction”, it walks and captures towards +the opponent’s side (i.e. the side on which the opponent’s +pieces have started). + +The pawn’s basic moves are: + +1. Single step: The pawn moves one step vertically towards the + opponent’s side. +2. Double step: Like a single step, but it moves two squares instead. + This is only possible from the pawn’s start position. + +A pawn can never move backwards. + +In both cases, the destination square must be empty as well as any crossed square. +The pawn cannot capture by doing a single or double step, however. + +The capturing move of the pawn is different. To capture, the pawn has to +move one step diagonally towards the opponent’s side, either left or right. + +To illustrate, in the following diagram, the X’es represent the +squares attacked by a white pawn (w) and a black pawn (b): + + .X.X..b.. + ..w..X.X. + +##### En passant capture + +An en passant capture is a pawn move that is available if a pawn +of the current player stands on a square left or right from an +opposing pawn that has made a double step in the previous move. + +In this situation, the first pawn may move as if the second pawn +had made a single step instead. This will be considered as a +capturing move and the opposing pawn will be removed from the board. + + +Consider this example: Here, “w” represents a white pawn in its starting +position, “b” a black pawn and “.” an empty square. White moves upwards +and Black downwards. Consider this starting position: + + b. + .. + .w + +Now, White does a double step: + + bw + .. + .. + +Black decides to do an en passant capture. For this, the black pawn moves one +diagonal step towards the square just crossed by the opponent. The white +pawn is captured and removed. + + .. + .b + .. + +Remember! An ‘en passant’ capture is only possible in the move directly after +a pawn’s double step. So if the chance for a particular en passant capture +is not taken, it will be gone from that point on. + +##### Promotion + +When a pawn reaches the other end of the chessboard (from its viewpoint), +it will be promoted. A promotion is considered to be part of the move. + +When promotion happens, the boxes where normally the captured pieces go +will turn into a prompt. The current player must choose a new +piece to replace the pawn with: +A queen, rook, bishop or knight of the same color. +Just click the corresponding button. These buttons only work for the +current player. Promotion is mandatory and no other moves are possible +until it is completed. + +Once a piece was selected, the pawn will be replaced, which +immediately activates its powers. This ends the move. + +### The end of the game + +There are various ways for the game of Chess to end. A game always +ends in victory of one player, or in a draw. + +#### Checkmate +Checkmating your opponent is the primary goal of Chess. +The player who has checkmated the opponent king wins the game and ends it. + +You are checkmated when it’s your turn, your own king is in check +(i.e. under attack) and you have no valid move available. +This immediately ends the game and your opponent wins. + +#### Stalemate +If it’s a player’s turn, but they have no possible move and their +king is not in check, the game immediately ends in a draw. +This is called a “stalemate”. + +#### Resign +During the game, the possibility of resigning arises. Resigning +basically means “giving up” and this leads to an instant loss +and the victory of your opponent. +Resigning is available after one’s name has been recorded on +the name plaque. Resigning is possible even when it’s not your turn. + +To resign, click the skull icon in the bottom right. + +#### Dead position +If during the game, on the board there are only the following pieces left, +the game ends in a draw: + +* king versus king +* king versus king and bishop +* king versus king and knight +* king and bishop versus king and bishop, and both bishops stand on squares of the same color + +This is called a “dead position”. For example, a board with only a white +and a black king is a draw. + +(Nerd info: In Chess, any position from which neither player can give +checkmate is known as a dead position. But in X-Decor-libre, only the +situations listed above lead to an instant draw. + +This deviates from the FIDE Laws of Chess, article 5.2.2, +which states that *any* dead position must end the game immediately +in a draw. + +X-Decor-libre deviates from the FIDE Laws of Chess here because of +performance; calculating if any given position is ‘dead’ is +computationally expensive. + +Dead positions are still guaranteed to end the game in X-Decor-libre +eventually due to the 75-move rule.) + +#### 75-move rule +If in the last 75 consecutive moves of each player, no piece was captured +and no pawn was moved, the game ends in a draw. + +Exception: If the last move has lead to a checkmate. In this case, checkmate +takes precedence. + +#### 50-move rule +If in the last 50 consecutive moves of each player, no piece was +captured and no pawn was moved, the player whose turn it is can invoke +the 50-move rule to draw the game instantly. + +When it’s your turn, and you believe your *next* move will satisfy +the condition of the 50-move rule, you may also invoke this rule +to draw the game, but in this case, you still have to make the move. +If this move satisfies the 50-move rule, the game is drawn. +But if not, this counts as a normal move, your turn ends and the +game continues as normal. + +A button on the bottom right will appear when this rule is available. +The button is not shown when there are too few such moves for this +draw claim to be successful. + +The icon represents a barricade, as if the game of Chess itself +has been blocked. This one will instantly draw the game. +If you still would have to make the game-drawing move, the +icon represents half a barricade. +Note the tooltip. + +Note the latter icon is no guarantee you can actually draw the +game in the next move, only that such a draw claim is plausible. + +#### Fivefold repetition rule +If the current position on the chessboard has appeared at least 5 times, +the game ends in a draw. + +Two positions are considered to be the same if the chessboard has the +same pieces of the same color on the same squares, it is the same +player’s turn, the castling rights of both players are the same and +the vulnerability of pawns to en passant captures (if any) is also +the same. + +A pawn is considered “vulnerable” to an en passant capture immediately +after a double step turn, no matter if it is actually in danger of +being captured that way. + +#### Threefold repetition rule +If the current position has appeared at least 3 times in the game, +the current player can invoke the threefold repetition rule to draw +the game instantly. + +This rule can also be invoked when you think your *next* move will +lead to the 3rd (or more) repeated position in the game. This +works similar as for the 50-move rule. + +Like for the 50-move rule, a button appears on the bottom right +once this rule can be invoked. + +If the 3 same positions have already occurred, the icon will +represent 3 chess squares stacked on top of each other. +If the game-drawing move still has to be made, the top +square is a “ghost square”. + +#### No agreeing to draw + +Unlike in other Chess programs, the players cannot agree to draw. + +#### Game result + +Once the game has ended, the game result is shown on the name plaques of the +players as well in chat (to the players only). From this point on, everyone +(even spectators) can start a new game with “New Game”. + + +## Resetting the chessboard + +While a game of Chess is ongoing, the chessboard can’t be dug and the game +can’t be stopped by other players. But to prevent two players blocking a +chessboard forever, there is a 5-minute timer. If no player makes a move +for 5 minutes, then the chessboard can be reset and dug by anyone. + +Exception: Players with the `protection_bypass` privilege can always +dig the chessboard. + + +## Appendix + +### The Chess Notation + +The chessboard interface shows a list of all moves on the right side. + +The list of moves is written in a special notation called “algebraic notation”. +There are many variants of it, so this section explains what it means in X-Decor-libre. + +This mod uses a longform figurine algebraic notation. “figurine” means that +icons are used for the chess pieces. “longform” means the start +and end coordinates are shown in full. + +Square coordinates are important in any Chess notation. In algebraic notation, +each square is assigned coordinates with a letter from a to h, +followed by a number from 1 to 8. +Provided that the player playing White is on the “bottom” side of the chessboard, +the squares are numbered from the bottom left square in ascending order. +The horizontal lines (“ranks”) are numbered 1 to 8, starting from the bottom. +The vertical lines (“files”) are numbered a to h, starting from the left. +So from White’s viewpoint, the bottom-left square is a1. The square above it +is a2, then a3, a4, ... a8. The square right of a1 is b1, then c1, d1, ... h1. +The top-right square is h8. + +(Note that on a real chessboard, all of the coordinates are flipped from Black’s viewpoint +because the board is rotated 180° from their view. In X-Decor-libre, this does not +matter because the board is always aligned the same way.) + +In the list of moves, each line shows 3 things: Move number, white’s move, black’s move (if made). +The move number is a simple counter that increases after each move of *both* players, starting by 1. + +In the notation, a move by a single player is called a “halfmove”. The two moves +of each White and then Black are called a “fullmove”. + +#### Normal moves + +Normally, a halfmove is written like this, in this order: + +1. Symbol of moved piece (called “figurine”) +2. Start coordinates, a dash or cross, destination coordinates +3. “e.p.”, if it was an en passant capture -OR- symbol of piece to which a pawn was promoted to + +For number 1, the symbol is only shown if the piece is not a pawn. +For number 2, the syntax for normal moves is like: “a1–a2”. This means the piece was moved from a1 to a2. +The dash means it was a normal move. +For capturing moves, the dash is replaced with a cross “×”. If it was an en passant capture, then +“ e.p” is appended, like so: “a5×b4 e.p.”. +If a pawn was promoted, the symbol of the new piece is appended. +The figurines are always of the color of the player. + +Both halfmoves on a line are separated by spacing. + +#### Castling + +When a player castles, it is notated the following way: + +* “0–0” for castling with the rook on file h (“kingside castling”) +* “0–0–0” for castling with the rook on file a (“queenside castling”) + +#### Game completion + +If the game came to an end, the game result is written in a final separate line as: + +* “1–0” if White won +* “0–1” if Black won +* “½–½” in case of a draw + +#### Example + + 1. d2–d4 e7–e6 + 2. ♔e1–d2 ♛d8–h4 + 3. d4–d5 e6×d5 + ... + 8. d8×d8♖ ♞b8–c6 + 9. e2–e4 d4×e3 e.p. + +Explanation of the moves: + +* 1.: First fullmove: White moves pawn from d2 to d4, Black moves pawn from e7 to e6 +* 2.: Second fullmove: White moves king from e1 to d2, Black moves queen from d8 to h4 +* 3.: Third fullmove: White moves pawn from d4 to d5, Black moves pawn from d6 to d5 and captures +* 8.: Eighth fullmove: White moves pawn from d7 to d8, captures a piece and promotes it to rook, Black moves knight from b8 to c6 +* 9.: Ninth fullmove: White moves pawn from e2 to e4, black moves pawn from d4 to e3 and captures en passant + +#### Other symbols + +Other symbols are not used. So there are no special symbols for check and checkmate and no comments for moves considered good or bad. + + + +## Notworthy differences from The FIDE Laws of Chess (2023) + +X-Decor-libre tries to be as faithful to the FIDE Laws of Chess +of 2023 as much as possible, but there are a few differences, +mostly for technical reasons: + +* Players cannot agree to draw (Articles 5.2.3 and 9.1.1) +* Only a few select obvious dead positions (like King vs King) + lead to an instant draw (Article 5.2.2) +* Resigning always leads to an instant loss, even if the + opponent cannot give checkmate under any series of legal moves + (Article 5.1.2) +* Pieces are never considered “touched”, Article 4 does not apply +* There is no direct time limit, but the chessboard will unlock + if nobody made a move in 5 minutes. This allows everyone to reset + or dig the chessboard, which aborts the game without a result. diff --git a/mods/xdecor/LICENSE.txt b/mods/xdecor/LICENSE.txt new file mode 100644 index 0000000..1cb9119 --- /dev/null +++ b/mods/xdecor/LICENSE.txt @@ -0,0 +1,70 @@ +┌──────────────────────────────────────────────────────────────────────┐ +│ Copyright (c) 2015-2021 kilbith │ +│ │ +│ Code: Modified BSD License │ +│ Textures: CC0 (credits: Gambit, kilbith, Cisoun, Wuzzy) │ +│ │ +│ Textures (radio and speaker) by │ +│ MCL (CC BY 4.0 Int'l) │ +│ │ +│ Textures (Chess icons for the Chess notation) │ +│ originally by Wikimedia user Cbnurnett, │ +│ scaled down and edited by Wuzzy (CC BY-SA 3.0 Unported) │ +│ │ +│ Textures (hanging candle) by │ +│ Wuzzy (CC0) │ +│ │ +│ Textures (rooster) by │ +│ sirrobzeroone (CC0) │ +│ │ +│ Sounds: │ +│ - xdecor_boiling_water.ogg - by Audionautics - CC BY 3.0 │ +│ freesound.org/people/Audionautics/sounds/133901/ │ +│ - xdecor_bouncy.ogg - by Blender Foundation - CC BY 3.0 │ +│ opengameart.org/content/funny-comic-cartoon-bounce-sound │ +│ - xdecor_enchanting.ogg - by Kostas17, edit by Wuzzy - CC BY 3.0 │ +│ freesound.org/people/Kostas17/sounds/542825/ │ +│ │ +│ Translations: │ +│ - German: Wuzzy │ +│ - Italian: Zughy │ +│ - Spanish: josemunozrwx │ +│ - French: Louis Royer │ +│ │ +└──────────────────────────────────────────────────────────────────────┘ + +-- Modified BSD License -- + +Copyright (c) 2015-2021 kilbith +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of the copyright holder nor the names of contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-- End of Modified BSD License -- + +## References for other licenses: + +* CC BY 3.0: http://creativecommons.org/licenses/by/3.0/ +* CC BY 4.0: http://creativecommons.org/licenses/by/4.0/ +* CC0: https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/mods/xdecor/README.md b/mods/xdecor/README.md new file mode 100644 index 0000000..0213cca --- /dev/null +++ b/mods/xdecor/README.md @@ -0,0 +1,93 @@ +## X-Decor-libre [`xdecor`] ## + +[![ContentDB](https://content.luanti.org/packages/Wuzzy/xdecor/shields/downloads/)](https://content.luanti.org/packages/Wuzzy/xdecor/) + +X-Decor-libre is a libre Luanti mod which adds various decorative blocks +as well as simple gimmicks. + +This is a libre version (free software, free media) of the X-Decor mod for Luanti. +It is the same as X-Decor, except with all the non-free files replaced and with +bugfixes. There are no major new features. + +## Version + +This is version `libre19`. + +## New blocks + +This mod adds many decoration blocks: Flower pot, weathervane, radio, speaker, +wooden tile, new bricks, lamps, candles, new doors, packed ice, and more. + +This mod also adds 7 new block shapes for many Minetest Game blocks. They can +be created by using the workbench. This includes panels, mini blocks and flat +stairs. + +## Special blocks + +Most blocks in this mod are purely decorative, but there are also many special +blocks with special features: + +* Workbench: Storage, crafting, cutting and repairing + * Storage: 16 item slots for item storage + * Craft: 3×3 crafting grid + * Cut: Put a full cube-shaped block to create new shapes + * Repair: Put a damaged tool and a hammer and wait for it to be repaired +* Enchanting table: Upgrade your tools with mese crystals +* Ender Chest: Interdimensional inventory that is the same no matter + where you put the ender chest +* Mailbox: Lets you receive items from other players +* Item Frame: You can place an item into it to show it off +* Cushion: Reduces fall damage +* Cushion Block: Reduces fall damage even more +* Trampoline: Jump on it to bounce off. Very low fall damage +* Cauldron: For storing water and cooking soups + * Recipe: Pour water in, light a fire below it and throw + in some food items. Collect the soup with a bowl +* Lever: Pull the lever to activate doors next to it +* Pressure Plate: Step on it to activate doors next to it +* Chessboard: Play Chess against a player or the computer (see `CHESS_README.md`) + +## Supported mods + +This mod interacts with the following mods to add new features: + +* `tt`: Tooltips will explain the special items and blocks +* `mesecons`: Doors react to mesecon signals +* `unified_inventory`: Add honey in crafting guide +* `toolranks`: Compatibility for enchanted tools +* `moreblocks`: Compatibility changes (other recipes, etc.) + +## For developers and translators + +X-Decor-libre can be extended in a limited fashion. See `API.md` for details. + +This mod can also be translated. The recommended way to translate this mod is +online on Codeberg Translate: + + + +For technical details, see the text file `TRANSLATING.md`. + +## Information about the original mod + +### Compatibility + +X-Decor-libre is highly compatible with X-Decor. Read +“`historic/upgrade.md`” for details on how to upgrade from X-Decor +to X-Decor-libre. + +### More information + +For more information about the original X-Decor mod (from which this one +is derived) and a comparison between both mods, see the text files +in the directory named “`historic`”. + +## Technical information + +X-Decor-libre is a fork of X-Decor, from , +forked at Git commit ID 8b614b3513f2719d5975c883180c011cb7428c8d. + +Note the technical mod name of X-Decor-libre is the same as for X-Decor: `xdecor`. +This is because this mod is meant to be a drop-in-replacement. + +The original readme of X-Decor can be found at `historic/OLD_README.md`. diff --git a/mods/xdecor/TRANSLATING.md b/mods/xdecor/TRANSLATING.md new file mode 100644 index 0000000..dc63ef1 --- /dev/null +++ b/mods/xdecor/TRANSLATING.md @@ -0,0 +1,45 @@ +# Translating X-Decor-libre + +This mod wants to be translated in many languages. + +The recommended way to translate this mod is online on Codeberg Translate: + + + +This is the easiest way to help this mod get translated. + +## Manual translation + +The rest of this document describes how translation works under the hood. +You don’t need to understand this. + +The translations are provided in the gettext PO format (supported since +Luanti 5.10.0); they can be edited with programs like Poedit. + +Many strings are commented, so read the comments to understand the context +of each string. + +There are two files to translate: + +* `xdecor.pot`: Main translation file +* `_xdecor_cut_nodes.pot`: Descriptions of nodes that were cut by the workbench + +To create a complete translation, you need to have: + +* `xdecor..po` +* `_xdecor_cut_nodes..po` + +where `` is the language code like `de` for German. + +## Special symbols + +The strings may contain some symbols with special meaning: + +`@1`, `@2`, `@3`, etc. are placeholders, they will be replaced with some other +text. The translation *MUST* include all placeholders of the original string, +but you can change the order as you wish. + +`@n` represents a new line. + +Refer to `lua_api.md` of the Luanti documentation for more information about +the translation system. diff --git a/mods/xdecor/extra_mods/README.md b/mods/xdecor/extra_mods/README.md new file mode 100644 index 0000000..94cbed6 --- /dev/null +++ b/mods/xdecor/extra_mods/README.md @@ -0,0 +1,6 @@ +The `extra_mods` directory contains extra mods for X-Decor-libre. + +X-Decor-libre itself should NOT execute any of the code in this directory directly. + +This directory is meant for special mods that you, the user +are supposed to install manually (if you need them). diff --git a/mods/xdecor/extra_mods/xdecor_autocut/LICENSE.txt b/mods/xdecor/extra_mods/xdecor_autocut/LICENSE.txt new file mode 100644 index 0000000..71bb77b --- /dev/null +++ b/mods/xdecor/extra_mods/xdecor_autocut/LICENSE.txt @@ -0,0 +1,29 @@ +-- Modified BSD License -- + +Copyright (c) 2025 Wuzzy +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of the copyright holder nor the names of contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-- End of Modified BSD License -- diff --git a/mods/xdecor/extra_mods/xdecor_autocut/README.md b/mods/xdecor/extra_mods/xdecor_autocut/README.md new file mode 100644 index 0000000..b4296ad --- /dev/null +++ b/mods/xdecor/extra_mods/xdecor_autocut/README.md @@ -0,0 +1,85 @@ +# X-Decor-libre Autocut [`xdecor_autocut`] + +## Version + +This is version `1.0.0` of `xdecor_autocut`, compatible +with version `libre14` or later of X-Decor-libre. + +## Description + +This is a companion mod for X-Decor-libre [`xdecor`]. + +It automatically adds many more “cut” variants for most +cube-shaped nodes in the game so the player can cut more +nodes at the workbench. This does not guarantee that +all added cut nodes will look pretty, however, +as the nodes will be added automatically and are +not carefully curated. + +By default, X-Decor-libre only adds cut node variants for +nodes from itself and the `default` mod. + +With this mod, nodes from other mods will be available for +cutting as well. + +This has been the original behavior of X-Decor-libre in the past, +but it has been removed in version `libre6` due to +hard-to-debug compatibility issues like naming collisions. +This mod basically replicates this old behavior, but a bit +more stable. + +## Usage + +To use this mod, simply copy the mod folder to your +`mods` directory of your Luanti user directory and +then enable it for your world like any other world. + +### Note for server operators + +You should probably not use this mod except for +compatibility with old versions of X-Decor-libre +or X-Decor. + +If you are just now adding X-Decor-libre or +start with a fresh world, you’re probably better +off in writing a small mod to *explicitly* make +each node you want to be made cut cuttable, to +prevent to pollute your server with garbage nodes. +See `src/workbench.lua` for details. + +This mod mainly exists because if will be useful if +your server used an older version of X-Decor-libre +or X-Decor that aggressively added many cut nodes +which have become unknown nodes in newer versions, +because since X only nodes from X-Decor-libre +and the `default` mod are cuttable, for safety +reasons. +If your world contains some cut nodes from any +other mod, and they have become unknown after +you upgraded of X-Decor-libre, this mod is for you. + +Please note that this aggressive automatic +adding of cut nodes is not guaranteed to give you +the best quality. Some nodes that you probably +do not want to be cut will be cuttable, some nodes +might look ugly in their cut form, especially +custom glass nodes. It is recommended you check your +logs for `[xdecor_autocut]` messages to see which +nodes have been made cuttable. + +However, this mod should still be relatively safe to +use, because it now checks for naming collisions. +If it detects that any of the required node names +for cut nodes is taken, it will refuse to add any +cut node variants and print a message in the log. + +### Note for modders + +You can prevent any node from being having cut node +variants added to it by adding the group +`not_cuttable=1` to it. + +## License + +This mod is free software, distributed under the Modified +BSD License (see `LICENSE.txt`). diff --git a/mods/xdecor/extra_mods/xdecor_autocut/init.lua b/mods/xdecor/extra_mods/xdecor_autocut/init.lua new file mode 100644 index 0000000..7552945 --- /dev/null +++ b/mods/xdecor/extra_mods/xdecor_autocut/init.lua @@ -0,0 +1,22 @@ +minetest.register_on_mods_loaded(function() + local nodes = {} + -- Iterate through all nodes, select nodes allowed to be cut + -- Only the regular, solid blocks without metas or explosivity can be cut + for nodename, def in pairs(minetest.registered_nodes) do + if xdecor.stairs_valid_def(def) then + if not xdecor.is_cut_registered(nodename) then + if xdecor.can_cut(nodename) then + table.insert(nodes, nodename) + else + -- Not all of the available node names are available + -- for X-Decor-libre to add: Skip this node + minetest.log("action", "[xdecor_autocut] Skipped adding cut nodes for "..nodename.." because at least one of the required nodenames is already taken") + end + end + end + end + for n=1, #nodes do + xdecor.register_cut(nodes[n]) + minetest.log("action", "[xdecor_autocut] Registered cut nodes for: "..nodes[n]) + end +end) diff --git a/mods/xdecor/extra_mods/xdecor_autocut/mod.conf b/mods/xdecor/extra_mods/xdecor_autocut/mod.conf new file mode 100644 index 0000000..34bc6e8 --- /dev/null +++ b/mods/xdecor/extra_mods/xdecor_autocut/mod.conf @@ -0,0 +1,3 @@ +name = xdecor_autocut +description = Automatically add cut nodes variants for many nodes for X-Decor-libre’s workbench +depends = xdecor diff --git a/mods/xdecor/handlers/animations.lua b/mods/xdecor/handlers/animations.lua new file mode 100644 index 0000000..147cb69 --- /dev/null +++ b/mods/xdecor/handlers/animations.lua @@ -0,0 +1,154 @@ +local mod_player_api = minetest.get_modpath("player_api") ~= nil + +local sitting = {} +local seats_occupied = {} + +local function bottom_face(pointed_thing) + if not pointed_thing then + return + end + return pointed_thing.above.y < pointed_thing.under.y +end + +local function stand_up(player_name) + if not mod_player_api then + return + end + local player = minetest.get_player_by_name(player_name) + if not player then + return + end + player_api.player_attached[player_name] = false + + local old_anim = player_api.get_animation(player) + if old_anim and old_anim.animation == "sit" then + player_api.set_animation(player, "stand") + end + + local hash = minetest.hash_node_position(sitting[player_name]) + seats_occupied[hash] = nil + sitting[player_name] = nil + + minetest.log("action", "[xdecor] "..player_name.." stands up at "..minetest.pos_to_string(player:get_pos(), 0)) +end + +--[[ Used when player interacts with "sittable" node to sit down +or stand up when interacting with that node again. Should +be used in `on_rightclick` handler +* `pos`: Position where to sit down player (MUST only use integers for coordinates!) +* `node`: Node table of node to sit on +* `clicker`: Player who interacted with node (from `on_rightclick`) +* `pointed_thing`: From `on_rightclick` ]] +function xdecor.sit(pos, node, clicker, pointed_thing) + if not mod_player_api then + return + end + -- Can't sit down if bottom face was pointed at + if bottom_face(pointed_thing) then + return + end + local player_name = clicker:get_player_name() + local objs = minetest.get_objects_inside_radius(pos, 0.1) + local vel = clicker:get_velocity() + local ctrl = clicker:get_player_control() + + -- Stand up if sitting + if sitting[player_name] then + stand_up(player_name) + + -- Sit down if not sitting and not attached + elseif not sitting[player_name] and not player_api.player_attached[player_name] and node.param2 <= 3 and + not ctrl.sneak and vector.equals(vel, vector.new()) then + + -- Can't sit down on note already occupied by player + local hash = minetest.hash_node_position(pos) + if seats_occupied[hash] then + return + end + + player_api.player_attached[player_name] = true + player_api.set_animation(clicker, "sit") + sitting[player_name] = table.copy(pos) + seats_occupied[hash] = player_name + clicker:set_pos(pos) + + if node.param2 == 0 then + clicker:set_look_horizontal(0) + elseif node.param2 == 1 then + clicker:set_look_horizontal(3*(math.pi/2)) + elseif node.param2 == 2 then + clicker:set_look_horizontal(math.pi) + elseif node.param2 == 3 then + clicker:set_look_horizontal(math.pi/2) + end + + minetest.log("action", "[xdecor] "..player_name.." sits down at "..minetest.pos_to_string(pos, 0)) + end +end + +-- Called when `digger` (a player object) wants to +-- dig a node at pos. Returns true if it's allowed, +-- false otherwise. This checks if the node at pos +-- is an occupied sittable node. +-- Can be used for the `can_dig` node function. +function xdecor.sit_dig(pos, digger) + if not mod_player_api then + return true + end + local hash = minetest.hash_node_position(pos) + if seats_occupied[hash] then + return false + end + + return true +end + +-- To be called when a seat (sittable node) got destroyed +-- to clean up state. Precisely, this should be used +-- as the `after_destruct` handler. +function xdecor.sit_destruct(pos) + local hash = minetest.hash_node_position(pos) + local occupier = seats_occupied[hash] + if occupier then + stand_up(occupier) + seats_occupied[hash] = nil + sitting[occupier] = nil + end +end + +-- Automatically cause players to stand up if they pressed a control +-- or moved away from the seat +minetest.register_globalstep(function(dtime) + local to_stand_up = {} + for player_name, sitting_pos in pairs(sitting) do + local player = minetest.get_player_by_name(player_name) + if player then + local ctrl = player:get_player_control() + if ctrl.up or ctrl.down or ctrl.left or ctrl.right or ctrl.sneak or ctrl.jump then + table.insert(to_stand_up, player_name) + elseif vector.distance(player:get_pos(), sitting_pos) > 0.55 then + table.insert(to_stand_up, player_name) + end + end + end + for s=1, #to_stand_up do + stand_up(to_stand_up[s]) + end +end) + +-- Force player to stand on death (to the seat is released) +minetest.register_on_dieplayer(function(player) + local player_name = player:get_player_name() + if sitting[player_name] then + stand_up(player_name) + end +end) + +minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + if sitting[player_name] then + local hash = minetest.hash_node_position(sitting[player_name]) + seats_occupied[hash] = nil + sitting[player_name] = nil + end +end) diff --git a/mods/xdecor/handlers/glasscut.lua b/mods/xdecor/handlers/glasscut.lua new file mode 100644 index 0000000..f87aed6 --- /dev/null +++ b/mods/xdecor/handlers/glasscut.lua @@ -0,0 +1,170 @@ +-- Tile definitions for cut nodes of glass nodes: +-- * Woodframed Glass (this mod) +-- * Glass (Minetest Game) +-- * Obsidian Glass (Minetest Game) +-- This is done so the glass nodes still look nice +-- when cut. +-- If we would only use the base glass tile, most +-- cut nodes look horrible because there are no +-- clear contours. + +local template_suffixes_glass = { + stair = { + "_split.png", + ".png", + "_stairside.png^[transformFX", + "_stairside.png", + ".png", + "_split.png", + }, + stair_inner = { + "_stairside.png^[transformR270", + ".png", + "_stairside.png^[transformFX", + ".png", + ".png", + "_stairside.png", + }, + stair_outer = { + "_stairside.png^[transformR90", + ".png", + "_outer_stairside.png", + "_stairside.png", + "_stairside.png^[transformR90", + "_outer_stairside.png", + }, + halfstair = { + "_cube.png", + ".png", + "_stairside.png^[transformFX", + "_stairside.png", + "_split.png^[transformR90", + "_cube.png", + }, + slab = { + ".png", + ".png", + "_split.png", + }, + cube = { "_cube.png" }, + thinstair = { "_split.png" }, + micropanel = { "_split.png" }, + panel = { + "_split.png", + "_split.png", + "_cube.png", + "_cube.png", + "_split.png", + }, +} + +-- Template for "grass-covered" and similar nodes. +-- This is defined in a way so that the cut nodes +-- still have a natural-looking grass cover. +-- !TOP and !BOTTOM are special and will be +-- replaced via function argument. + +local template_suffixes_grasscover = { + stair = { + "!TOP", + "!BOTTOM", + "_stairside.png^[transformFX", + "_stairside.png", + ".png", + "_split.png", + }, + stair_inner = { + "!TOP", + "!BOTTOM", + "_stairside.png^[transformFX", + ".png", + ".png", + "_stairside.png", + }, + stair_outer = { + "!TOP", + "!BOTTOM", + "_outer_stairside.png", + "_stairside.png", + "_stairside.png^[transformR90", + "_outer_stairside.png", + }, + halfstair = { + "!TOP", + "!BOTTOM", + "_stairside.png^[transformFX", + "_stairside.png", + ".png", + "_cube.png", + }, + slab = { + "!TOP", + "!BOTTOM", + "_split.png", + }, + cube = { "!TOP", "!BOTTOM", "_cube.png" }, + thinstair = { "!TOP", "!BOTTOM", "_cube.png" }, + micropanel = { "!TOP", "!BOTTOM", "!TOP" }, + nanoslab = { "!TOP", "!BOTTOM", "!TOP" }, + microslab = { "!TOP", "!BOTTOM", "!TOP" }, + panel = { + "!TOP", + "!BOTTOM", + "_cube.png", + "_cube.png", + "_split.png", + }, +} + +local generate_tilenames_glass = function(prefix, default_texture) + if not default_texture then + default_texture = prefix + end + local cuts = {} + for t, tiles in pairs(template_suffixes_glass) do + cuts[t] = {} + for i=1, #tiles do + if tiles[i] == ".png" then + cuts[t][i] = default_texture .. tiles[i] + else + cuts[t][i] = prefix .. tiles[i] + end + end + end + return cuts +end + +local generate_tilenames_grasscover = function(prefix, default_texture, base, top, bottom) + if not default_texture then + default_texture = prefix + end + local cuts = {} + for t, tiles in pairs(template_suffixes_grasscover) do + cuts[t] = {} + for i=1, #tiles do + if tiles[i] == "!TOP" then + cuts[t][i] = {name=top, align_style="world"} + elseif tiles[i] == "!BOTTOM" then + cuts[t][i] = {name=bottom, align_style="world"} + else + if tiles[i] == ".png" then + cuts[t][i] = default_texture .. tiles[i] + else + cuts[t][i] = prefix .. tiles[i] + end + if base then + cuts[t][i] = base .. "^" .. cuts[t][i] + end + end + end + end + return cuts +end + +xdecor.glasscuts = { + ["xdecor:woodframed_glass"] = generate_tilenames_glass("xdecor_woodframed_glass"), + ["default:glass"] = generate_tilenames_glass("stairs_glass", "default_glass"), + ["default:obsidian_glass"] = generate_tilenames_glass("stairs_obsidian_glass", "default_obsidian_glass"), + ["default:permafrost_with_moss"] = generate_tilenames_grasscover("xdecor_permafrost_moss", "default_moss_side", "default_permafrost.png", "default_moss.png", "default_permafrost.png"), + ["default:permafrost_with_stones"] = generate_tilenames_grasscover("xdecor_permafrost_stones", "default_stones_side", "default_permafrost.png", "default_permafrost.png^default_stones.png", "default_permafrost.png"), +} diff --git a/mods/xdecor/handlers/helpers.lua b/mods/xdecor/handlers/helpers.lua new file mode 100644 index 0000000..42635f0 --- /dev/null +++ b/mods/xdecor/handlers/helpers.lua @@ -0,0 +1,68 @@ +-- Returns the greatest numeric key in a table. +function xdecor.maxn(T) + local n = 0 + for k in pairs(T) do + if k > n then + n = k + end + end + + return n +end + +-- Returns the length of an hash table. +function xdecor.tablelen(T) + local n = 0 + + for _ in pairs(T) do + n = n + 1 + end + + return n +end + +-- Deep copy of a table. Borrowed from mesecons mod (https://github.com/Jeija/minetest-mod-mesecons). +function xdecor.tablecopy(T) + if type(T) ~= "table" then + return T -- No need to copy. + end + + local new = {} + + for k, v in pairs(T) do + if type(v) == "table" then + new[k] = xdecor.tablecopy(v) + else + new[k] = v + end + end + + return new +end + +function xdecor.stairs_valid_def(def) + return (def.drawtype == "normal" or def.drawtype:sub(1,5) == "glass") and + (def.groups.cracky or def.groups.choppy) and + not def.on_construct and + not def.after_place_node and + not def.on_rightclick and + not def.on_blast and + not def.allow_metadata_inventory_take and + not (def.groups.not_in_creative_inventory == 1) and + not (def.groups.not_cuttable == 1) and + not def.groups.wool and + (def.tiles and type(def.tiles[1]) == "string" and not + def.tiles[1]:find("default_mineral")) and + not def.mesecons and + def.description and + def.description ~= "" and + def.light_source == 0 +end + +function xdecor.get_inventory_drops(pos, listnames) + local drops = {} + for l=1, #listnames do + default.get_inventory_drops(pos, listnames[l], drops) + end + return drops +end diff --git a/mods/xdecor/handlers/nodeboxes.lua b/mods/xdecor/handlers/nodeboxes.lua new file mode 100644 index 0000000..4a3d8ca --- /dev/null +++ b/mods/xdecor/handlers/nodeboxes.lua @@ -0,0 +1,67 @@ +xdecor.box = { + slab_y = function(height, shift) + return { + -0.5, + -0.5 + (shift or 0), + -0.5, + 0.5, + -0.5 + height + (shift or 0), + 0.5 + } + end, + slab_z = function(depth) + return {-0.5, -0.5, -0.5 + depth, 0.5, 0.5, 0.5} + end, + bar_y = function(radius) + return {-radius, -0.5, -radius, radius, 0.5, radius} + end, + cuboid = function(radius_x, radius_y, radius_z) + return {-radius_x, -radius_y, -radius_z, radius_x, radius_y, radius_z} + end +} + +xdecor.nodebox = { + regular = {type = "regular"}, + null = { + type = "fixed", fixed = {0,0,0,0,0,0} + } +} + +xdecor.pixelbox = function(size, boxes) + local fixed = {} + for _, box in ipairs(boxes) do + -- `unpack` has been changed to `table.unpack` in newest Lua versions. + local x, y, z, w, h, l = unpack(box) + fixed[#fixed + 1] = { + (x / size) - 0.5, + (y / size) - 0.5, + (z / size) - 0.5, + ((x + w) / size) - 0.5, + ((y + h) / size) - 0.5, + ((z + l) / size) - 0.5 + } + end + + return {type = "fixed", fixed = fixed} +end + +local mt = {} + +mt.__index = function(table, key) + local ref = xdecor.box[key] + local ref_type = type(ref) + + if ref_type == "function" then + return function(...) + return {type = "fixed", fixed = ref(...)} + end + elseif ref_type == "table" then + return {type = "fixed", fixed = ref} + elseif ref_type == "nil" then + error(key .. "could not be found among nodebox presets and functions") + end + + error("unexpected datatype " .. tostring(type(ref)) .. " while looking for " .. key) +end + +setmetatable(xdecor.nodebox, mt) diff --git a/mods/xdecor/handlers/registration.lua b/mods/xdecor/handlers/registration.lua new file mode 100644 index 0000000..44eacc2 --- /dev/null +++ b/mods/xdecor/handlers/registration.lua @@ -0,0 +1,183 @@ +local S = minetest.get_translator("xdecor") + +xdecor.xbg = default.gui_bg .. default.gui_bg_img .. default.gui_slots +local default_inventory_size = 32 + +local default_inventory_formspecs = { + ["8"] = [[ size[8,6] + list[context;main;0,0;8,1;] + list[current_player;main;0,2;8,4;] + listring[current_player;main] + listring[context;main] ]] .. + default.get_hotbar_bg(0,2), + + ["16"] = [[ size[8,7] + list[context;main;0,0;8,2;] + list[current_player;main;0,3;8,4;] + listring[current_player;main] + listring[context;main] ]] .. + default.get_hotbar_bg(0,3), + + ["24"] = [[ size[8,8] + list[context;main;0,0;8,3;] + list[current_player;main;0,4;8,4;] + listring[current_player;main] + listring[context;main]" ]] .. + default.get_hotbar_bg(0,4), + + ["32"] = [[ size[8,9] + list[context;main;0,0.3;8,4;] + list[current_player;main;0,4.85;8,1;] + list[current_player;main;0,6.08;8,3;8] + listring[current_player;main] + listring[context;main] ]] .. + default.get_hotbar_bg(0,4.85) +} + +local function get_formspec_by_size(size) + local formspec = default_inventory_formspecs[tostring(size)] + return formspec or default_inventory_formspecs +end + +local default_can_dig = function(pos) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("main") +end + +local function xdecor_stairs_alternative(nodename, def) + local mod, name = nodename:match("(.*):(.*)") + + for groupname, value in pairs(def.groups) do + if groupname ~= "cracky" and groupname ~= "choppy" and + groupname ~= "flammable" and groupname ~= "crumbly" and + groupname ~= "snappy" then + def.groups.groupname = nil + end + end + + if minetest.get_modpath("moreblocks") then + stairsplus:register_all( + mod, + name, + nodename, + { + description = def.description, + tiles = def.tiles, + groups = def.groups, + sounds = def.sounds, + } + ) + elseif minetest.get_modpath("stairs") then + local custom_tiles = xdecor.glasscuts[nodename] + if custom_tiles and (custom_tiles.slab or custom_tiles.stair) then + if custom_tiles.stair then + stairs.register_stair(name, nodename, + def.groups, custom_tiles.stair, S("@1 Stair", def.description), + def.sounds) + stairs.register_stair_inner(name, nodename, + def.groups, custom_tiles.stair_inner, "", def.sounds, nil, S("Inner @1 Stair", def.description)) + stairs.register_stair_outer(name, nodename, + def.groups, custom_tiles.stair_outer, "", def.sounds, nil, S("Outer @1 Stair", def.description)) + end + if custom_tiles.slab then + stairs.register_slab(name, nodename, + def.groups, custom_tiles.slab, S("@1 Slab", def.description), + def.sounds) + end + else + stairs.register_stair_and_slab(name,nodename, + def.groups, + def.tiles, + S("@1 Stair", def.description), + S("@1 Slab", def.description), + def.sounds, nil, + S("Inner @1 Stair", def.description), + S("Outer @1 Stair", def.description) + ) + end + end + end + +function xdecor.register(name, def) + def.drawtype = def.drawtype or (def.mesh and "mesh") or (def.node_box and "nodebox") + def.sounds = def.sounds or default.node_sound_defaults() + + if not (def.drawtype == "normal" or def.drawtype == "signlike" or + def.drawtype == "plantlike" or def.drawtype == "glasslike_framed" or + def.drawtype == "glasslike_framed_optional") then + def.paramtype2 = def.paramtype2 or "facedir" + end + + if def.sunlight_propagates ~= false and + (def.drawtype == "plantlike" or def.drawtype == "torchlike" or + def.drawtype == "signlike" or def.drawtype == "fencelike") then + def.sunlight_propagates = true + end + + if not def.paramtype and + (def.light_source or def.sunlight_propagates or + def.drawtype == "nodebox" or def.drawtype == "mesh") then + def.paramtype = "light" + end + + local infotext = def.infotext + local inventory = def.inventory + def.inventory = nil + + if inventory then + def.on_construct = def.on_construct or function(pos) + local meta = minetest.get_meta(pos) + if infotext then meta:set_string("infotext", infotext) end + + local size = inventory.size or default_inventory_size + local inv = meta:get_inventory() + + inv:set_size("main", size) + meta:set_string("formspec", + (inventory.formspec or get_formspec_by_size(size)) .. xdecor.xbg) + end + + def.can_dig = def.can_dig or default_can_dig + + elseif infotext and not def.on_construct then + def.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", infotext) + end + end + + minetest.register_node("xdecor:" .. name, def) + + local workbench = minetest.settings:get_bool("enable_xdecor_workbench") + + if workbench == false and + (minetest.get_modpath("moreblocks") or minetest.get_modpath("stairs")) then + if xdecor.stairs_valid_def(def) then + xdecor_stairs_alternative("xdecor:"..name, def) + end + end +end + +-- Registers aliases for a node that had a name collision +-- with a node from the moreblocks mod +function xdecor.register_legacy_aliases(original_basename, new_basename) + minetest.register_alias("xdecor:"..original_basename, "xdecor:"..new_basename) + minetest.register_alias("xdecor:"..original_basename.."_panel", "xdecor:"..new_basename.."_panel") + minetest.register_alias("xdecor:"..original_basename.."_doublepanel", "xdecor:"..new_basename.."_doublepanel") + minetest.register_alias("xdecor:"..original_basename.."_micropanel", "xdecor:"..new_basename.."_micropanel") + minetest.register_alias("xdecor:"..original_basename.."_halfstair", "xdecor:"..new_basename.."_halfstair") + minetest.register_alias("xdecor:"..original_basename.."_thinstair", "xdecor:"..new_basename.."_thinstair") + minetest.register_alias("xdecor:"..original_basename.."_cube", "xdecor:"..new_basename.."_cube") + minetest.register_alias("xdecor:"..original_basename.."_microslab", "xdecor:"..new_basename.."_microslab") + minetest.register_alias("xdecor:"..original_basename.."_nanoslab", "xdecor:"..new_basename.."_nanoslab") + if not minetest.get_modpath("moreblocks") then + minetest.register_alias("stairs:slab_"..original_basename, "stairs:slab_"..new_basename) + minetest.register_alias("stairs:stair_"..original_basename, "stairs:stair_"..new_basename) + minetest.register_alias("stairs:stair_outer_"..original_basename, "stairs:stair_outer_"..new_basename) + minetest.register_alias("stairs:stair_inner_"..original_basename, "stairs:stair_inner"..new_basename) + end + if minetest.get_modpath("stairsplus") and minetest.global_exists("stairsplus") and stairsplus.api then + stairsplus.api.register_alias_all("xdecor:"..original_basename, "xdecor:"..new_basename) + end +end + diff --git a/mods/xdecor/historic/OLD_README.md b/mods/xdecor/historic/OLD_README.md new file mode 100644 index 0000000..f52f429 --- /dev/null +++ b/mods/xdecor/historic/OLD_README.md @@ -0,0 +1,19 @@ +Note: This is the original readme of the xdecor mod, added here for documentation/historic reasons. + +## X-Decor ## + +[![ContentDB](https://content.minetest.net/packages/jp/xdecor/shields/downloads/)](https://content.minetest.net/packages/jp/xdecor/) + +A decoration mod meant to be simple and well-featured. +It adds a bunch of cute cubes, various mechanisms and stuff for [cutting](https://forum.minetest.net/viewtopic.php?f=11&t=14085), [enchanting](https://forum.minetest.net/viewtopic.php?f=11&t=14087), cooking, etc. +This mod is a lightweight alternative to HomeDecor and MoreBlocks. + +### Requirements ### +This mod requires at least version 5.1 of Minetest. + +### Credits ### + +Special thanks to Gambit for the textures from the PixelBOX pack for Minetest. +Thanks to all contributors who keep this mod alive. + +![Preview](http://i.imgur.com/AVoyCQy.png) diff --git a/mods/xdecor/historic/upgrade.md b/mods/xdecor/historic/upgrade.md new file mode 100644 index 0000000..c9d54b4 --- /dev/null +++ b/mods/xdecor/historic/upgrade.md @@ -0,0 +1,49 @@ +# Upgrading from X-Decor to X-Decor-libre + +Here’s how you can upgrade from X-Decor to X-Decor-libre. + +## Drop-in-replacement + +If you used the original X-Decor before, this mod is a safe **drop-in-replacement** +for X-Decor **provided you used no other mods that added new blocks**. X-Decor-libre +is fully backwards-compatible in that case. + +If other mods existed, X-Decor-libre is still a drop-in-replacement if +the world contains no cut nodes that have been cut from nodes from +a mod other than `default` or `xdecor`. (“classic” stairs, slabs, inner +and outer slabs that already existed without X-Decor-libre are safe) + +If this is the case, then you can just replace your X-Decor mod in your world +with X-Decor-libre and you’re good to go. + +If this for any reason still didn’t work, this is a bug, please report it at +. + +## Manual intervention required + +If you used X-Decor before and you or any player in the world have cut any node +at the workbench that is not from `xdecor` or the `default` mod, then those +cut nodes will become **unknown nodes** after you upgrade. In that case, +X-Decor-libre is **no longer a drop-in-replacement**, so a bit of manual +intervention is required to make the upgrade to X-Decor-libre work. + +(This was a change in version `libre6` that was done to remove clutter and +prevent more and more potential naming collisions to build up. Versions +before `libre6` added cut nodes too aggressively, potentially even overwriting +existing nodes.) + +Cut nodes end with `_panel`, `_cube`, `_thinstair`, `_microslab`, `_micropanel`, +`_nanoslab`, `_halfstair` (but remember nodes with such names might come +from other unrelated mods as well). + +To fix the unknown nodes, you can add the `xdecor_autocut` mod which you find +in the `extra_mods` directory. This will basically bring back the old +behavior of X-Decor and old X-Decor-libre versions (before `libre6`), but +is a bit more careful with adding nodes. Read `extra_mods/xdecor_autocut/README.md` +for details. + +Alternatively, you may decide to manually remove all unknown cut nodes from +the world. This is more realistic if not many such nodes have been created +so far. + + diff --git a/mods/xdecor/historic/xdecor-libre_vs_xdecor.md b/mods/xdecor/historic/xdecor-libre_vs_xdecor.md new file mode 100644 index 0000000..d6da629 --- /dev/null +++ b/mods/xdecor/historic/xdecor-libre_vs_xdecor.md @@ -0,0 +1,134 @@ +### X-Decor-libre vs X-Decor + +The original X-Decor mod is a popular mod in Luanti but it is (as the +time of writing this text) non-free software, there are various files +under proprietary licenses. + +The purpose of this repository is to provide the community a fully-free fork of +X-Decor with clearly documented licenses and to fix bugs. + +#### New feature policy + +X-Decor-libre is very careful with adding new features, especially new +blocks and items, if they didn't exist in X-Decor before. + +X-Decor-libre wants to preserve the features of the original mod +as much as possible, but bug-free and under fully free licensing. + +No major new additions are planned. + +New blocks should be added only after very careful consideration +to prevent bloat. Basically, only if they are a variant of an +existing block and they feel an actual gap. Completely brand-new +blocks should not be added. + +The green chrysanthemum and black tulip have been added to +complete the full set of flowers in Minetest Game 5.0.0 and +later versions. + +No major new gameplay features or changes are planned, except +for maintenance and bugfixing. + +#### List of changes + +Compared to the original X-Decor mod, this is a list of changes +that X-Decor-libre provides: + +Important compatibilty-relevant change: + +* Mod no longer registers cut nodes for mods other than `xdecor` + and `default` (see `historic/upgrade.md` for details) (since + version `libre6`) + +Added blocks: + +* Potted Green Chrysanthemum +* Potted Black Tulip + +Fixed bugs (as of 01/07/2023): + +* Changed packed ice recipe to avoid recipe collision with Ethereal +* Changed prison door recipe colliding with Minetest Game's Iron Bar Door +* Beehives no longer show that the bees are busy when they're not +* Fixed incorrect/incomplete node sounds +* Fix poorly placed buttons in enchantment screen +* Fix broken texture of cut Permafrost with Moss nodes +* Fix awkward lantern rotation +* Lanterns can no longer attach to sides +* Fix item stacking issues of curtains +* Cauldrons no longer turn river water to normal water +* Fix boiling water in cauldrons not reliably cooling down +* Fix boiling water sound not playing when rejoining +* Fix cauldron with soup boiling forever +* Fix cauldrons being heated up by fireflies +* Fix rope and painting not compatible with itemframe +* Fix itemframe, lever being offset when put into itemframe +* Fix storage formspecs not closing if exploded +* Show short item description in itemframe instead of itemstring +* Minor typo fixes +* Fix bad rope placement prediction +* Fixed the broken Chess game + +Maintenance updates: + +* HUGE rework of Chess to make it actually be like real Chess (more or less) +* New supported Chess rules (based on the FIDE Laws of Chess) + * En passant + * Choose your pawn promotion + * Fixed incomplete enforcement of castling rule + * 50-turn rule and 75-turn rule + * Threefold repetition rule and fivefold repetition rule + * Announce the winner or loser, or a drawn game +* Many technical improvements for Chess +* Renamed blocks: + * "Empty Shelf" to "Plain Shelf" + * "Slide Door" to "Paper Door" + * "Rooster" to "Weathercock" + * "Stone Tile" to "Polished Stone Block" + * "Desert Stone Tile" to "Polished Desert Stone Block" + * "Iron Light Box" to "Steel Lattice Light Box" + * "Wooden Light Box" to "Wooden Cross Light Box" + * "Wooden Light Box 2" to "Wooden Rhombus Light Box" + * "Potted Rose" to "Potted Red Rose" + * "Potted Tulip" to "Potted Orange Tulip" + * "Potted Geranium" to "Potted Blue Geranium" +* Added fuel recipes for wooden-based things +* Changed a few confusing recipes to make more sense +* Improved textures for cut glass, obsidian glass, wood-framed glass, + permafrost with moss and permafrost with stones +* Improved side texture of wood frame and rusty bar +* Add honey and cushion block to creative inventory +* Doors now count as nodes in creative inventory +* Cobwebs are no longer considered (fake) liquids +* Storage blocks now drop their inventory when exploded +* Made several strings translatable +* Translation updates +* Add description to every setting +* Add tooltip extensions for some interactive items (uses `tt` mod) +* Add crafting guide support for `unified_inventory` mod (honey) +* Rope no longer extends infinitely in Creative Mode +* Added manual for Chess in `CHESS_README.md` + +Note: This list may not be perfect, because a lot of other changes +have been made since it was written. + +#### List of replaced files + +This is the list of non-free files in the original X-Decor mod +(as of commit 8b614b3513f2719d5975c883180c011cb7428c8d) +that X-Decor-libre replaces: + +* `textures/xdecor_candle_hanging.png` +* `textures/xdecor_radio_back.png` +* `textures/xdecor_radio_front.png` +* `textures/xdecor_radio_side.png` +* `textures/xdecor_radio_top.png` +* `textures/xdecor_rooster.png` +* `textures/xdecor_speaker_back.png` +* `textures/xdecor_speaker_front.png` +* `textures/xdecor_speaker_side.png` +* `textures/xdecor_speaker_top.png` +* `sounds/xdecor_enchanting.ogg` + +(see `LICENSE.txt` file for licensing). + diff --git a/mods/xdecor/init.lua b/mods/xdecor/init.lua new file mode 100644 index 0000000..090a76c --- /dev/null +++ b/mods/xdecor/init.lua @@ -0,0 +1,44 @@ +--local t = os.clock() + +xdecor = {} +local modpath = minetest.get_modpath("xdecor") + +dofile(modpath .. "/handlers/glasscut.lua") +dofile(modpath .. "/handlers/animations.lua") +dofile(modpath .. "/handlers/helpers.lua") +dofile(modpath .. "/handlers/nodeboxes.lua") +dofile(modpath .. "/handlers/registration.lua") + +dofile(modpath .. "/src/nodes.lua") +dofile(modpath .. "/src/recipes.lua") + +-- Load modules that can be enabled and disabled by settings +local subpart = { + "chess", + "cooking", + "enchanting", + "hive", + "itemframe", + "mailbox", + "mechanisms", + "rope", + -- Workbench MUST be loaded after all other subparts that register nodes + -- last for the default 'cut node' registrations to work + "workbench", +} + +for _, name in ipairs(subpart) do + local enable = minetest.settings:get_bool("enable_xdecor_" .. name, true) + if enable then + dofile(modpath .. "/src/" .. name .. ".lua") + end +end + +-- Special case: enchanted tools. This code is split from enchanting to +-- deal with loading order. +-- Enchanted tools registered last because they depend on previous +-- subparts +local enable_enchanting = minetest.settings:get_bool("enable_xdecor_enchanting", true) +if enable_enchanting then + dofile(modpath .. "/src/enchanted_tools.lua") +end diff --git a/mods/xdecor/locale/_xdecor_cut_nodes.de.po b/mods/xdecor/locale/_xdecor_cut_nodes.de.po new file mode 100644 index 0000000..ebd80b1 --- /dev/null +++ b/mods/xdecor/locale/_xdecor_cut_nodes.de.po @@ -0,0 +1,3087 @@ +msgid "" +msgstr "" +"Project-Id-Version: xdecor\n" +"Report-Msgid-Bugs-To: Wuzzy@disroot.org\n" +"POT-Creation-Date: 2025-10-18 19:22+0200\n" +"PO-Revision-Date: 2026-02-22 19:59+0000\n" +"Last-Translator: Wuzzy \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#: src/_locale_workbench.lua:18 +msgid "Barrel Stair" +msgstr "Fasstreppe" + +#: src/_locale_workbench.lua:19 +msgid "Barrel Slab" +msgstr "Fassplatte" + +#: src/_locale_workbench.lua:20 +msgid "Inner Barrel Stair" +msgstr "Innere Fasstreppe" + +#: src/_locale_workbench.lua:21 +msgid "Outer Barrel Stair" +msgstr "Äußere Fasstreppe" + +#: src/_locale_workbench.lua:22 +msgid "Barrel Nanoslab" +msgstr "Fassnanoplatte" + +#: src/_locale_workbench.lua:23 +msgid "Barrel Micropanel" +msgstr "Fassmikropaneel" + +#: src/_locale_workbench.lua:24 +msgid "Barrel Microslab" +msgstr "Fassmikroplatte" + +#: src/_locale_workbench.lua:25 +msgid "Barrel Thin Stair" +msgstr "Fassflachtreppe" + +#: src/_locale_workbench.lua:26 +msgid "Barrel Cube" +msgstr "Fasswürfel" + +#: src/_locale_workbench.lua:27 +msgid "Barrel Panel" +msgstr "Fasspaneel" + +#: src/_locale_workbench.lua:28 +msgid "Barrel Double Panel" +msgstr "Fassdoppelpaneel" + +#: src/_locale_workbench.lua:29 +msgid "Barrel Half-Stair" +msgstr "Fasshalbtreppe" + +#: src/_locale_workbench.lua:30 +msgid "Cactus Brick Stair" +msgstr "Kaktusziegeltreppe" + +#: src/_locale_workbench.lua:31 +msgid "Cactus Brick Slab" +msgstr "Kaktusziegelplatte" + +#: src/_locale_workbench.lua:32 +msgid "Inner Cactus Brick Stair" +msgstr "Innere Kaktusziegeltreppe" + +#: src/_locale_workbench.lua:33 +msgid "Outer Cactus Brick Stair" +msgstr "Äußere Kaktusziegeltreppe" + +#: src/_locale_workbench.lua:34 +msgid "Cactus Brick Nanoslab" +msgstr "Kaktusziegelnanoplatte" + +#: src/_locale_workbench.lua:35 +msgid "Cactus Brick Micropanel" +msgstr "Kaktusziegelmikropaneel" + +#: src/_locale_workbench.lua:36 +msgid "Cactus Brick Microslab" +msgstr "Kaktusziegelmikroplatte" + +#: src/_locale_workbench.lua:37 +msgid "Cactus Brick Thin Stair" +msgstr "Kaktusziegelflachtreppe" + +#: src/_locale_workbench.lua:38 +msgid "Cactus Brick Cube" +msgstr "Kaktusziegelwürfel" + +#: src/_locale_workbench.lua:39 +msgid "Cactus Brick Panel" +msgstr "Kaktusziegelpaneel" + +#: src/_locale_workbench.lua:40 +msgid "Cactus Brick Double Panel" +msgstr "Kaktusziegeldoppelpaneel" + +#: src/_locale_workbench.lua:41 +msgid "Cactus Brick Half-Stair" +msgstr "Kaktusziegelhalbtreppe" + +#: src/_locale_workbench.lua:42 +msgid "Coal Stone Tile Stair" +msgstr "Kohlesteinkacheltreppe" + +#: src/_locale_workbench.lua:43 +msgid "Coal Stone Tile Slab" +msgstr "Kohlesteinkachelplatte" + +#: src/_locale_workbench.lua:44 +msgid "Inner Coal Stone Tile Stair" +msgstr "Innere Kohlesteinkacheltreppe" + +#: src/_locale_workbench.lua:45 +msgid "Outer Coal Stone Tile Stair" +msgstr "Äußere Kohlesteinkacheltreppe" + +#: src/_locale_workbench.lua:46 +msgid "Coal Stone Tile Nanoslab" +msgstr "Kohlesteinkachelnanoplatte" + +#: src/_locale_workbench.lua:47 +msgid "Coal Stone Tile Micropanel" +msgstr "Kohlesteinkachelmikropaneel" + +#: src/_locale_workbench.lua:48 +msgid "Coal Stone Tile Microslab" +msgstr "Kohlesteinkachelmikroplatte" + +#: src/_locale_workbench.lua:49 +msgid "Coal Stone Tile Thin Stair" +msgstr "Kohlesteinkachelflachtreppe" + +#: src/_locale_workbench.lua:50 +msgid "Coal Stone Tile Cube" +msgstr "Kohlesteinkachelwürfel" + +#: src/_locale_workbench.lua:51 +msgid "Coal Stone Tile Panel" +msgstr "Kohlesteinkachelpaneel" + +#: src/_locale_workbench.lua:52 +msgid "Coal Stone Tile Double Panel" +msgstr "Kohlesteinkacheldoppelpaneel" + +#: src/_locale_workbench.lua:53 +msgid "Coal Stone Tile Half-Stair" +msgstr "Kohlesteinkachelhalbtreppe" + +#: src/_locale_workbench.lua:54 +msgid "Polished Desert Stone Block Stair" +msgstr "Hochglanzwüstensteinblocktreppe" + +#: src/_locale_workbench.lua:55 +msgid "Polished Desert Stone Block Slab" +msgstr "Hochglanzwüstensteinblockplatte" + +#: src/_locale_workbench.lua:56 +msgid "Inner Polished Desert Stone Block Stair" +msgstr "Innere Hochglanzwüstensteinblocktreppe" + +#: src/_locale_workbench.lua:57 +msgid "Outer Polished Desert Stone Block Stair" +msgstr "Äußere Hochglanzwüstensteinblocktreppe" + +#: src/_locale_workbench.lua:58 +msgid "Polished Desert Stone Block Nanoslab" +msgstr "Hochglanzwüstensteinblocknanoplatte" + +#: src/_locale_workbench.lua:59 +msgid "Polished Desert Stone Block Micropanel" +msgstr "Hochglanzwüstensteinblockmikropaneel" + +#: src/_locale_workbench.lua:60 +msgid "Polished Desert Stone Block Microslab" +msgstr "Hochglanzwüstensteinblockmikroplatte" + +#: src/_locale_workbench.lua:61 +msgid "Polished Desert Stone Block Thin Stair" +msgstr "Hochglanzwüstensteinblockflachtreppe" + +#: src/_locale_workbench.lua:62 +msgid "Polished Desert Stone Block Cube" +msgstr "Hochglanzwüstensteinblockwürfel" + +#: src/_locale_workbench.lua:63 +msgid "Polished Desert Stone Block Panel" +msgstr "Hochglanzwüstensteinblockpaneel" + +#: src/_locale_workbench.lua:64 +msgid "Polished Desert Stone Block Double Panel" +msgstr "Hochglanzwüstensteinblockdoppelpaneel" + +#: src/_locale_workbench.lua:65 +msgid "Polished Desert Stone Block Half-Stair" +msgstr "Hochglanzwüstensteinblockhalbtreppe" + +#: src/_locale_workbench.lua:66 +msgid "Hardened Clay Stair" +msgstr "Gehärtete Tontreppe" + +#: src/_locale_workbench.lua:67 +msgid "Hardened Clay Slab" +msgstr "Gehärtete Tonplatte" + +#: src/_locale_workbench.lua:68 +msgid "Inner Hardened Clay Stair" +msgstr "Innere gehärtete Tontreppe" + +#: src/_locale_workbench.lua:69 +msgid "Outer Hardened Clay Stair" +msgstr "Äußere gehärtete Tontreppe" + +#: src/_locale_workbench.lua:70 +msgid "Hardened Clay Nanoslab" +msgstr "Gehärtete Tonnanoplatte" + +#: src/_locale_workbench.lua:71 +msgid "Hardened Clay Micropanel" +msgstr "Gehärtetes Tonmikropaneel" + +#: src/_locale_workbench.lua:72 +msgid "Hardened Clay Microslab" +msgstr "Gehärtete Tonmikroplatte" + +#: src/_locale_workbench.lua:73 +msgid "Hardened Clay Thin Stair" +msgstr "Gehärtete Tonflachtreppe" + +#: src/_locale_workbench.lua:74 +msgid "Hardened Clay Cube" +msgstr "Gehärteter Tonwürfel" + +#: src/_locale_workbench.lua:75 +msgid "Hardened Clay Panel" +msgstr "Gehärtetes Tonpaneel" + +#: src/_locale_workbench.lua:76 +msgid "Hardened Clay Double Panel" +msgstr "Gehärtetes Tondoppelpaneel" + +#: src/_locale_workbench.lua:77 +msgid "Hardened Clay Half-Stair" +msgstr "Gehärtete Tonhalbtreppe" + +#: src/_locale_workbench.lua:78 +msgid "Moon Brick Stair" +msgstr "Mondziegeltreppe" + +#: src/_locale_workbench.lua:79 +msgid "Moon Brick Slab" +msgstr "Mondziegelplatte" + +#: src/_locale_workbench.lua:80 +msgid "Inner Moon Brick Stair" +msgstr "Innere Mondziegeltreppe" + +#: src/_locale_workbench.lua:81 +msgid "Outer Moon Brick Stair" +msgstr "Äußere Mondziegeltreppe" + +#: src/_locale_workbench.lua:82 +msgid "Moon Brick Nanoslab" +msgstr "Mondziegelnanoplatte" + +#: src/_locale_workbench.lua:83 +msgid "Moon Brick Micropanel" +msgstr "Mondziegelmikropaneel" + +#: src/_locale_workbench.lua:84 +msgid "Moon Brick Microslab" +msgstr "Mondziegelmikroplatte" + +#: src/_locale_workbench.lua:85 +msgid "Moon Brick Thin Stair" +msgstr "Mondziegelflachtreppe" + +#: src/_locale_workbench.lua:86 +msgid "Moon Brick Cube" +msgstr "Mondziegelwürfel" + +#: src/_locale_workbench.lua:87 +msgid "Moon Brick Panel" +msgstr "Mondziegelpaneel" + +#: src/_locale_workbench.lua:88 +msgid "Moon Brick Double Panel" +msgstr "Mondziegeldoppelpaneel" + +#: src/_locale_workbench.lua:89 +msgid "Moon Brick Half-Stair" +msgstr "Mondziegelhalbtreppe" + +#: src/_locale_workbench.lua:90 +msgid "Packed Ice Stair" +msgstr "Packeistreppe" + +#: src/_locale_workbench.lua:91 +msgid "Packed Ice Slab" +msgstr "Packeisplatte" + +#: src/_locale_workbench.lua:92 +msgid "Inner Packed Ice Stair" +msgstr "Innere Packeistreppe" + +#: src/_locale_workbench.lua:93 +msgid "Outer Packed Ice Stair" +msgstr "Äußere Packeistreppe" + +#: src/_locale_workbench.lua:94 +msgid "Packed Ice Nanoslab" +msgstr "Packeisnanoplatte" + +#: src/_locale_workbench.lua:95 +msgid "Packed Ice Micropanel" +msgstr "Packeismikropaneel" + +#: src/_locale_workbench.lua:96 +msgid "Packed Ice Microslab" +msgstr "Packeismikroplatte" + +#: src/_locale_workbench.lua:97 +msgid "Packed Ice Thin Stair" +msgstr "Packeisflachtreppe" + +#: src/_locale_workbench.lua:98 +msgid "Packed Ice Cube" +msgstr "Packeiswürfel" + +#: src/_locale_workbench.lua:99 +msgid "Packed Ice Panel" +msgstr "Packeispaneel" + +#: src/_locale_workbench.lua:100 +msgid "Packed Ice Double Panel" +msgstr "Packeisdoppelpaneel" + +#: src/_locale_workbench.lua:101 +msgid "Packed Ice Half-Stair" +msgstr "Packeishalbtreppe" + +#: src/_locale_workbench.lua:102 +msgid "Runestone Stair" +msgstr "Runensteintreppe" + +#: src/_locale_workbench.lua:103 +msgid "Runestone Slab" +msgstr "Runensteinplatte" + +#: src/_locale_workbench.lua:104 +msgid "Inner Runestone Stair" +msgstr "Innere Runensteintreppe" + +#: src/_locale_workbench.lua:105 +msgid "Outer Runestone Stair" +msgstr "Äußere Runensteintreppe" + +#: src/_locale_workbench.lua:106 +msgid "Runestone Nanoslab" +msgstr "Runensteinnanoplatte" + +#: src/_locale_workbench.lua:107 +msgid "Runestone Micropanel" +msgstr "Runensteinmikropaneel" + +#: src/_locale_workbench.lua:108 +msgid "Runestone Microslab" +msgstr "Runensteinmikroplatte" + +#: src/_locale_workbench.lua:109 +msgid "Runestone Thin Stair" +msgstr "Runensteinflachtreppe" + +#: src/_locale_workbench.lua:110 +msgid "Runestone Cube" +msgstr "Runensteinwürfel" + +#: src/_locale_workbench.lua:111 +msgid "Runestone Panel" +msgstr "Runensteinpaneel" + +#: src/_locale_workbench.lua:112 +msgid "Runestone Double Panel" +msgstr "Runensteindoppelpaneel" + +#: src/_locale_workbench.lua:113 +msgid "Runestone Half-Stair" +msgstr "Runensteinhalbtreppe" + +#: src/_locale_workbench.lua:114 +msgid "Polished Stone Block Stair" +msgstr "Hochglanzsteinblocktreppe" + +#: src/_locale_workbench.lua:115 +msgid "Polished Stone Block Slab" +msgstr "Hochglanzsteinblockplatte" + +#: src/_locale_workbench.lua:116 +msgid "Inner Polished Stone Block Stair" +msgstr "Innere Hochglanzsteinblocktreppe" + +#: src/_locale_workbench.lua:117 +msgid "Outer Polished Stone Block Stair" +msgstr "Äußere Hochglanzsteinblocktreppe" + +#: src/_locale_workbench.lua:118 +msgid "Polished Stone Block Nanoslab" +msgstr "Hochglanzsteinblocknanoplatte" + +#: src/_locale_workbench.lua:119 +msgid "Polished Stone Block Micropanel" +msgstr "Hochglanzsteinblockmikropaneel" + +#: src/_locale_workbench.lua:120 +msgid "Polished Stone Block Microslab" +msgstr "Hochglanzsteinblockmikroplatte" + +#: src/_locale_workbench.lua:121 +msgid "Polished Stone Block Thin Stair" +msgstr "Hochglanzsteinblockflachtreppe" + +#: src/_locale_workbench.lua:122 +msgid "Polished Stone Block Cube" +msgstr "Hochglanzsteinblockwürfel" + +#: src/_locale_workbench.lua:123 +msgid "Polished Stone Block Panel" +msgstr "Hochglanzsteinblockpaneel" + +#: src/_locale_workbench.lua:124 +msgid "Polished Stone Block Double Panel" +msgstr "Hochglanzsteinblockdoppelpaneel" + +#: src/_locale_workbench.lua:125 +msgid "Polished Stone Block Half-Stair" +msgstr "Hochglanzsteinblockhalbtreppe" + +#: src/_locale_workbench.lua:126 +msgid "Wooden Tile Stair" +msgstr "Holzkacheltreppe" + +#: src/_locale_workbench.lua:127 +msgid "Wooden Tile Slab" +msgstr "Holzkachelplatte" + +#: src/_locale_workbench.lua:128 +msgid "Inner Wooden Tile Stair" +msgstr "Innere Holzkacheltreppe" + +#: src/_locale_workbench.lua:129 +msgid "Outer Wooden Tile Stair" +msgstr "Äußere Holzkacheltreppe" + +#: src/_locale_workbench.lua:130 +msgid "Wooden Tile Nanoslab" +msgstr "Holzkachelnanoplatte" + +#: src/_locale_workbench.lua:131 +msgid "Wooden Tile Micropanel" +msgstr "Holzkachelmikropaneel" + +#: src/_locale_workbench.lua:132 +msgid "Wooden Tile Microslab" +msgstr "Holzkachelmikroplatte" + +#: src/_locale_workbench.lua:133 +msgid "Wooden Tile Thin Stair" +msgstr "Holzkachelflachtreppe" + +#: src/_locale_workbench.lua:134 +msgid "Wooden Tile Cube" +msgstr "Holzkachelwürfel" + +#: src/_locale_workbench.lua:135 +msgid "Wooden Tile Panel" +msgstr "Holzkachelpaneel" + +#: src/_locale_workbench.lua:136 +msgid "Wooden Tile Double Panel" +msgstr "Holzkacheldoppelpaneel" + +#: src/_locale_workbench.lua:137 +msgid "Wooden Tile Half-Stair" +msgstr "Holzkachelhalbtreppe" + +#: src/_locale_workbench.lua:138 +msgid "Wood Framed Glass Stair" +msgstr "Holzrahmenglastreppe" + +#: src/_locale_workbench.lua:139 +msgid "Inner Wood Framed Glass Stair" +msgstr "Innere Holzrahmenglastreppe" + +#: src/_locale_workbench.lua:140 +msgid "Outer Wood Framed Glass Stair" +msgstr "Äußere Holzrahmenglastreppe" + +#: src/_locale_workbench.lua:141 +msgid "Wood Framed Glass Slab" +msgstr "Holzrahmenglasplatte" + +#: src/_locale_workbench.lua:142 +msgid "Wood Framed Glass Nanoslab" +msgstr "Holzrahmenglasnanoplatte" + +#: src/_locale_workbench.lua:143 +msgid "Wood Framed Glass Micropanel" +msgstr "Holzrahmenglasmikropaneel" + +#: src/_locale_workbench.lua:144 +msgid "Wood Framed Glass Microslab" +msgstr "Holzrahmenglasmikroplatte" + +#: src/_locale_workbench.lua:145 +msgid "Wood Framed Glass Thin Stair" +msgstr "Holzrahmenglasflachtreppe" + +#: src/_locale_workbench.lua:146 +msgid "Wood Framed Glass Cube" +msgstr "Holzrahmenglaswürfel" + +#: src/_locale_workbench.lua:147 +msgid "Wood Framed Glass Panel" +msgstr "Holzrahmenglaspaneel" + +#: src/_locale_workbench.lua:148 +msgid "Wood Framed Glass Double Panel" +msgstr "Holzrahmenglasdoppelpaneel" + +#: src/_locale_workbench.lua:149 +msgid "Wood Framed Glass Half-Stair" +msgstr "Holzrahmenglashalbtreppe" + +#: src/_locale_workbench.lua:150 +msgid "Acacia Tree Stair" +msgstr "Akazienbaumtreppe" + +#: src/_locale_workbench.lua:151 +msgid "Acacia Tree Slab" +msgstr "Akazienbaumplatte" + +#: src/_locale_workbench.lua:152 +msgid "Inner Acacia Tree Stair" +msgstr "Innere Akazienbaumtreppe" + +#: src/_locale_workbench.lua:153 +msgid "Outer Acacia Tree Stair" +msgstr "Äußere Akazienbaumtreppe" + +#: src/_locale_workbench.lua:154 +msgid "Acacia Tree Nanoslab" +msgstr "Akazienbaumnanoplatte" + +#: src/_locale_workbench.lua:155 +msgid "Acacia Tree Micropanel" +msgstr "Akazienbaummikropaneel" + +#: src/_locale_workbench.lua:156 +msgid "Acacia Tree Microslab" +msgstr "Akazienbaummikroplatte" + +#: src/_locale_workbench.lua:157 +msgid "Acacia Tree Thin Stair" +msgstr "Akazienbaumflachtreppe" + +#: src/_locale_workbench.lua:158 +msgid "Acacia Tree Cube" +msgstr "Akazienbaumwürfel" + +#: src/_locale_workbench.lua:159 +msgid "Acacia Tree Panel" +msgstr "Akazienbaumpaneel" + +#: src/_locale_workbench.lua:160 +msgid "Acacia Tree Double Panel" +msgstr "Akazienbaumdoppelpaneel" + +#: src/_locale_workbench.lua:161 +msgid "Acacia Tree Half-Stair" +msgstr "Akazienbaumhalbtreppe" + +#: src/_locale_workbench.lua:162 +msgid "Acacia Wood Planks Nanoslab" +msgstr "Akazienholzplankennanoplatte" + +#: src/_locale_workbench.lua:163 +msgid "Acacia Wood Planks Micropanel" +msgstr "Akazienholzplankenmikropaneel" + +#: src/_locale_workbench.lua:164 +msgid "Acacia Wood Planks Microslab" +msgstr "Akazienholzplankenmikroplatte" + +#: src/_locale_workbench.lua:165 +msgid "Acacia Wood Planks Thin Stair" +msgstr "Akazienholzplankenflachtreppe" + +#: src/_locale_workbench.lua:166 +msgid "Acacia Wood Planks Cube" +msgstr "Akazienholzplankenwürfel" + +#: src/_locale_workbench.lua:167 +msgid "Acacia Wood Planks Panel" +msgstr "Akazienholzplankenpaneel" + +#: src/_locale_workbench.lua:168 +msgid "Acacia Wood Planks Double Panel" +msgstr "Akazienholzplankendoppelpaneel" + +#: src/_locale_workbench.lua:169 +msgid "Acacia Wood Planks Half-Stair" +msgstr "Akazienholzplankenhalbtreppe" + +#: src/_locale_workbench.lua:170 +msgid "Aspen Tree Stair" +msgstr "Espenbaumtreppe" + +#: src/_locale_workbench.lua:171 +msgid "Aspen Tree Slab" +msgstr "Espenbaumplatte" + +#: src/_locale_workbench.lua:172 +msgid "Inner Aspen Tree Stair" +msgstr "Innere Espenbaumtreppe" + +#: src/_locale_workbench.lua:173 +msgid "Outer Aspen Tree Stair" +msgstr "Äußere Espenbaumtreppe" + +#: src/_locale_workbench.lua:174 +msgid "Aspen Tree Nanoslab" +msgstr "Espenbaumnanoplatte" + +#: src/_locale_workbench.lua:175 +msgid "Aspen Tree Micropanel" +msgstr "Espenbaummikropaneel" + +#: src/_locale_workbench.lua:176 +msgid "Aspen Tree Microslab" +msgstr "Espenbaummikroplatte" + +#: src/_locale_workbench.lua:177 +msgid "Aspen Tree Thin Stair" +msgstr "Espenbaumflachtreppe" + +#: src/_locale_workbench.lua:178 +msgid "Aspen Tree Cube" +msgstr "Espenbaumwürfel" + +#: src/_locale_workbench.lua:179 +msgid "Aspen Tree Panel" +msgstr "Espenbaumpaneel" + +#: src/_locale_workbench.lua:180 +msgid "Aspen Tree Double Panel" +msgstr "Espenbaumdoppelpaneel" + +#: src/_locale_workbench.lua:181 +msgid "Aspen Tree Half-Stair" +msgstr "Espenbaumhalbtreppe" + +#: src/_locale_workbench.lua:182 +msgid "Aspen Wood Planks Nanoslab" +msgstr "Espenholzplankennanoplatte" + +#: src/_locale_workbench.lua:183 +msgid "Aspen Wood Planks Micropanel" +msgstr "Espenholzplankenmikropaneel" + +#: src/_locale_workbench.lua:184 +msgid "Aspen Wood Planks Microslab" +msgstr "Espenholzplankenmikroplatte" + +#: src/_locale_workbench.lua:185 +msgid "Aspen Wood Planks Thin Stair" +msgstr "Espenholzplankenflachtreppe" + +#: src/_locale_workbench.lua:186 +msgid "Aspen Wood Planks Cube" +msgstr "Espenholzplankenwürfel" + +#: src/_locale_workbench.lua:187 +msgid "Aspen Wood Planks Panel" +msgstr "Espenholzplankenpaneel" + +#: src/_locale_workbench.lua:188 +msgid "Aspen Wood Planks Double Panel" +msgstr "Espenholzplankendoppelpaneel" + +#: src/_locale_workbench.lua:189 +msgid "Aspen Wood Planks Half-Stair" +msgstr "Espenholzplankenhalbtreppe" + +#: src/_locale_workbench.lua:190 +msgid "Brick Block Nanoslab" +msgstr "Ziegelblocknanoplatte" + +#: src/_locale_workbench.lua:191 +msgid "Brick Block Micropanel" +msgstr "Ziegelblockmikropaneel" + +#: src/_locale_workbench.lua:192 +msgid "Brick Block Microslab" +msgstr "Ziegelblockmikroplatte" + +#: src/_locale_workbench.lua:193 +msgid "Brick Block Thin Stair" +msgstr "Ziegelblockflachtreppe" + +#: src/_locale_workbench.lua:194 +msgid "Brick Block Cube" +msgstr "Ziegelblockwürfel" + +#: src/_locale_workbench.lua:195 +msgid "Brick Block Panel" +msgstr "Ziegelblockpaneel" + +#: src/_locale_workbench.lua:196 +msgid "Brick Block Double Panel" +msgstr "Ziegelblockdoppelpaneel" + +#: src/_locale_workbench.lua:197 +msgid "Brick Block Half-Stair" +msgstr "Ziegelblockhalbtreppe" + +#: src/_locale_workbench.lua:198 +msgid "Bronze Block Nanoslab" +msgstr "Bronzeblocknanoplatte" + +#: src/_locale_workbench.lua:199 +msgid "Bronze Block Micropanel" +msgstr "Bronzeblockmikropaneel" + +#: src/_locale_workbench.lua:200 +msgid "Bronze Block Microslab" +msgstr "Bronzeblockmikroplatte" + +#: src/_locale_workbench.lua:201 +msgid "Bronze Block Thin Stair" +msgstr "Bronzeblockflachtreppe" + +#: src/_locale_workbench.lua:202 +msgid "Bronze Block Cube" +msgstr "Bronzeblockwürfel" + +#: src/_locale_workbench.lua:203 +msgid "Bronze Block Panel" +msgstr "Bronzeblockpaneel" + +#: src/_locale_workbench.lua:204 +msgid "Bronze Block Double Panel" +msgstr "Bronzeblockdoppelpaneel" + +#: src/_locale_workbench.lua:205 +msgid "Bronze Block Half-Stair" +msgstr "Bronzeblockhalbtreppe" + +#: src/_locale_workbench.lua:206 +msgid "Cactus Stair" +msgstr "Kaktustreppe" + +#: src/_locale_workbench.lua:207 +msgid "Cactus Slab" +msgstr "Kaktusplatte" + +#: src/_locale_workbench.lua:208 +msgid "Inner Cactus Stair" +msgstr "Innere Kaktustreppe" + +#: src/_locale_workbench.lua:209 +msgid "Outer Cactus Stair" +msgstr "Äußere Kaktustreppe" + +#: src/_locale_workbench.lua:210 +msgid "Cactus Nanoslab" +msgstr "Kaktusnanoplatte" + +#: src/_locale_workbench.lua:211 +msgid "Cactus Micropanel" +msgstr "Kaktusmikropaneel" + +#: src/_locale_workbench.lua:212 +msgid "Cactus Microslab" +msgstr "Kaktusmikroplatte" + +#: src/_locale_workbench.lua:213 +msgid "Cactus Thin Stair" +msgstr "Kaktusflachtreppe" + +#: src/_locale_workbench.lua:214 +msgid "Cactus Cube" +msgstr "Kaktuswürfel" + +#: src/_locale_workbench.lua:215 +msgid "Cactus Panel" +msgstr "Kaktuspaneel" + +#: src/_locale_workbench.lua:216 +msgid "Cactus Double Panel" +msgstr "Kaktusdoppelpaneel" + +#: src/_locale_workbench.lua:217 +msgid "Cactus Half-Stair" +msgstr "Kaktushalbtreppe" + +#: src/_locale_workbench.lua:218 +msgid "Coal Block Stair" +msgstr "Kohleblocktreppe" + +#: src/_locale_workbench.lua:219 +msgid "Coal Block Slab" +msgstr "Kohleblockplatte" + +#: src/_locale_workbench.lua:220 +msgid "Inner Coal Block Stair" +msgstr "Innere Kohleblocktreppe" + +#: src/_locale_workbench.lua:221 +msgid "Outer Coal Block Stair" +msgstr "Äußere Kohleblocktreppe" + +#: src/_locale_workbench.lua:222 +msgid "Coal Block Nanoslab" +msgstr "Kohleblocknanoplatte" + +#: src/_locale_workbench.lua:223 +msgid "Coal Block Micropanel" +msgstr "Kohleblockmikropaneel" + +#: src/_locale_workbench.lua:224 +msgid "Coal Block Microslab" +msgstr "Kohleblockmikroplatte" + +#: src/_locale_workbench.lua:225 +msgid "Coal Block Thin Stair" +msgstr "Kohleblockflachtreppe" + +#: src/_locale_workbench.lua:226 +msgid "Coal Block Cube" +msgstr "Kohleblockwürfel" + +#: src/_locale_workbench.lua:227 +msgid "Coal Block Panel" +msgstr "Kohleblockpaneel" + +#: src/_locale_workbench.lua:228 +msgid "Coal Block Double Panel" +msgstr "Kohleblockdoppelpaneel" + +#: src/_locale_workbench.lua:229 +msgid "Coal Block Half-Stair" +msgstr "Kohleblockhalbtreppe" + +#: src/_locale_workbench.lua:230 +msgid "Cobblestone Nanoslab" +msgstr "Kopfsteinpflasternanoplatte" + +#: src/_locale_workbench.lua:231 +msgid "Cobblestone Micropanel" +msgstr "Kopfsteinpflastermikropaneel" + +#: src/_locale_workbench.lua:232 +msgid "Cobblestone Microslab" +msgstr "Kopfsteinpflastermikroplatte" + +#: src/_locale_workbench.lua:233 +msgid "Cobblestone Thin Stair" +msgstr "Kopfsteinpflasterflachtreppe" + +#: src/_locale_workbench.lua:234 +msgid "Cobblestone Cube" +msgstr "Kopfsteinpflasterwürfel" + +#: src/_locale_workbench.lua:235 +msgid "Cobblestone Panel" +msgstr "Kopfsteinpflasterpaneel" + +#: src/_locale_workbench.lua:236 +msgid "Cobblestone Double Panel" +msgstr "Kopfsteinpflasterdoppelpaneel" + +#: src/_locale_workbench.lua:237 +msgid "Cobblestone Half-Stair" +msgstr "Kopfsteinpflasterhalbtreppe" + +#: src/_locale_workbench.lua:238 +msgid "Copper Block Nanoslab" +msgstr "Kupferblocknanoplatte" + +#: src/_locale_workbench.lua:239 +msgid "Copper Block Micropanel" +msgstr "Kupferblockmikropaneel" + +#: src/_locale_workbench.lua:240 +msgid "Copper Block Microslab" +msgstr "Kupferblockmikroplatte" + +#: src/_locale_workbench.lua:241 +msgid "Copper Block Thin Stair" +msgstr "Kupferblockflachtreppe" + +#: src/_locale_workbench.lua:242 +msgid "Copper Block Cube" +msgstr "Kupferblockwürfel" + +#: src/_locale_workbench.lua:243 +msgid "Copper Block Panel" +msgstr "Kupferblockpaneel" + +#: src/_locale_workbench.lua:244 +msgid "Copper Block Double Panel" +msgstr "Kupferblockdoppelpaneel" + +#: src/_locale_workbench.lua:245 +msgid "Copper Block Half-Stair" +msgstr "Kupferblockhalbtreppe" + +#: src/_locale_workbench.lua:246 +msgid "Brown Coral Stair" +msgstr "Braune Korallentreppe" + +#: src/_locale_workbench.lua:247 +msgid "Brown Coral Slab" +msgstr "Braune Korallenplatte" + +#: src/_locale_workbench.lua:248 +msgid "Inner Brown Coral Stair" +msgstr "Innere braune Korallentreppe" + +#: src/_locale_workbench.lua:249 +msgid "Outer Brown Coral Stair" +msgstr "Äußere braune Korallentreppe" + +#: src/_locale_workbench.lua:250 +msgid "Brown Coral Nanoslab" +msgstr "Braune Korallennanoplatte" + +#: src/_locale_workbench.lua:251 +msgid "Brown Coral Micropanel" +msgstr "Braunes Korallenmikropaneel" + +#: src/_locale_workbench.lua:252 +msgid "Brown Coral Microslab" +msgstr "Braune Korallenmikroplatte" + +#: src/_locale_workbench.lua:253 +msgid "Brown Coral Thin Stair" +msgstr "Braune Korallenflachtreppe" + +#: src/_locale_workbench.lua:254 +msgid "Brown Coral Cube" +msgstr "Brauner Korallenwürfel" + +#: src/_locale_workbench.lua:255 +msgid "Brown Coral Panel" +msgstr "Braunes Korallenpaneel" + +#: src/_locale_workbench.lua:256 +msgid "Brown Coral Double Panel" +msgstr "Braunes Korallendoppelpaneel" + +#: src/_locale_workbench.lua:257 +msgid "Brown Coral Half-Stair" +msgstr "Braune Korallenhalbtreppe" + +#: src/_locale_workbench.lua:258 +msgid "Orange Coral Stair" +msgstr "Orange Korallentreppe" + +#: src/_locale_workbench.lua:259 +msgid "Orange Coral Slab" +msgstr "Orange Korallenplatte" + +#: src/_locale_workbench.lua:260 +msgid "Inner Orange Coral Stair" +msgstr "Innere orange Korallentreppe" + +#: src/_locale_workbench.lua:261 +msgid "Outer Orange Coral Stair" +msgstr "Äußere orange Korallentreppe" + +#: src/_locale_workbench.lua:262 +msgid "Orange Coral Nanoslab" +msgstr "Orange Korallennanoplatte" + +#: src/_locale_workbench.lua:263 +msgid "Orange Coral Micropanel" +msgstr "Orange Korallenmikropaneel" + +#: src/_locale_workbench.lua:264 +msgid "Orange Coral Microslab" +msgstr "Orange Korallenmikroplatte" + +#: src/_locale_workbench.lua:265 +msgid "Orange Coral Thin Stair" +msgstr "Orange Korallenflachtreppe" + +#: src/_locale_workbench.lua:266 +msgid "Orange Coral Cube" +msgstr "Orange Korallenwürfel" + +#: src/_locale_workbench.lua:267 +msgid "Orange Coral Panel" +msgstr "Orange Korallenpaneel" + +#: src/_locale_workbench.lua:268 +msgid "Orange Coral Double Panel" +msgstr "Orange Korallendoppelpaneel" + +#: src/_locale_workbench.lua:269 +msgid "Orange Coral Half-Stair" +msgstr "Orange Korallenhalbtreppe" + +#: src/_locale_workbench.lua:270 +msgid "Coral Skeleton Stair" +msgstr "Korallenskeletttreppe" + +#: src/_locale_workbench.lua:271 +msgid "Coral Skeleton Slab" +msgstr "Korallenskelettplatte" + +#: src/_locale_workbench.lua:272 +msgid "Inner Coral Skeleton Stair" +msgstr "Innere Korallenskeletttreppe" + +#: src/_locale_workbench.lua:273 +msgid "Outer Coral Skeleton Stair" +msgstr "Äußere Korallenskeletttreppe" + +#: src/_locale_workbench.lua:274 +msgid "Coral Skeleton Nanoslab" +msgstr "Korallenskelettnanoplatte" + +#: src/_locale_workbench.lua:275 +msgid "Coral Skeleton Micropanel" +msgstr "Korallenskelettmikropaneel" + +#: src/_locale_workbench.lua:276 +msgid "Coral Skeleton Microslab" +msgstr "Korallenskelettmikroplatte" + +#: src/_locale_workbench.lua:277 +msgid "Coral Skeleton Thin Stair" +msgstr "Korallenskelettflachtreppe" + +#: src/_locale_workbench.lua:278 +msgid "Coral Skeleton Cube" +msgstr "Korallenskelettwürfel" + +#: src/_locale_workbench.lua:279 +msgid "Coral Skeleton Panel" +msgstr "Korallenskelettpaneel" + +#: src/_locale_workbench.lua:280 +msgid "Coral Skeleton Double Panel" +msgstr "Korallenskelettdoppelpaneel" + +#: src/_locale_workbench.lua:281 +msgid "Coral Skeleton Half-Stair" +msgstr "Korallenskeletthalbtreppe" + +#: src/_locale_workbench.lua:282 +msgid "Desert Cobblestone Nanoslab" +msgstr "Wüstenkopfsteinpflasternanoplatte" + +#: src/_locale_workbench.lua:283 +msgid "Desert Cobblestone Micropanel" +msgstr "Wüstenkopfsteinpflastermikropaneel" + +#: src/_locale_workbench.lua:284 +msgid "Desert Cobblestone Microslab" +msgstr "Wüstenkopfsteinpflastermikroplatte" + +#: src/_locale_workbench.lua:285 +msgid "Desert Cobblestone Thin Stair" +msgstr "Wüstenkopfsteinpflasterflachtreppe" + +#: src/_locale_workbench.lua:286 +msgid "Desert Cobblestone Cube" +msgstr "Wüstenkopfsteinpflasterwürfel" + +#: src/_locale_workbench.lua:287 +msgid "Desert Cobblestone Panel" +msgstr "Wüstenkopfsteinpflasterpaneel" + +#: src/_locale_workbench.lua:288 +msgid "Desert Cobblestone Double Panel" +msgstr "Wüstenkopfsteinpflasterdoppelpaneel" + +#: src/_locale_workbench.lua:289 +msgid "Desert Cobblestone Half-Stair" +msgstr "Wüstenkopfsteinpflasterhalbtreppe" + +#: src/_locale_workbench.lua:290 +msgid "Desert Sandstone Nanoslab" +msgstr "Wüstensandsteinnanoplatte" + +#: src/_locale_workbench.lua:291 +msgid "Desert Sandstone Micropanel" +msgstr "Wüstensandsteinmikropaneel" + +#: src/_locale_workbench.lua:292 +msgid "Desert Sandstone Microslab" +msgstr "Wüstensandsteinmikroplatte" + +#: src/_locale_workbench.lua:293 +msgid "Desert Sandstone Thin Stair" +msgstr "Wüstensandsteinflachtreppe" + +#: src/_locale_workbench.lua:294 +msgid "Desert Sandstone Cube" +msgstr "Wüstensandsteinwürfel" + +#: src/_locale_workbench.lua:295 +msgid "Desert Sandstone Panel" +msgstr "Wüstensandsteinpaneel" + +#: src/_locale_workbench.lua:296 +msgid "Desert Sandstone Double Panel" +msgstr "Wüstensandsteindoppelpaneel" + +#: src/_locale_workbench.lua:297 +msgid "Desert Sandstone Half-Stair" +msgstr "Wüstensandsteinhalbtreppe" + +#: src/_locale_workbench.lua:298 +msgid "Desert Sandstone Block Nanoslab" +msgstr "Wüstensandsteinblocknanoplatte" + +#: src/_locale_workbench.lua:299 +msgid "Desert Sandstone Block Micropanel" +msgstr "Wüstensandsteinblockmikropaneel" + +#: src/_locale_workbench.lua:300 +msgid "Desert Sandstone Block Microslab" +msgstr "Wüstensandsteinblockmikroplatte" + +#: src/_locale_workbench.lua:301 +msgid "Desert Sandstone Block Thin Stair" +msgstr "Wüstensandsteinblockflachtreppe" + +#: src/_locale_workbench.lua:302 +msgid "Desert Sandstone Block Cube" +msgstr "Wüstensandsteinblockwürfel" + +#: src/_locale_workbench.lua:303 +msgid "Desert Sandstone Block Panel" +msgstr "Wüstensandsteinblockpaneel" + +#: src/_locale_workbench.lua:304 +msgid "Desert Sandstone Block Double Panel" +msgstr "Wüstensandsteinblockdoppelpaneel" + +#: src/_locale_workbench.lua:305 +msgid "Desert Sandstone Block Half-Stair" +msgstr "Wüstensandsteinblockhalbtreppe" + +#: src/_locale_workbench.lua:306 +msgid "Desert Sandstone Brick Nanoslab" +msgstr "Wüstensandsteinziegelnanoplatte" + +#: src/_locale_workbench.lua:307 +msgid "Desert Sandstone Brick Micropanel" +msgstr "Wüstensandsteinziegelmikropaneel" + +#: src/_locale_workbench.lua:308 +msgid "Desert Sandstone Brick Microslab" +msgstr "Wüstensandsteinziegelmikroplatte" + +#: src/_locale_workbench.lua:309 +msgid "Desert Sandstone Brick Thin Stair" +msgstr "Wüstensandsteinziegelflachtreppe" + +#: src/_locale_workbench.lua:310 +msgid "Desert Sandstone Brick Cube" +msgstr "Wüstensandsteinziegelwürfel" + +#: src/_locale_workbench.lua:311 +msgid "Desert Sandstone Brick Panel" +msgstr "Wüstensandsteinziegelpaneel" + +#: src/_locale_workbench.lua:312 +msgid "Desert Sandstone Brick Double Panel" +msgstr "Wüstensandsteinziegeldoppelpaneel" + +#: src/_locale_workbench.lua:313 +msgid "Desert Sandstone Brick Half-Stair" +msgstr "Wüstensandsteinziegelhalbtreppe" + +#: src/_locale_workbench.lua:314 +msgid "Desert Stone Nanoslab" +msgstr "Wüstensteinnanoplatte" + +#: src/_locale_workbench.lua:315 +msgid "Desert Stone Micropanel" +msgstr "Wüstensteinmikropaneel" + +#: src/_locale_workbench.lua:316 +msgid "Desert Stone Microslab" +msgstr "Wüstensteinmikroplatte" + +#: src/_locale_workbench.lua:317 +msgid "Desert Stone Thin Stair" +msgstr "Wüstensteinflachtreppe" + +#: src/_locale_workbench.lua:318 +msgid "Desert Stone Cube" +msgstr "Wüstensteinwürfel" + +#: src/_locale_workbench.lua:319 +msgid "Desert Stone Panel" +msgstr "Wüstensteinpaneel" + +#: src/_locale_workbench.lua:320 +msgid "Desert Stone Double Panel" +msgstr "Wüstensteindoppelpaneel" + +#: src/_locale_workbench.lua:321 +msgid "Desert Stone Half-Stair" +msgstr "Wüstensteinhalbtreppe" + +#: src/_locale_workbench.lua:322 +msgid "Desert Stone Block Nanoslab" +msgstr "Wüstensteinblocknanoplatte" + +#: src/_locale_workbench.lua:323 +msgid "Desert Stone Block Micropanel" +msgstr "Wüstensteinblockmikropaneel" + +#: src/_locale_workbench.lua:324 +msgid "Desert Stone Block Microslab" +msgstr "Wüstensteinblockmikroplatte" + +#: src/_locale_workbench.lua:325 +msgid "Desert Stone Block Thin Stair" +msgstr "Wüstensteinblockflachtreppe" + +#: src/_locale_workbench.lua:326 +msgid "Desert Stone Block Cube" +msgstr "Wüstensteinblockwürfel" + +#: src/_locale_workbench.lua:327 +msgid "Desert Stone Block Panel" +msgstr "Wüstensteinblockpaneel" + +#: src/_locale_workbench.lua:328 +msgid "Desert Stone Block Double Panel" +msgstr "Wüstensteinblockdoppelpaneel" + +#: src/_locale_workbench.lua:329 +msgid "Desert Stone Block Half-Stair" +msgstr "Wüstensteinblockhalbtreppe" + +#: src/_locale_workbench.lua:330 +msgid "Desert Stone Brick Nanoslab" +msgstr "Wüstensteinziegelnanoplatte" + +#: src/_locale_workbench.lua:331 +msgid "Desert Stone Brick Micropanel" +msgstr "Wüstensteinziegelmikropaneel" + +#: src/_locale_workbench.lua:332 +msgid "Desert Stone Brick Microslab" +msgstr "Wüstensteinziegelmikroplatte" + +#: src/_locale_workbench.lua:333 +msgid "Desert Stone Brick Thin Stair" +msgstr "Wüstensteinziegelflachtreppe" + +#: src/_locale_workbench.lua:334 +msgid "Desert Stone Brick Cube" +msgstr "Wüstensteinziegelwürfel" + +#: src/_locale_workbench.lua:335 +msgid "Desert Stone Brick Panel" +msgstr "Wüstensteinziegelpaneel" + +#: src/_locale_workbench.lua:336 +msgid "Desert Stone Brick Double Panel" +msgstr "Wüstensteinziegeldoppelpaneel" + +#: src/_locale_workbench.lua:337 +msgid "Desert Stone Brick Half-Stair" +msgstr "Wüstensteinziegelhalbtreppe" + +#: src/_locale_workbench.lua:338 +msgid "Diamond Block Stair" +msgstr "Diamantblocktreppe" + +#: src/_locale_workbench.lua:339 +msgid "Diamond Block Slab" +msgstr "Diamantblockplatte" + +#: src/_locale_workbench.lua:340 +msgid "Inner Diamond Block Stair" +msgstr "Innere Diamantblocktreppe" + +#: src/_locale_workbench.lua:341 +msgid "Outer Diamond Block Stair" +msgstr "Äußere Diamantblocktreppe" + +#: src/_locale_workbench.lua:342 +msgid "Diamond Block Nanoslab" +msgstr "Diamantblocknanoplatte" + +#: src/_locale_workbench.lua:343 +msgid "Diamond Block Micropanel" +msgstr "Diamantblockmikropaneel" + +#: src/_locale_workbench.lua:344 +msgid "Diamond Block Microslab" +msgstr "Diamantblockmikroplatte" + +#: src/_locale_workbench.lua:345 +msgid "Diamond Block Thin Stair" +msgstr "Diamantblockflachtreppe" + +#: src/_locale_workbench.lua:346 +msgid "Diamond Block Cube" +msgstr "Diamantblockwürfel" + +#: src/_locale_workbench.lua:347 +msgid "Diamond Block Panel" +msgstr "Diamantblockpaneel" + +#: src/_locale_workbench.lua:348 +msgid "Diamond Block Double Panel" +msgstr "Diamantblockdoppelpaneel" + +#: src/_locale_workbench.lua:349 +msgid "Diamond Block Half-Stair" +msgstr "Diamantblockhalbtreppe" + +#: src/_locale_workbench.lua:350 +msgid "Glass Nanoslab" +msgstr "Glasnanoplatte" + +#: src/_locale_workbench.lua:351 +msgid "Glass Micropanel" +msgstr "Glasmikropaneel" + +#: src/_locale_workbench.lua:352 +msgid "Glass Microslab" +msgstr "Glasmikroplatte" + +#: src/_locale_workbench.lua:353 +msgid "Glass Thin Stair" +msgstr "Glasflachtreppe" + +#: src/_locale_workbench.lua:354 +msgid "Glass Cube" +msgstr "Glaswürfel" + +#: src/_locale_workbench.lua:355 +msgid "Glass Panel" +msgstr "Glaspaneel" + +#: src/_locale_workbench.lua:356 +msgid "Glass Double Panel" +msgstr "Glasdoppelpaneel" + +#: src/_locale_workbench.lua:357 +msgid "Glass Half-Stair" +msgstr "Glashalbtreppe" + +#: src/_locale_workbench.lua:358 +msgid "Gold Block Nanoslab" +msgstr "Goldblocknanoplatte" + +#: src/_locale_workbench.lua:359 +msgid "Gold Block Micropanel" +msgstr "Goldblockmikropaneel" + +#: src/_locale_workbench.lua:360 +msgid "Gold Block Microslab" +msgstr "Goldblockmikroplatte" + +#: src/_locale_workbench.lua:361 +msgid "Gold Block Thin Stair" +msgstr "Goldblockflachtreppe" + +#: src/_locale_workbench.lua:362 +msgid "Gold Block Cube" +msgstr "Goldblockwürfel" + +#: src/_locale_workbench.lua:363 +msgid "Gold Block Panel" +msgstr "Goldblockpaneel" + +#: src/_locale_workbench.lua:364 +msgid "Gold Block Double Panel" +msgstr "Goldblockdoppelpaneel" + +#: src/_locale_workbench.lua:365 +msgid "Gold Block Half-Stair" +msgstr "Goldblockhalbtreppe" + +#: src/_locale_workbench.lua:366 +msgid "Ice Nanoslab" +msgstr "Eisnanoplatte" + +#: src/_locale_workbench.lua:367 +msgid "Ice Micropanel" +msgstr "Eismikropaneel" + +#: src/_locale_workbench.lua:368 +msgid "Ice Microslab" +msgstr "Eismikroplatte" + +#: src/_locale_workbench.lua:369 +msgid "Ice Thin Stair" +msgstr "Eisflachtreppe" + +#: src/_locale_workbench.lua:370 +msgid "Ice Cube" +msgstr "Eiswürfel" + +#: src/_locale_workbench.lua:371 +msgid "Ice Panel" +msgstr "Eispaneel" + +#: src/_locale_workbench.lua:372 +msgid "Ice Double Panel" +msgstr "Eisdoppelpaneel" + +#: src/_locale_workbench.lua:373 +msgid "Ice Half-Stair" +msgstr "Eishalbtreppe" + +#: src/_locale_workbench.lua:374 +msgid "Jungle Tree Stair" +msgstr "Dschungelbaumtreppe" + +#: src/_locale_workbench.lua:375 +msgid "Jungle Tree Slab" +msgstr "Dschungelbaumplatte" + +#: src/_locale_workbench.lua:376 +msgid "Inner Jungle Tree Stair" +msgstr "Innere Dschungelbaumtreppe" + +#: src/_locale_workbench.lua:377 +msgid "Outer Jungle Tree Stair" +msgstr "Äußere Dschungelbaumtreppe" + +#: src/_locale_workbench.lua:378 +msgid "Jungle Tree Nanoslab" +msgstr "Dschungelbaumnanoplatte" + +#: src/_locale_workbench.lua:379 +msgid "Jungle Tree Micropanel" +msgstr "Dschungelbaummikropaneel" + +#: src/_locale_workbench.lua:380 +msgid "Jungle Tree Microslab" +msgstr "Dschungelbaummikroplatte" + +#: src/_locale_workbench.lua:381 +msgid "Jungle Tree Thin Stair" +msgstr "Dschungelbaumflachtreppe" + +#: src/_locale_workbench.lua:382 +msgid "Jungle Tree Cube" +msgstr "Dschungelbaumwürfel" + +#: src/_locale_workbench.lua:383 +msgid "Jungle Tree Panel" +msgstr "Dschungelbaumpaneel" + +#: src/_locale_workbench.lua:384 +msgid "Jungle Tree Double Panel" +msgstr "Dschungelbaumdoppelpaneel" + +#: src/_locale_workbench.lua:385 +msgid "Jungle Tree Half-Stair" +msgstr "Dschungelbaumhalbtreppe" + +#: src/_locale_workbench.lua:386 +msgid "Jungle Wood Planks Nanoslab" +msgstr "Dschungelholzplankennanoplatte" + +#: src/_locale_workbench.lua:387 +msgid "Jungle Wood Planks Micropanel" +msgstr "Dschungelholzplankenmikropaneel" + +#: src/_locale_workbench.lua:388 +msgid "Jungle Wood Planks Microslab" +msgstr "Dschungelholzplankenmikroplatte" + +#: src/_locale_workbench.lua:389 +msgid "Jungle Wood Planks Thin Stair" +msgstr "Dschungelholzplankenflachtreppe" + +#: src/_locale_workbench.lua:390 +msgid "Jungle Wood Planks Cube" +msgstr "Dschungelholzplankenwürfel" + +#: src/_locale_workbench.lua:391 +msgid "Jungle Wood Planks Panel" +msgstr "Dschungelholzplankenpaneel" + +#: src/_locale_workbench.lua:392 +msgid "Jungle Wood Planks Double Panel" +msgstr "Dschungelholzplankendoppelpaneel" + +#: src/_locale_workbench.lua:393 +msgid "Jungle Wood Planks Half-Stair" +msgstr "Dschungelholzplankenhalbtreppe" + +#: src/_locale_workbench.lua:394 +msgid "Mossy Cobblestone Nanoslab" +msgstr "Moosige Kopfsteinplflasternanoplatte" + +#: src/_locale_workbench.lua:395 +msgid "Mossy Cobblestone Micropanel" +msgstr "Moosiges Kopfsteinpflastermikropaneel" + +#: src/_locale_workbench.lua:396 +msgid "Mossy Cobblestone Microslab" +msgstr "Moosige Kopfsteinpflastermikroplatte" + +#: src/_locale_workbench.lua:397 +msgid "Mossy Cobblestone Thin Stair" +msgstr "Moosige Kopfsteinpflasterflachtreppe" + +#: src/_locale_workbench.lua:398 +msgid "Mossy Cobblestone Cube" +msgstr "Moosiger Kopfsteinpflasterwürfel" + +#: src/_locale_workbench.lua:399 +msgid "Mossy Cobblestone Panel" +msgstr "Moosiges Kopfsteinpflasterpaneel" + +#: src/_locale_workbench.lua:400 +msgid "Mossy Cobblestone Double Panel" +msgstr "Moosiges Kopfsteinpflasterdoppelpaneel" + +#: src/_locale_workbench.lua:401 +msgid "Mossy Cobblestone Half-Stair" +msgstr "Moosige Kopfsteinpflasterhalbtreppe" + +#: src/_locale_workbench.lua:402 +msgid "Obsidian Nanoslab" +msgstr "Obsidiannanoplatte" + +#: src/_locale_workbench.lua:403 +msgid "Obsidian Micropanel" +msgstr "Obsidianmikropaneel" + +#: src/_locale_workbench.lua:404 +msgid "Obsidian Microslab" +msgstr "Obsidianmikroplatte" + +#: src/_locale_workbench.lua:405 +msgid "Obsidian Thin Stair" +msgstr "Obsidianflachtreppe" + +#: src/_locale_workbench.lua:406 +msgid "Obsidian Cube" +msgstr "Obsidianwürfel" + +#: src/_locale_workbench.lua:407 +msgid "Obsidian Panel" +msgstr "Obsidianpaneel" + +#: src/_locale_workbench.lua:408 +msgid "Obsidian Double Panel" +msgstr "Obsidiandoppelpaneel" + +#: src/_locale_workbench.lua:409 +msgid "Obsidian Half-Stair" +msgstr "Obsidianhalbtreppe" + +#: src/_locale_workbench.lua:410 +msgid "Obsidian Block Nanoslab" +msgstr "Obsidianblocknanoplatte" + +#: src/_locale_workbench.lua:411 +msgid "Obsidian Block Micropanel" +msgstr "Obsidianblockmikropaneel" + +#: src/_locale_workbench.lua:412 +msgid "Obsidian Block Microslab" +msgstr "Obsidianblockmikroplatte" + +#: src/_locale_workbench.lua:413 +msgid "Obsidian Block Thin Stair" +msgstr "Obsidianblockflachtreppe" + +#: src/_locale_workbench.lua:414 +msgid "Obsidian Block Cube" +msgstr "Obsidianblockwürfel" + +#: src/_locale_workbench.lua:415 +msgid "Obsidian Block Panel" +msgstr "Obsidianblockpaneel" + +#: src/_locale_workbench.lua:416 +msgid "Obsidian Block Double Panel" +msgstr "Obsidianblockdoppelpaneel" + +#: src/_locale_workbench.lua:417 +msgid "Obsidian Block Half-Stair" +msgstr "Obsidianblockhalbtreppe" + +#: src/_locale_workbench.lua:418 +msgid "Obsidian Glass Nanoslab" +msgstr "Obsidianglasnanoplatte" + +#: src/_locale_workbench.lua:419 +msgid "Obsidian Glass Micropanel" +msgstr "Obsidianglasmikropaneel" + +#: src/_locale_workbench.lua:420 +msgid "Obsidian Glass Microslab" +msgstr "Obsidianglasmikroplatte" + +#: src/_locale_workbench.lua:421 +msgid "Obsidian Glass Thin Stair" +msgstr "Obsidianglasflachtreppe" + +#: src/_locale_workbench.lua:422 +msgid "Obsidian Glass Cube" +msgstr "Obsidianglaswürfel" + +#: src/_locale_workbench.lua:423 +msgid "Obsidian Glass Panel" +msgstr "Obsidianglaspaneel" + +#: src/_locale_workbench.lua:424 +msgid "Obsidian Glass Double Panel" +msgstr "Obsidianglasdoppelpaneel" + +#: src/_locale_workbench.lua:425 +msgid "Obsidian Glass Half-Stair" +msgstr "Obsidianglashalbtreppe" + +#: src/_locale_workbench.lua:426 +msgid "Obsidian Brick Nanoslab" +msgstr "Obsidianziegelnanoplatte" + +#: src/_locale_workbench.lua:427 +msgid "Obsidian Brick Micropanel" +msgstr "Obsidianziegelmikropaneel" + +#: src/_locale_workbench.lua:428 +msgid "Obsidian Brick Microslab" +msgstr "Obsidianziegelmikroplatte" + +#: src/_locale_workbench.lua:429 +msgid "Obsidian Brick Thin Stair" +msgstr "Obsidianziegelflachtreppe" + +#: src/_locale_workbench.lua:430 +msgid "Obsidian Brick Cube" +msgstr "Obsidianziegelwürfel" + +#: src/_locale_workbench.lua:431 +msgid "Obsidian Brick Panel" +msgstr "Obsidianziegelpaneel" + +#: src/_locale_workbench.lua:432 +msgid "Obsidian Brick Double Panel" +msgstr "Obsidianziegeldoppelpaneel" + +#: src/_locale_workbench.lua:433 +msgid "Obsidian Brick Half-Stair" +msgstr "Obsidianziegelhalbtreppe" + +#: src/_locale_workbench.lua:434 +msgid "Permafrost Stair" +msgstr "Permafrosttreppe" + +#: src/_locale_workbench.lua:435 +msgid "Permafrost Slab" +msgstr "Permafrostplatte" + +#: src/_locale_workbench.lua:436 +msgid "Inner Permafrost Stair" +msgstr "Innere Permafrosttreppe" + +#: src/_locale_workbench.lua:437 +msgid "Outer Permafrost Stair" +msgstr "Äußere Permafrosttreppe" + +#: src/_locale_workbench.lua:438 +msgid "Permafrost Nanoslab" +msgstr "Permafrostnanoplatte" + +#: src/_locale_workbench.lua:439 +msgid "Permafrost Micropanel" +msgstr "Permafrostmikropaneel" + +#: src/_locale_workbench.lua:440 +msgid "Permafrost Microslab" +msgstr "Permafrostmikroplatte" + +#: src/_locale_workbench.lua:441 +msgid "Permafrost Thin Stair" +msgstr "Permafrostflachtreppe" + +#: src/_locale_workbench.lua:442 +msgid "Permafrost Cube" +msgstr "Permafrostwürfel" + +#: src/_locale_workbench.lua:443 +msgid "Permafrost Panel" +msgstr "Permafrostpaneel" + +#: src/_locale_workbench.lua:444 +msgid "Permafrost Double Panel" +msgstr "Permafrostdoppelpaneel" + +#: src/_locale_workbench.lua:445 +msgid "Permafrost Half-Stair" +msgstr "Permafrosthalbtreppe" + +#: src/_locale_workbench.lua:446 +msgid "Permafrost with Moss Stair" +msgstr "Permafrost-mit-Moos-Treppe" + +#: src/_locale_workbench.lua:447 +msgid "Inner Permafrost with Moss Stair" +msgstr "Innere Permafrost-mit-Moos-Treppe" + +#: src/_locale_workbench.lua:448 +msgid "Outer Permafrost with Moss Stair" +msgstr "Äußere Permafrost-mit-Moos-Treppe" + +#: src/_locale_workbench.lua:449 +msgid "Permafrost with Moss Slab" +msgstr "Permafrost-mit-Moos-Platte" + +#: src/_locale_workbench.lua:450 +msgid "Permafrost with Moss Nanoslab" +msgstr "Permafrost-mit-Moos-Nanoplatte" + +#: src/_locale_workbench.lua:451 +msgid "Permafrost with Moss Micropanel" +msgstr "Permafrost-mit-Moos-Mikropaneel" + +#: src/_locale_workbench.lua:452 +msgid "Permafrost with Moss Microslab" +msgstr "Permafrost-mit-Moos-Mikroplatte" + +#: src/_locale_workbench.lua:453 +msgid "Permafrost with Moss Thin Stair" +msgstr "Permafrost-mit-Moos-Flachtreppe" + +#: src/_locale_workbench.lua:454 +msgid "Permafrost with Moss Cube" +msgstr "Permafrost-mit-Moos-Würfel" + +#: src/_locale_workbench.lua:455 +msgid "Permafrost with Moss Panel" +msgstr "Permafrost-mit-Moos-Paneel" + +#: src/_locale_workbench.lua:456 +msgid "Permafrost with Moss Double Panel" +msgstr "Permafrost-mit-Moos-Doppelpaneel" + +#: src/_locale_workbench.lua:457 +msgid "Permafrost with Moss Half-Stair" +msgstr "Permafrost-mit-Moos-Halbtreppe" + +#: src/_locale_workbench.lua:458 +msgid "Permafrost with Stones Stair" +msgstr "Permafrost mit Steinentreppe" + +#: src/_locale_workbench.lua:459 +msgid "Inner Permafrost with Stones Stair" +msgstr "Innere Permafrost-mit-Steinen-Treppe" + +#: src/_locale_workbench.lua:460 +msgid "Outer Permafrost with Stones Stair" +msgstr "Äußere Permafrost-mit-Steinen-Treppe" + +#: src/_locale_workbench.lua:461 +msgid "Permafrost with Stones Slab" +msgstr "Permafrost-mit-Steinen-Platte" + +#: src/_locale_workbench.lua:462 +msgid "Permafrost with Stones Nanoslab" +msgstr "Permafrost-mit-Steinen-Nanoplatte" + +#: src/_locale_workbench.lua:463 +msgid "Permafrost with Stones Micropanel" +msgstr "Permafrost-mit-Steinen-Mikropaneel" + +#: src/_locale_workbench.lua:464 +msgid "Permafrost with Stones Microslab" +msgstr "Permafrost-mit-Steinen-Mikroplatte" + +#: src/_locale_workbench.lua:465 +msgid "Permafrost with Stones Thin Stair" +msgstr "Permafrost-mit-Steinen-Flachtreppe" + +#: src/_locale_workbench.lua:466 +msgid "Permafrost with Stones Cube" +msgstr "Permafrost-mit-Steinen-Würfel" + +#: src/_locale_workbench.lua:467 +msgid "Permafrost with Stones Panel" +msgstr "Permafrost-mit-Steinen-Paneel" + +#: src/_locale_workbench.lua:468 +msgid "Permafrost with Stones Double Panel" +msgstr "Permafrost-mit-Steinen-Doppelpaneel" + +#: src/_locale_workbench.lua:469 +msgid "Permafrost with Stones Half-Stair" +msgstr "Permafrost-mit-Steinen-Halbtreppe" + +#: src/_locale_workbench.lua:470 +msgid "Pine Tree Stair" +msgstr "Kiefernbaumtreppe" + +#: src/_locale_workbench.lua:471 +msgid "Pine Tree Slab" +msgstr "Kiefernbaumplatte" + +#: src/_locale_workbench.lua:472 +msgid "Inner Pine Tree Stair" +msgstr "Innere Kiefernbaumtreppe" + +#: src/_locale_workbench.lua:473 +msgid "Outer Pine Tree Stair" +msgstr "Äußere Kiefernbaumtreppe" + +#: src/_locale_workbench.lua:474 +msgid "Pine Tree Nanoslab" +msgstr "Kiefernbaumnanoplatte" + +#: src/_locale_workbench.lua:475 +msgid "Pine Tree Micropanel" +msgstr "Kiefernbaummikropaneel" + +#: src/_locale_workbench.lua:476 +msgid "Pine Tree Microslab" +msgstr "Kiefernbaummikroplatte" + +#: src/_locale_workbench.lua:477 +msgid "Pine Tree Thin Stair" +msgstr "Kiefernbaumflachtreppe" + +#: src/_locale_workbench.lua:478 +msgid "Pine Tree Cube" +msgstr "Kiefernbaumwürfel" + +#: src/_locale_workbench.lua:479 +msgid "Pine Tree Panel" +msgstr "Kiefernbaumpaneel" + +#: src/_locale_workbench.lua:480 +msgid "Pine Tree Double Panel" +msgstr "Kiefernbaumdoppelpaneel" + +#: src/_locale_workbench.lua:481 +msgid "Pine Tree Half-Stair" +msgstr "Kiefernbaumhalbtreppe" + +#: src/_locale_workbench.lua:482 +msgid "Pine Wood Planks Nanoslab" +msgstr "Kiefernholzplankennanoplatte" + +#: src/_locale_workbench.lua:483 +msgid "Pine Wood Planks Micropanel" +msgstr "Kiefernholzplankenmikropaneel" + +#: src/_locale_workbench.lua:484 +msgid "Pine Wood Planks Microslab" +msgstr "Kiefernholzplankenmikroplatte" + +#: src/_locale_workbench.lua:485 +msgid "Pine Wood Planks Thin Stair" +msgstr "Kiefernholzplankenflachtreppe" + +#: src/_locale_workbench.lua:486 +msgid "Pine Wood Planks Cube" +msgstr "Kiefernholzplankenwürfel" + +#: src/_locale_workbench.lua:487 +msgid "Pine Wood Planks Panel" +msgstr "Kiefernholzplankenpaneel" + +#: src/_locale_workbench.lua:488 +msgid "Pine Wood Planks Double Panel" +msgstr "Kiefernholzplankendoppelpaneel" + +#: src/_locale_workbench.lua:489 +msgid "Pine Wood Planks Half-Stair" +msgstr "Kiefernholzplankenhalbtreppe" + +#: src/_locale_workbench.lua:490 +msgid "Sandstone Nanoslab" +msgstr "Sandsteinnanoplatte" + +#: src/_locale_workbench.lua:491 +msgid "Sandstone Micropanel" +msgstr "Sandsteinmikropaneel" + +#: src/_locale_workbench.lua:492 +msgid "Sandstone Microslab" +msgstr "Sandsteinmikroplatte" + +#: src/_locale_workbench.lua:493 +msgid "Sandstone Thin Stair" +msgstr "Sandsteinflachtreppe" + +#: src/_locale_workbench.lua:494 +msgid "Sandstone Cube" +msgstr "Sandsteinwürfel" + +#: src/_locale_workbench.lua:495 +msgid "Sandstone Panel" +msgstr "Sandsteinpaneel" + +#: src/_locale_workbench.lua:496 +msgid "Sandstone Double Panel" +msgstr "Sandsteindoppelpaneel" + +#: src/_locale_workbench.lua:497 +msgid "Sandstone Half-Stair" +msgstr "Sandsteinhalbtreppe" + +#: src/_locale_workbench.lua:498 +msgid "Sandstone Block Nanoslab" +msgstr "Sandsteinblocknanoplatte" + +#: src/_locale_workbench.lua:499 +msgid "Sandstone Block Micropanel" +msgstr "Sandsteinblockmikropaneel" + +#: src/_locale_workbench.lua:500 +msgid "Sandstone Block Microslab" +msgstr "Sandsteinblockmikroplatte" + +#: src/_locale_workbench.lua:501 +msgid "Sandstone Block Thin Stair" +msgstr "Sandsteinblockflachtreppe" + +#: src/_locale_workbench.lua:502 +msgid "Sandstone Block Cube" +msgstr "Sandsteinblockwürfel" + +#: src/_locale_workbench.lua:503 +msgid "Sandstone Block Panel" +msgstr "Sandsteinblockpaneel" + +#: src/_locale_workbench.lua:504 +msgid "Sandstone Block Double Panel" +msgstr "Sandsteinblockdoppelpaneel" + +#: src/_locale_workbench.lua:505 +msgid "Sandstone Block Half-Stair" +msgstr "Sandsteinblockhalbtreppe" + +#: src/_locale_workbench.lua:506 +msgid "Sandstone Brick Nanoslab" +msgstr "Sandsteinziegelnanoplatte" + +#: src/_locale_workbench.lua:507 +msgid "Sandstone Brick Micropanel" +msgstr "Sandsteinziegelmikropaneel" + +#: src/_locale_workbench.lua:508 +msgid "Sandstone Brick Microslab" +msgstr "Sandsteinziegelmikroplatte" + +#: src/_locale_workbench.lua:509 +msgid "Sandstone Brick Thin Stair" +msgstr "Sandsteinziegelflachtreppe" + +#: src/_locale_workbench.lua:510 +msgid "Sandstone Brick Cube" +msgstr "Sandsteinziegelwürfel" + +#: src/_locale_workbench.lua:511 +msgid "Sandstone Brick Panel" +msgstr "Sandsteinziegelpaneel" + +#: src/_locale_workbench.lua:512 +msgid "Sandstone Brick Double Panel" +msgstr "Sandsteinziegeldoppelpaneel" + +#: src/_locale_workbench.lua:513 +msgid "Sandstone Brick Half-Stair" +msgstr "Sandsteinziegelhalbtreppe" + +#: src/_locale_workbench.lua:514 +msgid "Silver Sandstone Nanoslab" +msgstr "Silbersandsteinnanoplatte" + +#: src/_locale_workbench.lua:515 +msgid "Silver Sandstone Micropanel" +msgstr "Silbersandsteinmikropaneel" + +#: src/_locale_workbench.lua:516 +msgid "Silver Sandstone Microslab" +msgstr "Silbersandsteinmikroplatte" + +#: src/_locale_workbench.lua:517 +msgid "Silver Sandstone Thin Stair" +msgstr "Silbersandsteinflachtreppe" + +#: src/_locale_workbench.lua:518 +msgid "Silver Sandstone Cube" +msgstr "Silbersandsteinwürfel" + +#: src/_locale_workbench.lua:519 +msgid "Silver Sandstone Panel" +msgstr "Silbersandsteinpaneel" + +#: src/_locale_workbench.lua:520 +msgid "Silver Sandstone Double Panel" +msgstr "Silbersandsteindoppelpaneel" + +#: src/_locale_workbench.lua:521 +msgid "Silver Sandstone Half-Stair" +msgstr "Silbersandsteinhalbtreppe" + +#: src/_locale_workbench.lua:522 +msgid "Silver Sandstone Block Nanoslab" +msgstr "Silbersandsteinblocknanoplatte" + +#: src/_locale_workbench.lua:523 +msgid "Silver Sandstone Block Micropanel" +msgstr "Silbersandsteinblockmikropaneel" + +#: src/_locale_workbench.lua:524 +msgid "Silver Sandstone Block Microslab" +msgstr "Silbersandsteinblockmikroplatte" + +#: src/_locale_workbench.lua:525 +msgid "Silver Sandstone Block Thin Stair" +msgstr "Silbersandsteinblockflachtreppe" + +#: src/_locale_workbench.lua:526 +msgid "Silver Sandstone Block Cube" +msgstr "Silbersandsteinblockwürfel" + +#: src/_locale_workbench.lua:527 +msgid "Silver Sandstone Block Panel" +msgstr "Silbersandsteinblockpaneel" + +#: src/_locale_workbench.lua:528 +msgid "Silver Sandstone Block Double Panel" +msgstr "Silbersandsteinblockdoppelpaneel" + +#: src/_locale_workbench.lua:529 +msgid "Silver Sandstone Block Half-Stair" +msgstr "Silbersandsteinblockhalbtreppe" + +#: src/_locale_workbench.lua:530 +msgid "Silver Sandstone Brick Nanoslab" +msgstr "Silbersandsteinziegelnanoplatte" + +#: src/_locale_workbench.lua:531 +msgid "Silver Sandstone Brick Micropanel" +msgstr "Silbersandsteinziegelmikropaneel" + +#: src/_locale_workbench.lua:532 +msgid "Silver Sandstone Brick Microslab" +msgstr "Silbersandsteinziegelmikroplatte" + +#: src/_locale_workbench.lua:533 +msgid "Silver Sandstone Brick Thin Stair" +msgstr "Silbersandsteinziegelflachtreppe" + +#: src/_locale_workbench.lua:534 +msgid "Silver Sandstone Brick Cube" +msgstr "Silbersandsteinziegelwürfel" + +#: src/_locale_workbench.lua:535 +msgid "Silver Sandstone Brick Panel" +msgstr "Silbersandsteinziegelpaneel" + +#: src/_locale_workbench.lua:536 +msgid "Silver Sandstone Brick Double Panel" +msgstr "Silbersandsteinziegeldoppelpaneel" + +#: src/_locale_workbench.lua:537 +msgid "Silver Sandstone Brick Half-Stair" +msgstr "Silbersandsteinziegelhalbtreppe" + +#: src/_locale_workbench.lua:538 +msgid "Steel Block Nanoslab" +msgstr "Stahlblocknanoplatte" + +#: src/_locale_workbench.lua:539 +msgid "Steel Block Micropanel" +msgstr "Stahlblockmikropaneel" + +#: src/_locale_workbench.lua:540 +msgid "Steel Block Microslab" +msgstr "Stahlblockmikroplatte" + +#: src/_locale_workbench.lua:541 +msgid "Steel Block Thin Stair" +msgstr "Stahlblockflachtreppe" + +#: src/_locale_workbench.lua:542 +msgid "Steel Block Cube" +msgstr "Stahlblockwürfel" + +#: src/_locale_workbench.lua:543 +msgid "Steel Block Panel" +msgstr "Stahlblockpaneel" + +#: src/_locale_workbench.lua:544 +msgid "Steel Block Double Panel" +msgstr "Stahlblockdoppelpaneel" + +#: src/_locale_workbench.lua:545 +msgid "Steel Block Half-Stair" +msgstr "Stahlblockhalbtreppe" + +#: src/_locale_workbench.lua:546 +msgid "Stone Nanoslab" +msgstr "Steinnanoplatte" + +#: src/_locale_workbench.lua:547 +msgid "Stone Micropanel" +msgstr "Steinmikropaneel" + +#: src/_locale_workbench.lua:548 +msgid "Stone Microslab" +msgstr "Steinmikroplatte" + +#: src/_locale_workbench.lua:549 +msgid "Stone Thin Stair" +msgstr "Steinflachtreppe" + +#: src/_locale_workbench.lua:550 +msgid "Stone Cube" +msgstr "Steinwürfel" + +#: src/_locale_workbench.lua:551 +msgid "Stone Panel" +msgstr "Steinpaneel" + +#: src/_locale_workbench.lua:552 +msgid "Stone Double Panel" +msgstr "Steindoppelpaneel" + +#: src/_locale_workbench.lua:553 +msgid "Stone Half-Stair" +msgstr "Steinhalbtreppe" + +#: src/_locale_workbench.lua:554 +msgid "Stone Block Nanoslab" +msgstr "Steinblocknanoplatte" + +#: src/_locale_workbench.lua:555 +msgid "Stone Block Micropanel" +msgstr "Steinblockmikropaneel" + +#: src/_locale_workbench.lua:556 +msgid "Stone Block Microslab" +msgstr "Steinblockmikroplatte" + +#: src/_locale_workbench.lua:557 +msgid "Stone Block Thin Stair" +msgstr "Steinblockflachtreppe" + +#: src/_locale_workbench.lua:558 +msgid "Stone Block Cube" +msgstr "Steinblockwürfel" + +#: src/_locale_workbench.lua:559 +msgid "Stone Block Panel" +msgstr "Steinblockpaneel" + +#: src/_locale_workbench.lua:560 +msgid "Stone Block Double Panel" +msgstr "Steinblockdoppelpaneel" + +#: src/_locale_workbench.lua:561 +msgid "Stone Block Half-Stair" +msgstr "Steinblockhalbtreppe" + +#: src/_locale_workbench.lua:562 +msgid "Stone Brick Nanoslab" +msgstr "Steinziegelnanoplatte" + +#: src/_locale_workbench.lua:563 +msgid "Stone Brick Micropanel" +msgstr "Steinziegelmikropaneel" + +#: src/_locale_workbench.lua:564 +msgid "Stone Brick Microslab" +msgstr "Steinziegelmikroplatte" + +#: src/_locale_workbench.lua:565 +msgid "Stone Brick Thin Stair" +msgstr "Steinziegelflachtreppe" + +#: src/_locale_workbench.lua:566 +msgid "Stone Brick Cube" +msgstr "Steinziegelwürfel" + +#: src/_locale_workbench.lua:567 +msgid "Stone Brick Panel" +msgstr "Steinziegelpaneel" + +#: src/_locale_workbench.lua:568 +msgid "Stone Brick Double Panel" +msgstr "Steinziegeldoppelpaneel" + +#: src/_locale_workbench.lua:569 +msgid "Stone Brick Half-Stair" +msgstr "Steinziegelhalbtreppe" + +#: src/_locale_workbench.lua:570 +msgid "Tin Block Nanoslab" +msgstr "Zinnblocknanoplatte" + +#: src/_locale_workbench.lua:571 +msgid "Tin Block Micropanel" +msgstr "Zinnblockmikropaneel" + +#: src/_locale_workbench.lua:572 +msgid "Tin Block Microslab" +msgstr "Zinnblockmikroplatte" + +#: src/_locale_workbench.lua:573 +msgid "Tin Block Thin Stair" +msgstr "Zinnblockflachtreppe" + +#: src/_locale_workbench.lua:574 +msgid "Tin Block Cube" +msgstr "Zinnblockwürfel" + +#: src/_locale_workbench.lua:575 +msgid "Tin Block Panel" +msgstr "Zinnblockpaneel" + +#: src/_locale_workbench.lua:576 +msgid "Tin Block Double Panel" +msgstr "Zinnblockdoppelpaneel" + +#: src/_locale_workbench.lua:577 +msgid "Tin Block Half-Stair" +msgstr "Zinnblockhalbtreppe" + +#: src/_locale_workbench.lua:578 +msgid "Apple Tree Stair" +msgstr "Apfelbaumtreppe" + +#: src/_locale_workbench.lua:579 +msgid "Apple Tree Slab" +msgstr "Apfelbaumplatte" + +#: src/_locale_workbench.lua:580 +msgid "Inner Apple Tree Stair" +msgstr "Innere Apfelbaumtreppe" + +#: src/_locale_workbench.lua:581 +msgid "Outer Apple Tree Stair" +msgstr "Äußere Apfelbaumtreppe" + +#: src/_locale_workbench.lua:582 +msgid "Apple Tree Nanoslab" +msgstr "Apfelbaumnanoplatte" + +#: src/_locale_workbench.lua:583 +msgid "Apple Tree Micropanel" +msgstr "Apfelbaummikropaneel" + +#: src/_locale_workbench.lua:584 +msgid "Apple Tree Microslab" +msgstr "Apfelbaummikroplatte" + +#: src/_locale_workbench.lua:585 +msgid "Apple Tree Thin Stair" +msgstr "Apfelbaumflachtreppe" + +#: src/_locale_workbench.lua:586 +msgid "Apple Tree Cube" +msgstr "Apfelbaumwürfel" + +#: src/_locale_workbench.lua:587 +msgid "Apple Tree Panel" +msgstr "Apfelbaumpaneel" + +#: src/_locale_workbench.lua:588 +msgid "Apple Tree Double Panel" +msgstr "Apfelbaumdoppelpaneel" + +#: src/_locale_workbench.lua:589 +msgid "Apple Tree Half-Stair" +msgstr "Apfelbaumhalbtreppe" + +#: src/_locale_workbench.lua:590 +msgid "Apple Wood Planks Nanoslab" +msgstr "Apfelbaumplankennanoplatte" + +#: src/_locale_workbench.lua:591 +msgid "Apple Wood Planks Micropanel" +msgstr "Apfelbaumplankenmikropaneel" + +#: src/_locale_workbench.lua:592 +msgid "Apple Wood Planks Microslab" +msgstr "Apfelbaumplankenmikroplatte" + +#: src/_locale_workbench.lua:593 +msgid "Apple Wood Planks Thin Stair" +msgstr "Apfelbaumplankenflachtreppe" + +#: src/_locale_workbench.lua:594 +msgid "Apple Wood Planks Cube" +msgstr "Apfelbaumplankenwürfel" + +#: src/_locale_workbench.lua:595 +msgid "Apple Wood Planks Panel" +msgstr "Apfelbaumplankenpaneel" + +#: src/_locale_workbench.lua:596 +msgid "Apple Wood Planks Double Panel" +msgstr "Apfelbaumplankendoppelpaneel" + +#: src/_locale_workbench.lua:597 +msgid "Apple Wood Planks Half-Stair" +msgstr "Apfelbaumplankenhalbtreppe" + +#: src/_locale_workbench.lua:598 +msgid "Straw Nanoslab" +msgstr "Strohnanoplatte" + +#: src/_locale_workbench.lua:599 +msgid "Straw Micropanel" +msgstr "Strohmikropaneel" + +#: src/_locale_workbench.lua:600 +msgid "Straw Microslab" +msgstr "Strohmikroplatte" + +#: src/_locale_workbench.lua:601 +msgid "Straw Thin Stair" +msgstr "Strohflachtreppe" + +#: src/_locale_workbench.lua:602 +msgid "Straw Cube" +msgstr "Strohwürfel" + +#: src/_locale_workbench.lua:603 +msgid "Straw Panel" +msgstr "Strohpaneel" + +#: src/_locale_workbench.lua:604 +msgid "Straw Double Panel" +msgstr "Strohdoppelpaneel" + +#: src/_locale_workbench.lua:605 +msgid "Straw Half-Stair" +msgstr "Strohhalbtreppe" + +#: src/_locale_workbench.lua:606 +msgid "Black Wool Stair" +msgstr "Schwarze Wolltreppe" + +#: src/_locale_workbench.lua:607 +msgid "Black Wool Slab" +msgstr "Schwarze Wollplatte" + +#: src/_locale_workbench.lua:608 +msgid "Inner Black Wool Stair" +msgstr "Innere schwarze Wolltreppe" + +#: src/_locale_workbench.lua:609 +msgid "Outer Black Wool Stair" +msgstr "Äußere schwarze Wolltreppe" + +#: src/_locale_workbench.lua:610 +msgid "Black Wool Nanoslab" +msgstr "Schwarze Wollnanoplatte" + +#: src/_locale_workbench.lua:611 +msgid "Black Wool Micropanel" +msgstr "Schwarzes Wollmikropaneel" + +#: src/_locale_workbench.lua:612 +msgid "Black Wool Microslab" +msgstr "Schwarze Wollmikroplatte" + +#: src/_locale_workbench.lua:613 +msgid "Black Wool Thin Stair" +msgstr "Schwarze Wollflachtreppe" + +#: src/_locale_workbench.lua:614 +msgid "Black Wool Cube" +msgstr "Schwarzer Wollwürfel" + +#: src/_locale_workbench.lua:615 +msgid "Black Wool Panel" +msgstr "Schwarzes Wollpaneel" + +#: src/_locale_workbench.lua:616 +msgid "Black Wool Double Panel" +msgstr "Schwarzes Wolldoppelpaneel" + +#: src/_locale_workbench.lua:617 +msgid "Black Wool Half-Stair" +msgstr "Schwarze Wollhalbtreppe" + +#: src/_locale_workbench.lua:618 +msgid "Blue Wool Stair" +msgstr "Blaue Wolltreppe" + +#: src/_locale_workbench.lua:619 +msgid "Blue Wool Slab" +msgstr "Blaue Wollplatte" + +#: src/_locale_workbench.lua:620 +msgid "Inner Blue Wool Stair" +msgstr "Innere blaue Wolltreppe" + +#: src/_locale_workbench.lua:621 +msgid "Outer Blue Wool Stair" +msgstr "Äußere blaue Wolltreppe" + +#: src/_locale_workbench.lua:622 +msgid "Blue Wool Nanoslab" +msgstr "Blaue Wollnanoplatte" + +#: src/_locale_workbench.lua:623 +msgid "Blue Wool Micropanel" +msgstr "Blaues Wollmikropaneel" + +#: src/_locale_workbench.lua:624 +msgid "Blue Wool Microslab" +msgstr "Blaue Wollmikroplatte" + +#: src/_locale_workbench.lua:625 +msgid "Blue Wool Thin Stair" +msgstr "Blaue Wollflachtreppe" + +#: src/_locale_workbench.lua:626 +msgid "Blue Wool Cube" +msgstr "Blauer Wollwürfel" + +#: src/_locale_workbench.lua:627 +msgid "Blue Wool Panel" +msgstr "Blaues Wollpaneel" + +#: src/_locale_workbench.lua:628 +msgid "Blue Wool Double Panel" +msgstr "Blaues Wolldoppelpaneel" + +#: src/_locale_workbench.lua:629 +msgid "Blue Wool Half-Stair" +msgstr "Blaue Wollhalbtreppe" + +#: src/_locale_workbench.lua:630 +msgid "Brown Wool Stair" +msgstr "Braune Wolltreppe" + +#: src/_locale_workbench.lua:631 +msgid "Brown Wool Slab" +msgstr "Braune Wollplatte" + +#: src/_locale_workbench.lua:632 +msgid "Inner Brown Wool Stair" +msgstr "Innere braune Wolltreppe" + +#: src/_locale_workbench.lua:633 +msgid "Outer Brown Wool Stair" +msgstr "Äußere braune Wolltreppe" + +#: src/_locale_workbench.lua:634 +msgid "Brown Wool Nanoslab" +msgstr "Braune Wollnanoplatte" + +#: src/_locale_workbench.lua:635 +msgid "Brown Wool Micropanel" +msgstr "Braunes Wollmikropaneel" + +#: src/_locale_workbench.lua:636 +msgid "Brown Wool Microslab" +msgstr "Braune Wollmikroplatte" + +#: src/_locale_workbench.lua:637 +msgid "Brown Wool Thin Stair" +msgstr "Braune Wollflachtreppe" + +#: src/_locale_workbench.lua:638 +msgid "Brown Wool Cube" +msgstr "Brauner Wollwürfel" + +#: src/_locale_workbench.lua:639 +msgid "Brown Wool Panel" +msgstr "Braunes Wollpaneel" + +#: src/_locale_workbench.lua:640 +msgid "Brown Wool Double Panel" +msgstr "Braunes Wolldoppelpaneel" + +#: src/_locale_workbench.lua:641 +msgid "Brown Wool Half-Stair" +msgstr "Braune Wollhalbtreppe" + +#: src/_locale_workbench.lua:642 +msgid "Cyan Wool Stair" +msgstr "Türkise Wolltreppe" + +#: src/_locale_workbench.lua:643 +msgid "Cyan Wool Slab" +msgstr "Türkise Wollplatte" + +#: src/_locale_workbench.lua:644 +msgid "Inner Cyan Wool Stair" +msgstr "Innere türkise Wolltreppe" + +#: src/_locale_workbench.lua:645 +msgid "Outer Cyan Wool Stair" +msgstr "Äußere türkise Wolltreppe" + +#: src/_locale_workbench.lua:646 +msgid "Cyan Wool Nanoslab" +msgstr "Türkise Wollnanoplatte" + +#: src/_locale_workbench.lua:647 +msgid "Cyan Wool Micropanel" +msgstr "Türkises Wollmikropaneel" + +#: src/_locale_workbench.lua:648 +msgid "Cyan Wool Microslab" +msgstr "Türkise Mikroplatte" + +#: src/_locale_workbench.lua:649 +msgid "Cyan Wool Thin Stair" +msgstr "Türkise Wollflachtreppe" + +#: src/_locale_workbench.lua:650 +msgid "Cyan Wool Cube" +msgstr "Türkiser Wollwürfel" + +#: src/_locale_workbench.lua:651 +msgid "Cyan Wool Panel" +msgstr "Türkises Wollpaneel" + +#: src/_locale_workbench.lua:652 +msgid "Cyan Wool Double Panel" +msgstr "Türkises Wolldoppelpaneel" + +#: src/_locale_workbench.lua:653 +msgid "Cyan Wool Half-Stair" +msgstr "Türkise Wollhalbtreppe" + +#: src/_locale_workbench.lua:654 +msgid "Dark Green Wool Stair" +msgstr "Dunkelgrüne Wolltreppe" + +#: src/_locale_workbench.lua:655 +msgid "Dark Green Wool Slab" +msgstr "Dunkelgrüne Wollplatte" + +#: src/_locale_workbench.lua:656 +msgid "Inner Dark Green Wool Stair" +msgstr "Innere dunkelgrüne Wolltreppe" + +#: src/_locale_workbench.lua:657 +msgid "Outer Dark Green Wool Stair" +msgstr "Äußere dunkelgrüne Wolltreppe" + +#: src/_locale_workbench.lua:658 +msgid "Dark Green Wool Nanoslab" +msgstr "Dunkelgrüne Wollnanoplatte" + +#: src/_locale_workbench.lua:659 +msgid "Dark Green Wool Micropanel" +msgstr "Dunkelgrünes Wollmikropaneel" + +#: src/_locale_workbench.lua:660 +msgid "Dark Green Wool Microslab" +msgstr "Dunkelgrüne Wollmikroplatte" + +#: src/_locale_workbench.lua:661 +msgid "Dark Green Wool Thin Stair" +msgstr "Dunkelgrüne Wollflachtreppe" + +#: src/_locale_workbench.lua:662 +msgid "Dark Green Wool Cube" +msgstr "Dunkelgrüner Wollwürfel" + +#: src/_locale_workbench.lua:663 +msgid "Dark Green Wool Panel" +msgstr "Dunkelgrünes Wollpaneel" + +#: src/_locale_workbench.lua:664 +msgid "Dark Green Wool Double Panel" +msgstr "Dunkelgrünes Wolldoppelpaneel" + +#: src/_locale_workbench.lua:665 +msgid "Dark Green Wool Half-Stair" +msgstr "Dunkelgrüne Wollhalbtreppe" + +#: src/_locale_workbench.lua:666 +msgid "Dark Grey Wool Stair" +msgstr "Dunkelgraue Wolltreppe" + +#: src/_locale_workbench.lua:667 +msgid "Dark Grey Wool Slab" +msgstr "Dunkelgraue Wollplatte" + +#: src/_locale_workbench.lua:668 +msgid "Inner Dark Grey Wool Stair" +msgstr "Innere dunkelgraue Wolltreppe" + +#: src/_locale_workbench.lua:669 +msgid "Outer Dark Grey Wool Stair" +msgstr "Äußere dunkelgraue Wolltreppe" + +#: src/_locale_workbench.lua:670 +msgid "Dark Grey Wool Nanoslab" +msgstr "Dunkelgraue Wollnanoplatte" + +#: src/_locale_workbench.lua:671 +msgid "Dark Grey Wool Micropanel" +msgstr "Dunkelgraues Wollmikropaneel" + +#: src/_locale_workbench.lua:672 +msgid "Dark Grey Wool Microslab" +msgstr "Dunkelgraue Wollmikroplatte" + +#: src/_locale_workbench.lua:673 +msgid "Dark Grey Wool Thin Stair" +msgstr "Dunkelgraue Wollflachtreppe" + +#: src/_locale_workbench.lua:674 +msgid "Dark Grey Wool Cube" +msgstr "Dunkelgrauer Wollwürfel" + +#: src/_locale_workbench.lua:675 +msgid "Dark Grey Wool Panel" +msgstr "Dunkelgraues Wollpaneel" + +#: src/_locale_workbench.lua:676 +msgid "Dark Grey Wool Double Panel" +msgstr "Dunkelgraues Wolldoppelpaneel" + +#: src/_locale_workbench.lua:677 +msgid "Dark Grey Wool Half-Stair" +msgstr "Dunkelgraue Wollhalbtreppe" + +#: src/_locale_workbench.lua:678 +msgid "Green Wool Stair" +msgstr "Grüne Wolltreppe" + +#: src/_locale_workbench.lua:679 +msgid "Green Wool Slab" +msgstr "Grüne Wollplatte" + +#: src/_locale_workbench.lua:680 +msgid "Inner Green Wool Stair" +msgstr "Innere grüne Wolltreppe" + +#: src/_locale_workbench.lua:681 +msgid "Outer Green Wool Stair" +msgstr "Äußere grüne Wolltreppe" + +#: src/_locale_workbench.lua:682 +msgid "Green Wool Nanoslab" +msgstr "Grüne Wollnanoplatte" + +#: src/_locale_workbench.lua:683 +msgid "Green Wool Micropanel" +msgstr "Grünes Wollmikropaneel" + +#: src/_locale_workbench.lua:684 +msgid "Green Wool Microslab" +msgstr "Grüne Wollmikroplatte" + +#: src/_locale_workbench.lua:685 +msgid "Green Wool Thin Stair" +msgstr "Grüne Wollflachtreppe" + +#: src/_locale_workbench.lua:686 +msgid "Green Wool Cube" +msgstr "Grüner Wollwürfel" + +#: src/_locale_workbench.lua:687 +msgid "Green Wool Panel" +msgstr "Grünes Wollpaneel" + +#: src/_locale_workbench.lua:688 +msgid "Green Wool Double Panel" +msgstr "Grünes Wolldoppelpaneel" + +#: src/_locale_workbench.lua:689 +msgid "Green Wool Half-Stair" +msgstr "Grüne Wollhalbtreppe" + +#: src/_locale_workbench.lua:690 +msgid "Grey Wool Stair" +msgstr "Graue Wolltreppe" + +#: src/_locale_workbench.lua:691 +msgid "Grey Wool Slab" +msgstr "Graue Wollplatte" + +#: src/_locale_workbench.lua:692 +msgid "Inner Grey Wool Stair" +msgstr "Innere graue Wolltreppe" + +#: src/_locale_workbench.lua:693 +msgid "Outer Grey Wool Stair" +msgstr "Äußere graue Wolltreppe" + +#: src/_locale_workbench.lua:694 +msgid "Grey Wool Nanoslab" +msgstr "Graue Wollnanoplatte" + +#: src/_locale_workbench.lua:695 +msgid "Grey Wool Micropanel" +msgstr "Graues Wollmikropaneel" + +#: src/_locale_workbench.lua:696 +msgid "Grey Wool Microslab" +msgstr "Graue Wollmikroplatte" + +#: src/_locale_workbench.lua:697 +msgid "Grey Wool Thin Stair" +msgstr "Graue Wollflachtreppe" + +#: src/_locale_workbench.lua:698 +msgid "Grey Wool Cube" +msgstr "Grauer Wollwürfel" + +#: src/_locale_workbench.lua:699 +msgid "Grey Wool Panel" +msgstr "Graues Wollpaneel" + +#: src/_locale_workbench.lua:700 +msgid "Grey Wool Double Panel" +msgstr "Graues Wolldoppelpaneel" + +#: src/_locale_workbench.lua:701 +msgid "Grey Wool Half-Stair" +msgstr "Graue Wollhalbtreppe" + +#: src/_locale_workbench.lua:702 +msgid "Magenta Wool Stair" +msgstr "Magenta Wolltreppe" + +#: src/_locale_workbench.lua:703 +msgid "Magenta Wool Slab" +msgstr "Magenta Wollplatte" + +#: src/_locale_workbench.lua:704 +msgid "Inner Magenta Wool Stair" +msgstr "Innere magenta Wolltreppe" + +#: src/_locale_workbench.lua:705 +msgid "Outer Magenta Wool Stair" +msgstr "Äußere magenta Wolltreppe" + +#: src/_locale_workbench.lua:706 +msgid "Magenta Wool Nanoslab" +msgstr "Magenta Wollnanoplatte" + +#: src/_locale_workbench.lua:707 +msgid "Magenta Wool Micropanel" +msgstr "Magenta Wollmikropaneel" + +#: src/_locale_workbench.lua:708 +msgid "Magenta Wool Microslab" +msgstr "Magenta Wollmikroplatte" + +#: src/_locale_workbench.lua:709 +msgid "Magenta Wool Thin Stair" +msgstr "Magenta Wollflachtreppe" + +#: src/_locale_workbench.lua:710 +msgid "Magenta Wool Cube" +msgstr "Magenta Wollwürfel" + +#: src/_locale_workbench.lua:711 +msgid "Magenta Wool Panel" +msgstr "Magenta Wollpaneel" + +#: src/_locale_workbench.lua:712 +msgid "Magenta Wool Double Panel" +msgstr "Magenta Wolldoppelpaneel" + +#: src/_locale_workbench.lua:713 +msgid "Magenta Wool Half-Stair" +msgstr "Magenta Wollhalbtreppe" + +#: src/_locale_workbench.lua:714 +msgid "Orange Wool Stair" +msgstr "Orange Wolltreppe" + +#: src/_locale_workbench.lua:715 +msgid "Orange Wool Slab" +msgstr "Orange Wollplatte" + +#: src/_locale_workbench.lua:716 +msgid "Inner Orange Wool Stair" +msgstr "Innere orange Wolltreppe" + +#: src/_locale_workbench.lua:717 +msgid "Outer Orange Wool Stair" +msgstr "Äußere orange Wolltreppe" + +#: src/_locale_workbench.lua:718 +msgid "Orange Wool Nanoslab" +msgstr "Orange Wollnanoplatte" + +#: src/_locale_workbench.lua:719 +msgid "Orange Wool Micropanel" +msgstr "Orange Wollmikropaneel" + +#: src/_locale_workbench.lua:720 +msgid "Orange Wool Microslab" +msgstr "Orange Wollmikroplatte" + +#: src/_locale_workbench.lua:721 +msgid "Orange Wool Thin Stair" +msgstr "Orange Wollflachtreppe" + +#: src/_locale_workbench.lua:722 +msgid "Orange Wool Cube" +msgstr "Orange Wollwürfel" + +#: src/_locale_workbench.lua:723 +msgid "Orange Wool Panel" +msgstr "Orange Wollpaneel" + +#: src/_locale_workbench.lua:724 +msgid "Orange Wool Double Panel" +msgstr "Orange Wolldoppelpaneel" + +#: src/_locale_workbench.lua:725 +msgid "Orange Wool Half-Stair" +msgstr "Orange Wollhalbtreppe" + +#: src/_locale_workbench.lua:726 +msgid "Pink Wool Stair" +msgstr "Rosa Wolltreppe" + +#: src/_locale_workbench.lua:727 +msgid "Pink Wool Slab" +msgstr "Rosa Wollplatte" + +#: src/_locale_workbench.lua:728 +msgid "Inner Pink Wool Stair" +msgstr "Innere rosa Wolltreppe" + +#: src/_locale_workbench.lua:729 +msgid "Outer Pink Wool Stair" +msgstr "Äußere rosa Wolltreppe" + +#: src/_locale_workbench.lua:730 +msgid "Pink Wool Nanoslab" +msgstr "Rosa Wollnanoplatte" + +#: src/_locale_workbench.lua:731 +msgid "Pink Wool Micropanel" +msgstr "Rosa Wollmikropaneel" + +#: src/_locale_workbench.lua:732 +msgid "Pink Wool Microslab" +msgstr "Rosa Wollmikroplatte" + +#: src/_locale_workbench.lua:733 +msgid "Pink Wool Thin Stair" +msgstr "Rosa Wollflachtreppe" + +#: src/_locale_workbench.lua:734 +msgid "Pink Wool Cube" +msgstr "Rosa Wollwürfel" + +#: src/_locale_workbench.lua:735 +msgid "Pink Wool Panel" +msgstr "Rosa Wollpaneel" + +#: src/_locale_workbench.lua:736 +msgid "Pink Wool Double Panel" +msgstr "Rosa Wolldoppelpaneel" + +#: src/_locale_workbench.lua:737 +msgid "Pink Wool Half-Stair" +msgstr "Rosa Wollhalbtreppe" + +#: src/_locale_workbench.lua:738 +msgid "Red Wool Stair" +msgstr "Rote Wolltreppe" + +#: src/_locale_workbench.lua:739 +msgid "Red Wool Slab" +msgstr "Rote Wollplatte" + +#: src/_locale_workbench.lua:740 +msgid "Inner Red Wool Stair" +msgstr "Innere rote Wolltreppe" + +#: src/_locale_workbench.lua:741 +msgid "Outer Red Wool Stair" +msgstr "Äußere rote Wolltreppe" + +#: src/_locale_workbench.lua:742 +msgid "Red Wool Nanoslab" +msgstr "Rote Wollnanoplatte" + +#: src/_locale_workbench.lua:743 +msgid "Red Wool Micropanel" +msgstr "Rotes Wollmikropaneel" + +#: src/_locale_workbench.lua:744 +msgid "Red Wool Microslab" +msgstr "Rote Wollmikroplatte" + +#: src/_locale_workbench.lua:745 +msgid "Red Wool Thin Stair" +msgstr "Rote Wollflachtreppe" + +#: src/_locale_workbench.lua:746 +msgid "Red Wool Cube" +msgstr "Roter Wollwürfel" + +#: src/_locale_workbench.lua:747 +msgid "Red Wool Panel" +msgstr "Rotes Wollpaneel" + +#: src/_locale_workbench.lua:748 +msgid "Red Wool Double Panel" +msgstr "Rotes Wolldoppelpaneel" + +#: src/_locale_workbench.lua:749 +msgid "Red Wool Half-Stair" +msgstr "Rote Wollhalbtreppe" + +#: src/_locale_workbench.lua:750 +msgid "Violet Wool Stair" +msgstr "Violette Wolltreppe" + +#: src/_locale_workbench.lua:751 +msgid "Violet Wool Slab" +msgstr "Violette Wollplatte" + +#: src/_locale_workbench.lua:752 +msgid "Inner Violet Wool Stair" +msgstr "Innere violette Wolltreppe" + +#: src/_locale_workbench.lua:753 +msgid "Outer Violet Wool Stair" +msgstr "Äußere violette Wolltreppe" + +#: src/_locale_workbench.lua:754 +msgid "Violet Wool Nanoslab" +msgstr "Violette Wollnanoplatte" + +#: src/_locale_workbench.lua:755 +msgid "Violet Wool Micropanel" +msgstr "Violettes Wollmikopaneel" + +#: src/_locale_workbench.lua:756 +msgid "Violet Wool Microslab" +msgstr "Violette Wollmikroplatte" + +#: src/_locale_workbench.lua:757 +msgid "Violet Wool Thin Stair" +msgstr "Violette Wollflachtreppe" + +#: src/_locale_workbench.lua:758 +msgid "Violet Wool Cube" +msgstr "Violetter Wollwürfel" + +#: src/_locale_workbench.lua:759 +msgid "Violet Wool Panel" +msgstr "Violettes Wollpaneel" + +#: src/_locale_workbench.lua:760 +msgid "Violet Wool Double Panel" +msgstr "Violettes Wolldoppelpaneel" + +#: src/_locale_workbench.lua:761 +msgid "Violet Wool Half-Stair" +msgstr "Violette Wollhalbtreppe" + +#: src/_locale_workbench.lua:762 +msgid "White Wool Stair" +msgstr "Weiße Wolltreppe" + +#: src/_locale_workbench.lua:763 +msgid "White Wool Slab" +msgstr "Weiße Wollplatte" + +#: src/_locale_workbench.lua:764 +msgid "Inner White Wool Stair" +msgstr "Innere weiße Wolltreppe" + +#: src/_locale_workbench.lua:765 +msgid "Outer White Wool Stair" +msgstr "Äußere weiße Wolltreppe" + +#: src/_locale_workbench.lua:766 +msgid "White Wool Nanoslab" +msgstr "Weiße Wollnanoplatte" + +#: src/_locale_workbench.lua:767 +msgid "White Wool Micropanel" +msgstr "Weißes Wollmikropaneel" + +#: src/_locale_workbench.lua:768 +msgid "White Wool Microslab" +msgstr "Weiße Wollmikroplatte" + +#: src/_locale_workbench.lua:769 +msgid "White Wool Thin Stair" +msgstr "Weiße Wollflachtreppe" + +#: src/_locale_workbench.lua:770 +msgid "White Wool Cube" +msgstr "Weißer Wollwürfel" + +#: src/_locale_workbench.lua:771 +msgid "White Wool Panel" +msgstr "Weißes Wollpaneel" + +#: src/_locale_workbench.lua:772 +msgid "White Wool Double Panel" +msgstr "Weißes Wolldoppelpaneel" + +#: src/_locale_workbench.lua:773 +msgid "White Wool Half-Stair" +msgstr "Weiße Wollhalbtreppe" + +#: src/_locale_workbench.lua:774 +msgid "Yellow Wool Stair" +msgstr "Gelbe Wolltreppe" + +#: src/_locale_workbench.lua:775 +msgid "Yellow Wool Slab" +msgstr "Gelbe Wollplatte" + +#: src/_locale_workbench.lua:776 +msgid "Inner Yellow Wool Stair" +msgstr "Innere gelbe Wolltreppe" + +#: src/_locale_workbench.lua:777 +msgid "Outer Yellow Wool Stair" +msgstr "Äußere gelbe Wolltreppe" + +#: src/_locale_workbench.lua:778 +msgid "Yellow Wool Nanoslab" +msgstr "Gelbe Wollnanoplatte" + +#: src/_locale_workbench.lua:779 +msgid "Yellow Wool Micropanel" +msgstr "Gelbes Wollmikropaneel" + +#: src/_locale_workbench.lua:780 +msgid "Yellow Wool Microslab" +msgstr "Gelbe Wollmikroplatte" + +#: src/_locale_workbench.lua:781 +msgid "Yellow Wool Thin Stair" +msgstr "Gelbe Wollflachtreppe" + +#: src/_locale_workbench.lua:782 +msgid "Yellow Wool Cube" +msgstr "Gelber Wollwürfel" + +#: src/_locale_workbench.lua:783 +msgid "Yellow Wool Panel" +msgstr "Gelbes Wollpaneel" + +#: src/_locale_workbench.lua:784 +msgid "Yellow Wool Double Panel" +msgstr "Gelbes Wolldoppelpaneel" + +#: src/_locale_workbench.lua:785 +msgid "Yellow Wool Half-Stair" +msgstr "Gelbe Wollhalbtreppe" diff --git a/mods/xdecor/locale/_xdecor_cut_nodes.pot b/mods/xdecor/locale/_xdecor_cut_nodes.pot new file mode 100644 index 0000000..702b4b2 --- /dev/null +++ b/mods/xdecor/locale/_xdecor_cut_nodes.pot @@ -0,0 +1,3090 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the xdecor package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: xdecor\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-10-18 19:22+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/_locale_workbench.lua:18 +msgid "Barrel Stair" +msgstr "" + +#: src/_locale_workbench.lua:19 +msgid "Barrel Slab" +msgstr "" + +#: src/_locale_workbench.lua:20 +msgid "Inner Barrel Stair" +msgstr "" + +#: src/_locale_workbench.lua:21 +msgid "Outer Barrel Stair" +msgstr "" + +#: src/_locale_workbench.lua:22 +msgid "Barrel Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:23 +msgid "Barrel Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:24 +msgid "Barrel Microslab" +msgstr "" + +#: src/_locale_workbench.lua:25 +msgid "Barrel Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:26 +msgid "Barrel Cube" +msgstr "" + +#: src/_locale_workbench.lua:27 +msgid "Barrel Panel" +msgstr "" + +#: src/_locale_workbench.lua:28 +msgid "Barrel Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:29 +msgid "Barrel Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:30 +msgid "Cactus Brick Stair" +msgstr "" + +#: src/_locale_workbench.lua:31 +msgid "Cactus Brick Slab" +msgstr "" + +#: src/_locale_workbench.lua:32 +msgid "Inner Cactus Brick Stair" +msgstr "" + +#: src/_locale_workbench.lua:33 +msgid "Outer Cactus Brick Stair" +msgstr "" + +#: src/_locale_workbench.lua:34 +msgid "Cactus Brick Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:35 +msgid "Cactus Brick Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:36 +msgid "Cactus Brick Microslab" +msgstr "" + +#: src/_locale_workbench.lua:37 +msgid "Cactus Brick Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:38 +msgid "Cactus Brick Cube" +msgstr "" + +#: src/_locale_workbench.lua:39 +msgid "Cactus Brick Panel" +msgstr "" + +#: src/_locale_workbench.lua:40 +msgid "Cactus Brick Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:41 +msgid "Cactus Brick Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:42 +msgid "Coal Stone Tile Stair" +msgstr "" + +#: src/_locale_workbench.lua:43 +msgid "Coal Stone Tile Slab" +msgstr "" + +#: src/_locale_workbench.lua:44 +msgid "Inner Coal Stone Tile Stair" +msgstr "" + +#: src/_locale_workbench.lua:45 +msgid "Outer Coal Stone Tile Stair" +msgstr "" + +#: src/_locale_workbench.lua:46 +msgid "Coal Stone Tile Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:47 +msgid "Coal Stone Tile Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:48 +msgid "Coal Stone Tile Microslab" +msgstr "" + +#: src/_locale_workbench.lua:49 +msgid "Coal Stone Tile Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:50 +msgid "Coal Stone Tile Cube" +msgstr "" + +#: src/_locale_workbench.lua:51 +msgid "Coal Stone Tile Panel" +msgstr "" + +#: src/_locale_workbench.lua:52 +msgid "Coal Stone Tile Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:53 +msgid "Coal Stone Tile Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:54 +msgid "Polished Desert Stone Block Stair" +msgstr "" + +#: src/_locale_workbench.lua:55 +msgid "Polished Desert Stone Block Slab" +msgstr "" + +#: src/_locale_workbench.lua:56 +msgid "Inner Polished Desert Stone Block Stair" +msgstr "" + +#: src/_locale_workbench.lua:57 +msgid "Outer Polished Desert Stone Block Stair" +msgstr "" + +#: src/_locale_workbench.lua:58 +msgid "Polished Desert Stone Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:59 +msgid "Polished Desert Stone Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:60 +msgid "Polished Desert Stone Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:61 +msgid "Polished Desert Stone Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:62 +msgid "Polished Desert Stone Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:63 +msgid "Polished Desert Stone Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:64 +msgid "Polished Desert Stone Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:65 +msgid "Polished Desert Stone Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:66 +msgid "Hardened Clay Stair" +msgstr "" + +#: src/_locale_workbench.lua:67 +msgid "Hardened Clay Slab" +msgstr "" + +#: src/_locale_workbench.lua:68 +msgid "Inner Hardened Clay Stair" +msgstr "" + +#: src/_locale_workbench.lua:69 +msgid "Outer Hardened Clay Stair" +msgstr "" + +#: src/_locale_workbench.lua:70 +msgid "Hardened Clay Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:71 +msgid "Hardened Clay Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:72 +msgid "Hardened Clay Microslab" +msgstr "" + +#: src/_locale_workbench.lua:73 +msgid "Hardened Clay Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:74 +msgid "Hardened Clay Cube" +msgstr "" + +#: src/_locale_workbench.lua:75 +msgid "Hardened Clay Panel" +msgstr "" + +#: src/_locale_workbench.lua:76 +msgid "Hardened Clay Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:77 +msgid "Hardened Clay Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:78 +msgid "Moon Brick Stair" +msgstr "" + +#: src/_locale_workbench.lua:79 +msgid "Moon Brick Slab" +msgstr "" + +#: src/_locale_workbench.lua:80 +msgid "Inner Moon Brick Stair" +msgstr "" + +#: src/_locale_workbench.lua:81 +msgid "Outer Moon Brick Stair" +msgstr "" + +#: src/_locale_workbench.lua:82 +msgid "Moon Brick Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:83 +msgid "Moon Brick Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:84 +msgid "Moon Brick Microslab" +msgstr "" + +#: src/_locale_workbench.lua:85 +msgid "Moon Brick Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:86 +msgid "Moon Brick Cube" +msgstr "" + +#: src/_locale_workbench.lua:87 +msgid "Moon Brick Panel" +msgstr "" + +#: src/_locale_workbench.lua:88 +msgid "Moon Brick Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:89 +msgid "Moon Brick Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:90 +msgid "Packed Ice Stair" +msgstr "" + +#: src/_locale_workbench.lua:91 +msgid "Packed Ice Slab" +msgstr "" + +#: src/_locale_workbench.lua:92 +msgid "Inner Packed Ice Stair" +msgstr "" + +#: src/_locale_workbench.lua:93 +msgid "Outer Packed Ice Stair" +msgstr "" + +#: src/_locale_workbench.lua:94 +msgid "Packed Ice Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:95 +msgid "Packed Ice Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:96 +msgid "Packed Ice Microslab" +msgstr "" + +#: src/_locale_workbench.lua:97 +msgid "Packed Ice Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:98 +msgid "Packed Ice Cube" +msgstr "" + +#: src/_locale_workbench.lua:99 +msgid "Packed Ice Panel" +msgstr "" + +#: src/_locale_workbench.lua:100 +msgid "Packed Ice Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:101 +msgid "Packed Ice Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:102 +msgid "Runestone Stair" +msgstr "" + +#: src/_locale_workbench.lua:103 +msgid "Runestone Slab" +msgstr "" + +#: src/_locale_workbench.lua:104 +msgid "Inner Runestone Stair" +msgstr "" + +#: src/_locale_workbench.lua:105 +msgid "Outer Runestone Stair" +msgstr "" + +#: src/_locale_workbench.lua:106 +msgid "Runestone Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:107 +msgid "Runestone Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:108 +msgid "Runestone Microslab" +msgstr "" + +#: src/_locale_workbench.lua:109 +msgid "Runestone Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:110 +msgid "Runestone Cube" +msgstr "" + +#: src/_locale_workbench.lua:111 +msgid "Runestone Panel" +msgstr "" + +#: src/_locale_workbench.lua:112 +msgid "Runestone Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:113 +msgid "Runestone Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:114 +msgid "Polished Stone Block Stair" +msgstr "" + +#: src/_locale_workbench.lua:115 +msgid "Polished Stone Block Slab" +msgstr "" + +#: src/_locale_workbench.lua:116 +msgid "Inner Polished Stone Block Stair" +msgstr "" + +#: src/_locale_workbench.lua:117 +msgid "Outer Polished Stone Block Stair" +msgstr "" + +#: src/_locale_workbench.lua:118 +msgid "Polished Stone Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:119 +msgid "Polished Stone Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:120 +msgid "Polished Stone Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:121 +msgid "Polished Stone Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:122 +msgid "Polished Stone Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:123 +msgid "Polished Stone Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:124 +msgid "Polished Stone Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:125 +msgid "Polished Stone Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:126 +msgid "Wooden Tile Stair" +msgstr "" + +#: src/_locale_workbench.lua:127 +msgid "Wooden Tile Slab" +msgstr "" + +#: src/_locale_workbench.lua:128 +msgid "Inner Wooden Tile Stair" +msgstr "" + +#: src/_locale_workbench.lua:129 +msgid "Outer Wooden Tile Stair" +msgstr "" + +#: src/_locale_workbench.lua:130 +msgid "Wooden Tile Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:131 +msgid "Wooden Tile Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:132 +msgid "Wooden Tile Microslab" +msgstr "" + +#: src/_locale_workbench.lua:133 +msgid "Wooden Tile Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:134 +msgid "Wooden Tile Cube" +msgstr "" + +#: src/_locale_workbench.lua:135 +msgid "Wooden Tile Panel" +msgstr "" + +#: src/_locale_workbench.lua:136 +msgid "Wooden Tile Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:137 +msgid "Wooden Tile Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:138 +msgid "Wood Framed Glass Stair" +msgstr "" + +#: src/_locale_workbench.lua:139 +msgid "Inner Wood Framed Glass Stair" +msgstr "" + +#: src/_locale_workbench.lua:140 +msgid "Outer Wood Framed Glass Stair" +msgstr "" + +#: src/_locale_workbench.lua:141 +msgid "Wood Framed Glass Slab" +msgstr "" + +#: src/_locale_workbench.lua:142 +msgid "Wood Framed Glass Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:143 +msgid "Wood Framed Glass Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:144 +msgid "Wood Framed Glass Microslab" +msgstr "" + +#: src/_locale_workbench.lua:145 +msgid "Wood Framed Glass Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:146 +msgid "Wood Framed Glass Cube" +msgstr "" + +#: src/_locale_workbench.lua:147 +msgid "Wood Framed Glass Panel" +msgstr "" + +#: src/_locale_workbench.lua:148 +msgid "Wood Framed Glass Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:149 +msgid "Wood Framed Glass Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:150 +msgid "Acacia Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:151 +msgid "Acacia Tree Slab" +msgstr "" + +#: src/_locale_workbench.lua:152 +msgid "Inner Acacia Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:153 +msgid "Outer Acacia Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:154 +msgid "Acacia Tree Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:155 +msgid "Acacia Tree Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:156 +msgid "Acacia Tree Microslab" +msgstr "" + +#: src/_locale_workbench.lua:157 +msgid "Acacia Tree Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:158 +msgid "Acacia Tree Cube" +msgstr "" + +#: src/_locale_workbench.lua:159 +msgid "Acacia Tree Panel" +msgstr "" + +#: src/_locale_workbench.lua:160 +msgid "Acacia Tree Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:161 +msgid "Acacia Tree Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:162 +msgid "Acacia Wood Planks Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:163 +msgid "Acacia Wood Planks Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:164 +msgid "Acacia Wood Planks Microslab" +msgstr "" + +#: src/_locale_workbench.lua:165 +msgid "Acacia Wood Planks Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:166 +msgid "Acacia Wood Planks Cube" +msgstr "" + +#: src/_locale_workbench.lua:167 +msgid "Acacia Wood Planks Panel" +msgstr "" + +#: src/_locale_workbench.lua:168 +msgid "Acacia Wood Planks Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:169 +msgid "Acacia Wood Planks Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:170 +msgid "Aspen Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:171 +msgid "Aspen Tree Slab" +msgstr "" + +#: src/_locale_workbench.lua:172 +msgid "Inner Aspen Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:173 +msgid "Outer Aspen Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:174 +msgid "Aspen Tree Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:175 +msgid "Aspen Tree Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:176 +msgid "Aspen Tree Microslab" +msgstr "" + +#: src/_locale_workbench.lua:177 +msgid "Aspen Tree Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:178 +msgid "Aspen Tree Cube" +msgstr "" + +#: src/_locale_workbench.lua:179 +msgid "Aspen Tree Panel" +msgstr "" + +#: src/_locale_workbench.lua:180 +msgid "Aspen Tree Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:181 +msgid "Aspen Tree Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:182 +msgid "Aspen Wood Planks Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:183 +msgid "Aspen Wood Planks Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:184 +msgid "Aspen Wood Planks Microslab" +msgstr "" + +#: src/_locale_workbench.lua:185 +msgid "Aspen Wood Planks Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:186 +msgid "Aspen Wood Planks Cube" +msgstr "" + +#: src/_locale_workbench.lua:187 +msgid "Aspen Wood Planks Panel" +msgstr "" + +#: src/_locale_workbench.lua:188 +msgid "Aspen Wood Planks Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:189 +msgid "Aspen Wood Planks Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:190 +msgid "Brick Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:191 +msgid "Brick Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:192 +msgid "Brick Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:193 +msgid "Brick Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:194 +msgid "Brick Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:195 +msgid "Brick Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:196 +msgid "Brick Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:197 +msgid "Brick Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:198 +msgid "Bronze Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:199 +msgid "Bronze Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:200 +msgid "Bronze Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:201 +msgid "Bronze Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:202 +msgid "Bronze Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:203 +msgid "Bronze Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:204 +msgid "Bronze Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:205 +msgid "Bronze Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:206 +msgid "Cactus Stair" +msgstr "" + +#: src/_locale_workbench.lua:207 +msgid "Cactus Slab" +msgstr "" + +#: src/_locale_workbench.lua:208 +msgid "Inner Cactus Stair" +msgstr "" + +#: src/_locale_workbench.lua:209 +msgid "Outer Cactus Stair" +msgstr "" + +#: src/_locale_workbench.lua:210 +msgid "Cactus Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:211 +msgid "Cactus Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:212 +msgid "Cactus Microslab" +msgstr "" + +#: src/_locale_workbench.lua:213 +msgid "Cactus Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:214 +msgid "Cactus Cube" +msgstr "" + +#: src/_locale_workbench.lua:215 +msgid "Cactus Panel" +msgstr "" + +#: src/_locale_workbench.lua:216 +msgid "Cactus Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:217 +msgid "Cactus Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:218 +msgid "Coal Block Stair" +msgstr "" + +#: src/_locale_workbench.lua:219 +msgid "Coal Block Slab" +msgstr "" + +#: src/_locale_workbench.lua:220 +msgid "Inner Coal Block Stair" +msgstr "" + +#: src/_locale_workbench.lua:221 +msgid "Outer Coal Block Stair" +msgstr "" + +#: src/_locale_workbench.lua:222 +msgid "Coal Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:223 +msgid "Coal Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:224 +msgid "Coal Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:225 +msgid "Coal Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:226 +msgid "Coal Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:227 +msgid "Coal Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:228 +msgid "Coal Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:229 +msgid "Coal Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:230 +msgid "Cobblestone Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:231 +msgid "Cobblestone Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:232 +msgid "Cobblestone Microslab" +msgstr "" + +#: src/_locale_workbench.lua:233 +msgid "Cobblestone Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:234 +msgid "Cobblestone Cube" +msgstr "" + +#: src/_locale_workbench.lua:235 +msgid "Cobblestone Panel" +msgstr "" + +#: src/_locale_workbench.lua:236 +msgid "Cobblestone Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:237 +msgid "Cobblestone Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:238 +msgid "Copper Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:239 +msgid "Copper Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:240 +msgid "Copper Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:241 +msgid "Copper Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:242 +msgid "Copper Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:243 +msgid "Copper Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:244 +msgid "Copper Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:245 +msgid "Copper Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:246 +msgid "Brown Coral Stair" +msgstr "" + +#: src/_locale_workbench.lua:247 +msgid "Brown Coral Slab" +msgstr "" + +#: src/_locale_workbench.lua:248 +msgid "Inner Brown Coral Stair" +msgstr "" + +#: src/_locale_workbench.lua:249 +msgid "Outer Brown Coral Stair" +msgstr "" + +#: src/_locale_workbench.lua:250 +msgid "Brown Coral Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:251 +msgid "Brown Coral Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:252 +msgid "Brown Coral Microslab" +msgstr "" + +#: src/_locale_workbench.lua:253 +msgid "Brown Coral Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:254 +msgid "Brown Coral Cube" +msgstr "" + +#: src/_locale_workbench.lua:255 +msgid "Brown Coral Panel" +msgstr "" + +#: src/_locale_workbench.lua:256 +msgid "Brown Coral Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:257 +msgid "Brown Coral Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:258 +msgid "Orange Coral Stair" +msgstr "" + +#: src/_locale_workbench.lua:259 +msgid "Orange Coral Slab" +msgstr "" + +#: src/_locale_workbench.lua:260 +msgid "Inner Orange Coral Stair" +msgstr "" + +#: src/_locale_workbench.lua:261 +msgid "Outer Orange Coral Stair" +msgstr "" + +#: src/_locale_workbench.lua:262 +msgid "Orange Coral Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:263 +msgid "Orange Coral Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:264 +msgid "Orange Coral Microslab" +msgstr "" + +#: src/_locale_workbench.lua:265 +msgid "Orange Coral Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:266 +msgid "Orange Coral Cube" +msgstr "" + +#: src/_locale_workbench.lua:267 +msgid "Orange Coral Panel" +msgstr "" + +#: src/_locale_workbench.lua:268 +msgid "Orange Coral Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:269 +msgid "Orange Coral Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:270 +msgid "Coral Skeleton Stair" +msgstr "" + +#: src/_locale_workbench.lua:271 +msgid "Coral Skeleton Slab" +msgstr "" + +#: src/_locale_workbench.lua:272 +msgid "Inner Coral Skeleton Stair" +msgstr "" + +#: src/_locale_workbench.lua:273 +msgid "Outer Coral Skeleton Stair" +msgstr "" + +#: src/_locale_workbench.lua:274 +msgid "Coral Skeleton Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:275 +msgid "Coral Skeleton Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:276 +msgid "Coral Skeleton Microslab" +msgstr "" + +#: src/_locale_workbench.lua:277 +msgid "Coral Skeleton Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:278 +msgid "Coral Skeleton Cube" +msgstr "" + +#: src/_locale_workbench.lua:279 +msgid "Coral Skeleton Panel" +msgstr "" + +#: src/_locale_workbench.lua:280 +msgid "Coral Skeleton Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:281 +msgid "Coral Skeleton Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:282 +msgid "Desert Cobblestone Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:283 +msgid "Desert Cobblestone Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:284 +msgid "Desert Cobblestone Microslab" +msgstr "" + +#: src/_locale_workbench.lua:285 +msgid "Desert Cobblestone Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:286 +msgid "Desert Cobblestone Cube" +msgstr "" + +#: src/_locale_workbench.lua:287 +msgid "Desert Cobblestone Panel" +msgstr "" + +#: src/_locale_workbench.lua:288 +msgid "Desert Cobblestone Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:289 +msgid "Desert Cobblestone Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:290 +msgid "Desert Sandstone Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:291 +msgid "Desert Sandstone Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:292 +msgid "Desert Sandstone Microslab" +msgstr "" + +#: src/_locale_workbench.lua:293 +msgid "Desert Sandstone Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:294 +msgid "Desert Sandstone Cube" +msgstr "" + +#: src/_locale_workbench.lua:295 +msgid "Desert Sandstone Panel" +msgstr "" + +#: src/_locale_workbench.lua:296 +msgid "Desert Sandstone Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:297 +msgid "Desert Sandstone Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:298 +msgid "Desert Sandstone Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:299 +msgid "Desert Sandstone Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:300 +msgid "Desert Sandstone Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:301 +msgid "Desert Sandstone Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:302 +msgid "Desert Sandstone Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:303 +msgid "Desert Sandstone Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:304 +msgid "Desert Sandstone Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:305 +msgid "Desert Sandstone Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:306 +msgid "Desert Sandstone Brick Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:307 +msgid "Desert Sandstone Brick Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:308 +msgid "Desert Sandstone Brick Microslab" +msgstr "" + +#: src/_locale_workbench.lua:309 +msgid "Desert Sandstone Brick Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:310 +msgid "Desert Sandstone Brick Cube" +msgstr "" + +#: src/_locale_workbench.lua:311 +msgid "Desert Sandstone Brick Panel" +msgstr "" + +#: src/_locale_workbench.lua:312 +msgid "Desert Sandstone Brick Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:313 +msgid "Desert Sandstone Brick Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:314 +msgid "Desert Stone Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:315 +msgid "Desert Stone Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:316 +msgid "Desert Stone Microslab" +msgstr "" + +#: src/_locale_workbench.lua:317 +msgid "Desert Stone Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:318 +msgid "Desert Stone Cube" +msgstr "" + +#: src/_locale_workbench.lua:319 +msgid "Desert Stone Panel" +msgstr "" + +#: src/_locale_workbench.lua:320 +msgid "Desert Stone Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:321 +msgid "Desert Stone Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:322 +msgid "Desert Stone Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:323 +msgid "Desert Stone Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:324 +msgid "Desert Stone Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:325 +msgid "Desert Stone Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:326 +msgid "Desert Stone Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:327 +msgid "Desert Stone Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:328 +msgid "Desert Stone Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:329 +msgid "Desert Stone Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:330 +msgid "Desert Stone Brick Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:331 +msgid "Desert Stone Brick Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:332 +msgid "Desert Stone Brick Microslab" +msgstr "" + +#: src/_locale_workbench.lua:333 +msgid "Desert Stone Brick Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:334 +msgid "Desert Stone Brick Cube" +msgstr "" + +#: src/_locale_workbench.lua:335 +msgid "Desert Stone Brick Panel" +msgstr "" + +#: src/_locale_workbench.lua:336 +msgid "Desert Stone Brick Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:337 +msgid "Desert Stone Brick Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:338 +msgid "Diamond Block Stair" +msgstr "" + +#: src/_locale_workbench.lua:339 +msgid "Diamond Block Slab" +msgstr "" + +#: src/_locale_workbench.lua:340 +msgid "Inner Diamond Block Stair" +msgstr "" + +#: src/_locale_workbench.lua:341 +msgid "Outer Diamond Block Stair" +msgstr "" + +#: src/_locale_workbench.lua:342 +msgid "Diamond Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:343 +msgid "Diamond Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:344 +msgid "Diamond Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:345 +msgid "Diamond Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:346 +msgid "Diamond Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:347 +msgid "Diamond Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:348 +msgid "Diamond Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:349 +msgid "Diamond Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:350 +msgid "Glass Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:351 +msgid "Glass Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:352 +msgid "Glass Microslab" +msgstr "" + +#: src/_locale_workbench.lua:353 +msgid "Glass Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:354 +msgid "Glass Cube" +msgstr "" + +#: src/_locale_workbench.lua:355 +msgid "Glass Panel" +msgstr "" + +#: src/_locale_workbench.lua:356 +msgid "Glass Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:357 +msgid "Glass Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:358 +msgid "Gold Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:359 +msgid "Gold Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:360 +msgid "Gold Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:361 +msgid "Gold Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:362 +msgid "Gold Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:363 +msgid "Gold Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:364 +msgid "Gold Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:365 +msgid "Gold Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:366 +msgid "Ice Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:367 +msgid "Ice Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:368 +msgid "Ice Microslab" +msgstr "" + +#: src/_locale_workbench.lua:369 +msgid "Ice Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:370 +msgid "Ice Cube" +msgstr "" + +#: src/_locale_workbench.lua:371 +msgid "Ice Panel" +msgstr "" + +#: src/_locale_workbench.lua:372 +msgid "Ice Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:373 +msgid "Ice Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:374 +msgid "Jungle Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:375 +msgid "Jungle Tree Slab" +msgstr "" + +#: src/_locale_workbench.lua:376 +msgid "Inner Jungle Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:377 +msgid "Outer Jungle Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:378 +msgid "Jungle Tree Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:379 +msgid "Jungle Tree Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:380 +msgid "Jungle Tree Microslab" +msgstr "" + +#: src/_locale_workbench.lua:381 +msgid "Jungle Tree Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:382 +msgid "Jungle Tree Cube" +msgstr "" + +#: src/_locale_workbench.lua:383 +msgid "Jungle Tree Panel" +msgstr "" + +#: src/_locale_workbench.lua:384 +msgid "Jungle Tree Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:385 +msgid "Jungle Tree Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:386 +msgid "Jungle Wood Planks Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:387 +msgid "Jungle Wood Planks Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:388 +msgid "Jungle Wood Planks Microslab" +msgstr "" + +#: src/_locale_workbench.lua:389 +msgid "Jungle Wood Planks Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:390 +msgid "Jungle Wood Planks Cube" +msgstr "" + +#: src/_locale_workbench.lua:391 +msgid "Jungle Wood Planks Panel" +msgstr "" + +#: src/_locale_workbench.lua:392 +msgid "Jungle Wood Planks Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:393 +msgid "Jungle Wood Planks Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:394 +msgid "Mossy Cobblestone Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:395 +msgid "Mossy Cobblestone Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:396 +msgid "Mossy Cobblestone Microslab" +msgstr "" + +#: src/_locale_workbench.lua:397 +msgid "Mossy Cobblestone Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:398 +msgid "Mossy Cobblestone Cube" +msgstr "" + +#: src/_locale_workbench.lua:399 +msgid "Mossy Cobblestone Panel" +msgstr "" + +#: src/_locale_workbench.lua:400 +msgid "Mossy Cobblestone Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:401 +msgid "Mossy Cobblestone Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:402 +msgid "Obsidian Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:403 +msgid "Obsidian Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:404 +msgid "Obsidian Microslab" +msgstr "" + +#: src/_locale_workbench.lua:405 +msgid "Obsidian Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:406 +msgid "Obsidian Cube" +msgstr "" + +#: src/_locale_workbench.lua:407 +msgid "Obsidian Panel" +msgstr "" + +#: src/_locale_workbench.lua:408 +msgid "Obsidian Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:409 +msgid "Obsidian Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:410 +msgid "Obsidian Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:411 +msgid "Obsidian Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:412 +msgid "Obsidian Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:413 +msgid "Obsidian Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:414 +msgid "Obsidian Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:415 +msgid "Obsidian Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:416 +msgid "Obsidian Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:417 +msgid "Obsidian Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:418 +msgid "Obsidian Glass Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:419 +msgid "Obsidian Glass Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:420 +msgid "Obsidian Glass Microslab" +msgstr "" + +#: src/_locale_workbench.lua:421 +msgid "Obsidian Glass Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:422 +msgid "Obsidian Glass Cube" +msgstr "" + +#: src/_locale_workbench.lua:423 +msgid "Obsidian Glass Panel" +msgstr "" + +#: src/_locale_workbench.lua:424 +msgid "Obsidian Glass Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:425 +msgid "Obsidian Glass Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:426 +msgid "Obsidian Brick Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:427 +msgid "Obsidian Brick Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:428 +msgid "Obsidian Brick Microslab" +msgstr "" + +#: src/_locale_workbench.lua:429 +msgid "Obsidian Brick Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:430 +msgid "Obsidian Brick Cube" +msgstr "" + +#: src/_locale_workbench.lua:431 +msgid "Obsidian Brick Panel" +msgstr "" + +#: src/_locale_workbench.lua:432 +msgid "Obsidian Brick Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:433 +msgid "Obsidian Brick Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:434 +msgid "Permafrost Stair" +msgstr "" + +#: src/_locale_workbench.lua:435 +msgid "Permafrost Slab" +msgstr "" + +#: src/_locale_workbench.lua:436 +msgid "Inner Permafrost Stair" +msgstr "" + +#: src/_locale_workbench.lua:437 +msgid "Outer Permafrost Stair" +msgstr "" + +#: src/_locale_workbench.lua:438 +msgid "Permafrost Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:439 +msgid "Permafrost Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:440 +msgid "Permafrost Microslab" +msgstr "" + +#: src/_locale_workbench.lua:441 +msgid "Permafrost Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:442 +msgid "Permafrost Cube" +msgstr "" + +#: src/_locale_workbench.lua:443 +msgid "Permafrost Panel" +msgstr "" + +#: src/_locale_workbench.lua:444 +msgid "Permafrost Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:445 +msgid "Permafrost Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:446 +msgid "Permafrost with Moss Stair" +msgstr "" + +#: src/_locale_workbench.lua:447 +msgid "Inner Permafrost with Moss Stair" +msgstr "" + +#: src/_locale_workbench.lua:448 +msgid "Outer Permafrost with Moss Stair" +msgstr "" + +#: src/_locale_workbench.lua:449 +msgid "Permafrost with Moss Slab" +msgstr "" + +#: src/_locale_workbench.lua:450 +msgid "Permafrost with Moss Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:451 +msgid "Permafrost with Moss Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:452 +msgid "Permafrost with Moss Microslab" +msgstr "" + +#: src/_locale_workbench.lua:453 +msgid "Permafrost with Moss Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:454 +msgid "Permafrost with Moss Cube" +msgstr "" + +#: src/_locale_workbench.lua:455 +msgid "Permafrost with Moss Panel" +msgstr "" + +#: src/_locale_workbench.lua:456 +msgid "Permafrost with Moss Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:457 +msgid "Permafrost with Moss Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:458 +msgid "Permafrost with Stones Stair" +msgstr "" + +#: src/_locale_workbench.lua:459 +msgid "Inner Permafrost with Stones Stair" +msgstr "" + +#: src/_locale_workbench.lua:460 +msgid "Outer Permafrost with Stones Stair" +msgstr "" + +#: src/_locale_workbench.lua:461 +msgid "Permafrost with Stones Slab" +msgstr "" + +#: src/_locale_workbench.lua:462 +msgid "Permafrost with Stones Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:463 +msgid "Permafrost with Stones Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:464 +msgid "Permafrost with Stones Microslab" +msgstr "" + +#: src/_locale_workbench.lua:465 +msgid "Permafrost with Stones Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:466 +msgid "Permafrost with Stones Cube" +msgstr "" + +#: src/_locale_workbench.lua:467 +msgid "Permafrost with Stones Panel" +msgstr "" + +#: src/_locale_workbench.lua:468 +msgid "Permafrost with Stones Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:469 +msgid "Permafrost with Stones Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:470 +msgid "Pine Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:471 +msgid "Pine Tree Slab" +msgstr "" + +#: src/_locale_workbench.lua:472 +msgid "Inner Pine Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:473 +msgid "Outer Pine Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:474 +msgid "Pine Tree Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:475 +msgid "Pine Tree Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:476 +msgid "Pine Tree Microslab" +msgstr "" + +#: src/_locale_workbench.lua:477 +msgid "Pine Tree Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:478 +msgid "Pine Tree Cube" +msgstr "" + +#: src/_locale_workbench.lua:479 +msgid "Pine Tree Panel" +msgstr "" + +#: src/_locale_workbench.lua:480 +msgid "Pine Tree Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:481 +msgid "Pine Tree Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:482 +msgid "Pine Wood Planks Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:483 +msgid "Pine Wood Planks Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:484 +msgid "Pine Wood Planks Microslab" +msgstr "" + +#: src/_locale_workbench.lua:485 +msgid "Pine Wood Planks Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:486 +msgid "Pine Wood Planks Cube" +msgstr "" + +#: src/_locale_workbench.lua:487 +msgid "Pine Wood Planks Panel" +msgstr "" + +#: src/_locale_workbench.lua:488 +msgid "Pine Wood Planks Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:489 +msgid "Pine Wood Planks Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:490 +msgid "Sandstone Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:491 +msgid "Sandstone Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:492 +msgid "Sandstone Microslab" +msgstr "" + +#: src/_locale_workbench.lua:493 +msgid "Sandstone Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:494 +msgid "Sandstone Cube" +msgstr "" + +#: src/_locale_workbench.lua:495 +msgid "Sandstone Panel" +msgstr "" + +#: src/_locale_workbench.lua:496 +msgid "Sandstone Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:497 +msgid "Sandstone Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:498 +msgid "Sandstone Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:499 +msgid "Sandstone Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:500 +msgid "Sandstone Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:501 +msgid "Sandstone Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:502 +msgid "Sandstone Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:503 +msgid "Sandstone Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:504 +msgid "Sandstone Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:505 +msgid "Sandstone Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:506 +msgid "Sandstone Brick Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:507 +msgid "Sandstone Brick Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:508 +msgid "Sandstone Brick Microslab" +msgstr "" + +#: src/_locale_workbench.lua:509 +msgid "Sandstone Brick Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:510 +msgid "Sandstone Brick Cube" +msgstr "" + +#: src/_locale_workbench.lua:511 +msgid "Sandstone Brick Panel" +msgstr "" + +#: src/_locale_workbench.lua:512 +msgid "Sandstone Brick Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:513 +msgid "Sandstone Brick Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:514 +msgid "Silver Sandstone Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:515 +msgid "Silver Sandstone Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:516 +msgid "Silver Sandstone Microslab" +msgstr "" + +#: src/_locale_workbench.lua:517 +msgid "Silver Sandstone Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:518 +msgid "Silver Sandstone Cube" +msgstr "" + +#: src/_locale_workbench.lua:519 +msgid "Silver Sandstone Panel" +msgstr "" + +#: src/_locale_workbench.lua:520 +msgid "Silver Sandstone Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:521 +msgid "Silver Sandstone Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:522 +msgid "Silver Sandstone Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:523 +msgid "Silver Sandstone Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:524 +msgid "Silver Sandstone Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:525 +msgid "Silver Sandstone Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:526 +msgid "Silver Sandstone Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:527 +msgid "Silver Sandstone Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:528 +msgid "Silver Sandstone Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:529 +msgid "Silver Sandstone Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:530 +msgid "Silver Sandstone Brick Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:531 +msgid "Silver Sandstone Brick Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:532 +msgid "Silver Sandstone Brick Microslab" +msgstr "" + +#: src/_locale_workbench.lua:533 +msgid "Silver Sandstone Brick Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:534 +msgid "Silver Sandstone Brick Cube" +msgstr "" + +#: src/_locale_workbench.lua:535 +msgid "Silver Sandstone Brick Panel" +msgstr "" + +#: src/_locale_workbench.lua:536 +msgid "Silver Sandstone Brick Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:537 +msgid "Silver Sandstone Brick Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:538 +msgid "Steel Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:539 +msgid "Steel Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:540 +msgid "Steel Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:541 +msgid "Steel Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:542 +msgid "Steel Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:543 +msgid "Steel Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:544 +msgid "Steel Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:545 +msgid "Steel Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:546 +msgid "Stone Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:547 +msgid "Stone Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:548 +msgid "Stone Microslab" +msgstr "" + +#: src/_locale_workbench.lua:549 +msgid "Stone Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:550 +msgid "Stone Cube" +msgstr "" + +#: src/_locale_workbench.lua:551 +msgid "Stone Panel" +msgstr "" + +#: src/_locale_workbench.lua:552 +msgid "Stone Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:553 +msgid "Stone Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:554 +msgid "Stone Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:555 +msgid "Stone Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:556 +msgid "Stone Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:557 +msgid "Stone Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:558 +msgid "Stone Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:559 +msgid "Stone Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:560 +msgid "Stone Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:561 +msgid "Stone Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:562 +msgid "Stone Brick Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:563 +msgid "Stone Brick Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:564 +msgid "Stone Brick Microslab" +msgstr "" + +#: src/_locale_workbench.lua:565 +msgid "Stone Brick Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:566 +msgid "Stone Brick Cube" +msgstr "" + +#: src/_locale_workbench.lua:567 +msgid "Stone Brick Panel" +msgstr "" + +#: src/_locale_workbench.lua:568 +msgid "Stone Brick Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:569 +msgid "Stone Brick Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:570 +msgid "Tin Block Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:571 +msgid "Tin Block Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:572 +msgid "Tin Block Microslab" +msgstr "" + +#: src/_locale_workbench.lua:573 +msgid "Tin Block Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:574 +msgid "Tin Block Cube" +msgstr "" + +#: src/_locale_workbench.lua:575 +msgid "Tin Block Panel" +msgstr "" + +#: src/_locale_workbench.lua:576 +msgid "Tin Block Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:577 +msgid "Tin Block Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:578 +msgid "Apple Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:579 +msgid "Apple Tree Slab" +msgstr "" + +#: src/_locale_workbench.lua:580 +msgid "Inner Apple Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:581 +msgid "Outer Apple Tree Stair" +msgstr "" + +#: src/_locale_workbench.lua:582 +msgid "Apple Tree Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:583 +msgid "Apple Tree Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:584 +msgid "Apple Tree Microslab" +msgstr "" + +#: src/_locale_workbench.lua:585 +msgid "Apple Tree Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:586 +msgid "Apple Tree Cube" +msgstr "" + +#: src/_locale_workbench.lua:587 +msgid "Apple Tree Panel" +msgstr "" + +#: src/_locale_workbench.lua:588 +msgid "Apple Tree Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:589 +msgid "Apple Tree Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:590 +msgid "Apple Wood Planks Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:591 +msgid "Apple Wood Planks Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:592 +msgid "Apple Wood Planks Microslab" +msgstr "" + +#: src/_locale_workbench.lua:593 +msgid "Apple Wood Planks Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:594 +msgid "Apple Wood Planks Cube" +msgstr "" + +#: src/_locale_workbench.lua:595 +msgid "Apple Wood Planks Panel" +msgstr "" + +#: src/_locale_workbench.lua:596 +msgid "Apple Wood Planks Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:597 +msgid "Apple Wood Planks Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:598 +msgid "Straw Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:599 +msgid "Straw Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:600 +msgid "Straw Microslab" +msgstr "" + +#: src/_locale_workbench.lua:601 +msgid "Straw Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:602 +msgid "Straw Cube" +msgstr "" + +#: src/_locale_workbench.lua:603 +msgid "Straw Panel" +msgstr "" + +#: src/_locale_workbench.lua:604 +msgid "Straw Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:605 +msgid "Straw Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:606 +msgid "Black Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:607 +msgid "Black Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:608 +msgid "Inner Black Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:609 +msgid "Outer Black Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:610 +msgid "Black Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:611 +msgid "Black Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:612 +msgid "Black Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:613 +msgid "Black Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:614 +msgid "Black Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:615 +msgid "Black Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:616 +msgid "Black Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:617 +msgid "Black Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:618 +msgid "Blue Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:619 +msgid "Blue Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:620 +msgid "Inner Blue Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:621 +msgid "Outer Blue Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:622 +msgid "Blue Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:623 +msgid "Blue Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:624 +msgid "Blue Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:625 +msgid "Blue Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:626 +msgid "Blue Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:627 +msgid "Blue Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:628 +msgid "Blue Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:629 +msgid "Blue Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:630 +msgid "Brown Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:631 +msgid "Brown Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:632 +msgid "Inner Brown Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:633 +msgid "Outer Brown Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:634 +msgid "Brown Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:635 +msgid "Brown Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:636 +msgid "Brown Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:637 +msgid "Brown Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:638 +msgid "Brown Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:639 +msgid "Brown Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:640 +msgid "Brown Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:641 +msgid "Brown Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:642 +msgid "Cyan Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:643 +msgid "Cyan Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:644 +msgid "Inner Cyan Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:645 +msgid "Outer Cyan Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:646 +msgid "Cyan Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:647 +msgid "Cyan Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:648 +msgid "Cyan Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:649 +msgid "Cyan Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:650 +msgid "Cyan Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:651 +msgid "Cyan Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:652 +msgid "Cyan Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:653 +msgid "Cyan Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:654 +msgid "Dark Green Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:655 +msgid "Dark Green Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:656 +msgid "Inner Dark Green Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:657 +msgid "Outer Dark Green Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:658 +msgid "Dark Green Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:659 +msgid "Dark Green Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:660 +msgid "Dark Green Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:661 +msgid "Dark Green Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:662 +msgid "Dark Green Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:663 +msgid "Dark Green Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:664 +msgid "Dark Green Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:665 +msgid "Dark Green Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:666 +msgid "Dark Grey Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:667 +msgid "Dark Grey Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:668 +msgid "Inner Dark Grey Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:669 +msgid "Outer Dark Grey Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:670 +msgid "Dark Grey Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:671 +msgid "Dark Grey Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:672 +msgid "Dark Grey Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:673 +msgid "Dark Grey Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:674 +msgid "Dark Grey Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:675 +msgid "Dark Grey Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:676 +msgid "Dark Grey Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:677 +msgid "Dark Grey Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:678 +msgid "Green Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:679 +msgid "Green Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:680 +msgid "Inner Green Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:681 +msgid "Outer Green Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:682 +msgid "Green Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:683 +msgid "Green Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:684 +msgid "Green Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:685 +msgid "Green Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:686 +msgid "Green Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:687 +msgid "Green Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:688 +msgid "Green Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:689 +msgid "Green Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:690 +msgid "Grey Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:691 +msgid "Grey Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:692 +msgid "Inner Grey Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:693 +msgid "Outer Grey Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:694 +msgid "Grey Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:695 +msgid "Grey Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:696 +msgid "Grey Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:697 +msgid "Grey Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:698 +msgid "Grey Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:699 +msgid "Grey Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:700 +msgid "Grey Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:701 +msgid "Grey Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:702 +msgid "Magenta Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:703 +msgid "Magenta Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:704 +msgid "Inner Magenta Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:705 +msgid "Outer Magenta Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:706 +msgid "Magenta Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:707 +msgid "Magenta Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:708 +msgid "Magenta Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:709 +msgid "Magenta Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:710 +msgid "Magenta Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:711 +msgid "Magenta Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:712 +msgid "Magenta Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:713 +msgid "Magenta Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:714 +msgid "Orange Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:715 +msgid "Orange Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:716 +msgid "Inner Orange Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:717 +msgid "Outer Orange Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:718 +msgid "Orange Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:719 +msgid "Orange Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:720 +msgid "Orange Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:721 +msgid "Orange Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:722 +msgid "Orange Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:723 +msgid "Orange Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:724 +msgid "Orange Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:725 +msgid "Orange Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:726 +msgid "Pink Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:727 +msgid "Pink Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:728 +msgid "Inner Pink Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:729 +msgid "Outer Pink Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:730 +msgid "Pink Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:731 +msgid "Pink Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:732 +msgid "Pink Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:733 +msgid "Pink Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:734 +msgid "Pink Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:735 +msgid "Pink Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:736 +msgid "Pink Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:737 +msgid "Pink Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:738 +msgid "Red Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:739 +msgid "Red Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:740 +msgid "Inner Red Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:741 +msgid "Outer Red Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:742 +msgid "Red Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:743 +msgid "Red Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:744 +msgid "Red Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:745 +msgid "Red Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:746 +msgid "Red Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:747 +msgid "Red Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:748 +msgid "Red Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:749 +msgid "Red Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:750 +msgid "Violet Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:751 +msgid "Violet Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:752 +msgid "Inner Violet Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:753 +msgid "Outer Violet Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:754 +msgid "Violet Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:755 +msgid "Violet Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:756 +msgid "Violet Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:757 +msgid "Violet Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:758 +msgid "Violet Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:759 +msgid "Violet Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:760 +msgid "Violet Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:761 +msgid "Violet Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:762 +msgid "White Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:763 +msgid "White Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:764 +msgid "Inner White Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:765 +msgid "Outer White Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:766 +msgid "White Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:767 +msgid "White Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:768 +msgid "White Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:769 +msgid "White Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:770 +msgid "White Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:771 +msgid "White Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:772 +msgid "White Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:773 +msgid "White Wool Half-Stair" +msgstr "" + +#: src/_locale_workbench.lua:774 +msgid "Yellow Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:775 +msgid "Yellow Wool Slab" +msgstr "" + +#: src/_locale_workbench.lua:776 +msgid "Inner Yellow Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:777 +msgid "Outer Yellow Wool Stair" +msgstr "" + +#: src/_locale_workbench.lua:778 +msgid "Yellow Wool Nanoslab" +msgstr "" + +#: src/_locale_workbench.lua:779 +msgid "Yellow Wool Micropanel" +msgstr "" + +#: src/_locale_workbench.lua:780 +msgid "Yellow Wool Microslab" +msgstr "" + +#: src/_locale_workbench.lua:781 +msgid "Yellow Wool Thin Stair" +msgstr "" + +#: src/_locale_workbench.lua:782 +msgid "Yellow Wool Cube" +msgstr "" + +#: src/_locale_workbench.lua:783 +msgid "Yellow Wool Panel" +msgstr "" + +#: src/_locale_workbench.lua:784 +msgid "Yellow Wool Double Panel" +msgstr "" + +#: src/_locale_workbench.lua:785 +msgid "Yellow Wool Half-Stair" +msgstr "" diff --git a/mods/xdecor/locale/xdecor.de.po b/mods/xdecor/locale/xdecor.de.po new file mode 100644 index 0000000..1379a2b --- /dev/null +++ b/mods/xdecor/locale/xdecor.de.po @@ -0,0 +1,1105 @@ +msgid "" +msgstr "" +"Project-Id-Version: Luanti textdomain xdecor\n" +"Report-Msgid-Bugs-To: Wuzzy@disroot.org\n" +"POT-Creation-Date: 2025-10-18 11:01+0200\n" +"PO-Revision-Date: 2025-10-18 10:47+0200\n" +"Last-Translator: Wuzzy \n" +"Language-Team: \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.6\n" + +#. ~ Block name of a 'traditional' stair-shaped block. (@1 = base block name, e.g. "Stone") +#: handlers/registration.lua:75 handlers/registration.lua:91 +#: src/workbench.lua:80 src/workbench.lua:470 +msgid "@1 Stair" +msgstr "@1treppe" + +#: handlers/registration.lua:78 handlers/registration.lua:94 +#: src/workbench.lua:471 +msgid "Inner @1 Stair" +msgstr "Innere @1treppe" + +#: handlers/registration.lua:80 handlers/registration.lua:95 +#: src/workbench.lua:472 +msgid "Outer @1 Stair" +msgstr "Äußere @1treppe" + +#. ~ Block name of a block with 1/2 the height of a full block. (@1 = base block name, e.g. "Stone") +#: handlers/registration.lua:84 handlers/registration.lua:92 +#: src/workbench.lua:63 src/workbench.lua:473 +msgid "@1 Slab" +msgstr "@1platte" + +#: src/chessbot_random.lua:51 +msgid "Random Computer" +msgstr "Zufallscomputer" + +#: src/chessbot_weak.lua:125 +msgid "Weak Computer" +msgstr "Schwacher Computer" + +#: src/chess.lua:196 +msgid "Chess" +msgstr "Schach" + +#: src/chess.lua:197 +msgid "Chess Debug" +msgstr "Schachdebug" + +#. ~ Chess: Game mode selection prompt +#: src/chess.lua:1284 src/chess.lua:1285 +msgid "Select a game mode" +msgstr "Wählen Sie einen Spielmodus" + +#. ~ Chess: Game mode selection prompt +#: src/chess.lua:1287 +msgid "Select a mode:" +msgstr "Modus wählen:" + +#. ~ Chess game mode (player vs bot) +#: src/chess.lua:1289 +msgid "Singleplayer" +msgstr "Einzelspieler" + +#. ~ Chess game mode (player vs player) +#: src/chess.lua:1291 +msgid "Multiplayer" +msgstr "Mehrspieler" + +#. ~ Chess game mode +#: src/chess.lua:1294 +msgid "Bot vs Bot" +msgstr "Bot vs. Bot" + +#. ~ Chess: player is in check +#: src/chess.lua:1814 +msgid "check" +msgstr "Schach" + +#. ~ Chess: player has been checkmated +#: src/chess.lua:1816 +msgid "checkmate" +msgstr "Schachmatt" + +#. ~ Chess: player has resigned +#: src/chess.lua:1818 +msgid "resigned" +msgstr "aufgegeben" + +#. ~ Chess: player has won +#: src/chess.lua:1820 +msgid "winner" +msgstr "Sieger" + +#. ~ Chess: player has lost +#: src/chess.lua:1822 +msgid "loser" +msgstr "Verlierer" + +#. ~ Chess: player has a draw +#: src/chess.lua:1824 +msgid "draw" +msgstr "Remis" + +#. ~ Chess: Shown when black player can promote a pawn. Space for text is limited. +#: src/chess.lua:1869 +msgid "" +"PROMOTION\n" +"FOR BLACK!" +msgstr "" +"UMWANDLUNG\n" +"FÜR SCHWARZ!" + +#. ~ Chess: Prompt for player who must select to which piece to promote their pawn. Space for text is limited. +#: src/chess.lua:1875 src/chess.lua:1891 +msgid "Promote pawn to:" +msgstr "Bauer umwandeln zu:" + +#. ~ Chess: Shown when white player can promote a pawn. Space for text is limited. +#: src/chess.lua:1886 +msgid "" +"PROMOTION\n" +"FOR WHITE!" +msgstr "" +"UMWANDLUNG\n" +"FÜR WEISS!" + +#. ~ Chess: Shown when white player wants to use the 50-move rule or threefold-repetition rule to claim a draw. Space for text is limited. +#: src/chess.lua:1904 +msgid "" +"DRAW CLAIM\n" +"BY WHITE!" +msgstr "" +"REMISANSPRUCH\n" +"VON WEISS!" + +#. ~ Chess: Shown when black player wants to use the 50-move rule or threefold-repetition rule to claim a draw. Space for text is limited. +#: src/chess.lua:1907 +msgid "" +"DRAW CLAIM\n" +"BY BLACK!" +msgstr "" +"REMISANSPRUCH\n" +"VON SCHWARZ!" + +#. ~ Chess message +#: src/chess.lua:1914 +msgid "" +"The player has invoked the 50-move rule for the next move. The next move " +"might draw the game." +msgstr "" +"Der Spieler will für den nächsten Zug die 50-Züge-Regel anwenden. Der " +"nächste Zug könnte die Partie remis enden lassen." + +#. ~ Chess message +#: src/chess.lua:1920 +msgid "" +"The player has invoked the threefold-repetition rule for the next move. The " +"next move might draw the game." +msgstr "" +"Der Spieler will für den nächsten Zug die Regel für wiederholte Stellungen " +"anwenden. Der nächste Zug könnte die Partie remis enden lassen." + +#. ~ Chess button +#: src/chess.lua:1927 +msgid "New game" +msgstr "Neues Spiel" + +#. ~ Resign (give up) in Chess +#: src/chess.lua:1934 +msgid "Resign" +msgstr "Aufgeben" + +#. ~ Chess: Prompt to select a player color +#: src/chess.lua:1940 +msgid "Select a color:" +msgstr "Farbe wählen:" + +#. ~ White Chess player +#: src/chess.lua:1944 +msgid "White" +msgstr "Weiß" + +#. ~ Black Chess player +#: src/chess.lua:1946 +msgid "Black" +msgstr "Schwarz" + +#. ~ Chess message +#: src/chess.lua:1958 +msgid "Invoke the 50-move rule for your next move" +msgstr "50-Züge-Regel für den nächsten Zug anwenden" + +#. ~ Chess message +#: src/chess.lua:1965 +msgid "Invoke the 50-move rule and draw the game" +msgstr "50-Züge-Regel anwenden und die Partie remis enden lassen" + +#. ~ Chess message +#: src/chess.lua:1978 +msgid "Invoke the threefold repetition rule and draw the game" +msgstr "Stellungswiederholungsregel anwenden und die Partie remis enden lassen" + +#. ~ Chess message +#: src/chess.lua:1985 +msgid "Invoke the threefold repetition rule for your next move" +msgstr "Stellungswiederholungsregel für den nächsten Zug anwenden" + +#. ~ Chess message. @1 = opponent name +#: src/chess.lua:2116 src/chess.lua:2141 +msgid "You have checkmated @1. You win!" +msgstr "Sie haben @1 schachmatt gesetzt. Sieg!" + +#. ~ Chess message. @1 = opponent name +#: src/chess.lua:2118 src/chess.lua:2143 +msgid "You were checkmated by @1. You lose!" +msgstr "Sie wurden von @1 schachmatt gesetzt. Niederlage!" + +#. ~ Chess message +#: src/chess.lua:2128 src/chess.lua:2153 +msgid "The game ended up in a stalemate! It's a draw!" +msgstr "Das Partie endete in einem Patt. Das ist ein Remis!" + +#. ~ Chess message +#: src/chess.lua:2166 +msgid "The game ended up in a dead position! It's a draw!" +msgstr "Das Partie endete in einer toten Stellung. Das ist ein Remis!" + +#. ~ Chess message +#: src/chess.lua:2180 +msgid "" +"No piece was captured and no pawn was moved for 75 consecutive moves of each " +"player. It's a draw!" +msgstr "" +"Für 75 Züge in Folge von je beiden Spielern wurde keine Figur geschlagen und " +"kein Bauer gezogen. Es ist ein Remis!" + +#. ~ Chess message +#: src/chess.lua:2203 src/chess.lua:3187 +msgid "You have drawn the game by invoking the 50-move rule." +msgstr "" +"Sie haben die Partie remis enden lassen, indem Sie die 50-Züge-Regel " +"angewandt haben." + +#. ~ Chess message. @1 = player name +#: src/chess.lua:2206 src/chess.lua:3190 +msgid "@1 has drawn the game by invoking the 50-move rule." +msgstr "@1 hat die Partie mittels der 50-Züge Regel remis enden lassen." + +#. ~ Chess message shown when player has invoked a rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2221 src/chess.lua:2334 +msgid "You have failed to make a game-drawing move. The game continues." +msgstr "" +"Sie haben keinen Zug gemacht, der die Partie remis enden lässt. Die Partie " +"geht weiter." + +#. ~ Chess message shown when player (name = @1) has invoked the 50-move rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2224 +msgid "" +"@1 made a draw claim using the 50-move rule but it was false. The game " +"continues." +msgstr "" +"@1 hat ein Remis mittels der 50-Züge-Regel beansprucht aber lag falsch. Die " +"Partie geht weiter." + +#. ~ Chess message when a fivefold repetition has happened +#: src/chess.lua:2294 +msgid "The exact same position has occured 5 times. It's a draw!" +msgstr "Die exakt gleiche Stellung ist 5 mal aufgetreten. Das ist ein Remis!" + +#. ~ Chess message +#: src/chess.lua:2317 src/chess.lua:3235 +msgid "You have drawn the game by invoking the threefold repetition rule." +msgstr "" +"Sie haben die Partie remis enden lassen, indem Sie die " +"Stellungswiederholungsregel angewandt haben." + +#. ~ Chess message. @1 = player name +#: src/chess.lua:2320 src/chess.lua:3238 +msgid "@1 has drawn the game by invoking the threefold repetition rule." +msgstr "" +"@1 hat die Partie remis mittels der Stellungswiederholungsregel enden lassen." + +#. ~ Chess message shown when player (name = @1) has invoked the threefold repetition rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2337 +msgid "" +"@1 made a draw claim using the threefold repetition rule but it was false. " +"The game continues." +msgstr "" +"@1 hat ein Remis mittels der Stellungswiederholungsregel beansprucht aber " +"lag falsch. Die Partie geht weiter." + +#: src/chess.lua:2350 src/chess.lua:3479 +msgid "Chess Board" +msgstr "Schachbrett" + +#. ~ Chess message when player tries to move with someone else's pieces +#: src/chess.lua:2444 +msgid "Someone else plays white pieces!" +msgstr "Jemand anderes spielt Weiß!" + +#. ~ Chess message +#: src/chess.lua:2455 src/chess.lua:2475 +msgid "It's not your turn!" +msgstr "Sie sind nicht am Zug!" + +#. ~ Chess message when player tries to move with someone else's pieces +#: src/chess.lua:2465 +msgid "Someone else plays black pieces!" +msgstr "Jemand anderes spielt Schwarz!" + +#. ~ Chess message +#: src/chess.lua:2482 +msgid "Black cannot move first!" +msgstr "Schwarz darf nicht zuerst ziehen!" + +#. ~ number of seconds +#: src/chess.lua:3019 +msgid "@1 s" +msgstr "@1 s" + +#. ~ number of minutes and seconds +#: src/chess.lua:3023 +msgid "@1 min @2 s" +msgstr "@1 min @2 s" + +#: src/chess.lua:3096 +msgid "" +"You can't reset the chessboard, a game has been started. Try again in @1." +msgstr "" +"Sie können das Schachbrett nicht zurücksetzen, es wurde eine Partie " +"gestartet. Versuchen Sie es erneut in @1." + +#. ~ Chess message when player tried to resign too early +#: src/chess.lua:3108 +msgid "Resigning is not possible yet." +msgstr "Aufgeben ist noch nicht möglich." + +#. ~ Chess message when player resigned (gave up) +#: src/chess.lua:3139 +msgid "You have resigned." +msgstr "Sie haben aufgegeben." + +#. ~ Chess message when player resigned (gave up). @1 = opponent name +#: src/chess.lua:3142 +msgid "@1 has resigned. You win!" +msgstr "@1 hat aufgegeben. Sie haben gewonnen!" + +#. ~ Chess message +#: src/chess.lua:3148 +msgid "You can't resign, you're not playing in this game." +msgstr "Sie können nicht aufgeben, Sie spielen nicht in dieser Partie." + +#. ~ Chess message +#: src/chess.lua:3176 src/chess.lua:3223 +msgid "You can't claim a draw, it's not your turn!" +msgstr "Sie können kein Remis beanspruchen, Sie sind nicht am Zug!" + +#: src/chess.lua:3260 +msgid "You're only a spectator in this game of Chess." +msgstr "Sie sind nur Zuschauer bei dieser Schachpartie." + +#. ~ Chess message when player tried to promote a pawn when it's not legal +#: src/chess.lua:3267 +msgid "This isn't the time for promotion." +msgstr "Jetzt ist nicht die Zeit für eine Umwandlung." + +#. ~ Chess message when player tried to promote a pawn when it's not their turn +#: src/chess.lua:3271 src/chess.lua:3278 +msgid "It's not your turn! This promotion is meant for the other player." +msgstr "Sie sind nicht am Zug! Diese Umwandlung ist für den anderen Spieler." + +#. ~ Shown when player tried to dig a chessboard but is not allowed to. @1 = time +#: src/chess.lua:3326 +msgid "" +"You can't dig the chessboard, a game has been started. Reset it first or dig " +"it again in @1." +msgstr "" +"Sie können das Schachbrett nicht abbauen, es wurde eine Partie gestartet. " +"Setzen Sie es zuerst zurück oder bauen Sie es in @1 erneut ab." + +#. ~ Shown when player tried to dig a chessboard but is not allowed to. @1 = time +#: src/chess.lua:3332 +msgid "" +"You can't dig the chessboard, a game has been started. Try it again in @1." +msgstr "" +"Sie können das Schachbrett nicht abbauen, es wurde eine Partie gestartet. " +"Versuchen Sie es erneut in @1." + +#. ~ Chess board tooltip +#: src/chess.lua:3497 +msgid "Play a game of Chess against another player or the computer" +msgstr "Für Schachspiele gegen einen anderen Spieler oder den Computer" + +#. ~ chess piece +#: src/chess.lua:3606 +msgid "White Pawn" +msgstr "Weißer Bauer" + +#. ~ chess piece +#: src/chess.lua:3608 +msgid "Black Pawn" +msgstr "Schwarzer Bauer" + +#. ~ chess piece +#: src/chess.lua:3611 +msgid "White Rook" +msgstr "Weißer Turm" + +#. ~ chess piece +#: src/chess.lua:3613 +msgid "Black Rook" +msgstr "Schwarzer Turm" + +#. ~ chess piece +#: src/chess.lua:3616 +msgid "White Knight" +msgstr "Weißer Springer" + +#. ~ chess piece +#: src/chess.lua:3618 +msgid "Black Knight" +msgstr "Schwarzer Springer" + +#. ~ chess piece +#: src/chess.lua:3621 +msgid "White Bishop" +msgstr "Weißer Läufer" + +#. ~ chess piece +#: src/chess.lua:3623 +msgid "Black Bishop" +msgstr "Schwarzer Läufer" + +#. ~ chess piece +#: src/chess.lua:3626 +msgid "White Queen" +msgstr "Weiße Dame" + +#. ~ chess piece +#: src/chess.lua:3628 +msgid "Black Queen" +msgstr "Schwarze Dame" + +#. ~ chess piece +#: src/chess.lua:3631 +msgid "White King" +msgstr "Weißer König" + +#. ~ chess piece +#: src/chess.lua:3633 +msgid "Black King" +msgstr "Schwarzer König" + +#: src/chess.lua:3899 +msgid "Computer" +msgstr "Computer" + +#. ~ cauldron hint +#: src/cooking.lua:8 +msgid "Light a fire below to heat it up" +msgstr "Entfachen Sie unten ein Feuer, um ihn zu erhitzen" + +#. ~ cauldron hint +#: src/cooking.lua:10 +msgid "Use a bowl to eat the soup" +msgstr "Schüssel benutzen, um die Suppe zu essen" + +#. ~ cauldron hint +#: src/cooking.lua:12 +msgid "Drop foods inside to make a soup" +msgstr "Nahrungsmittel einwerfen, um Suppe zu machen" + +#: src/cooking.lua:15 +msgid "Cauldron (empty)" +msgstr "Kessel (leer)" + +#: src/cooking.lua:16 +msgid "Cauldron (cold water)" +msgstr "Kessel (kaltes Wasser)" + +#: src/cooking.lua:17 +msgid "Cauldron (cold river water)" +msgstr "Kessel (kaltes Flusswasser)" + +#: src/cooking.lua:18 +msgid "Cauldron (cold soup)" +msgstr "Kessel (kalte Suppe)" + +#: src/cooking.lua:19 +msgid "Cauldron (boiling water)" +msgstr "Kessel (kochendes Wasser)" + +#: src/cooking.lua:20 +msgid "Cauldron (boiling river water)" +msgstr "Kessel (kochendes Flusswasser)" + +#: src/cooking.lua:21 +msgid "Cauldron (boiling soup)" +msgstr "Kessel (kochende Supppe)" + +#: src/cooking.lua:335 +msgid "Cauldron" +msgstr "Kessel" + +#. ~ Cauldron tooltip +#: src/cooking.lua:337 +msgid "For storing water and cooking soup" +msgstr "Zur Lagerung von Wasser und zum Suppe kochen" + +#: src/cooking.lua:354 +msgid "Cauldron with Water (cold)" +msgstr "Kessel mit Wasser (kalt)" + +#: src/cooking.lua:368 +msgid "Cauldron with River Water (cold)" +msgstr "Kessel mit Flusssasser (kalt)" + +#: src/cooking.lua:382 +msgid "Cauldron with Soup (cold)" +msgstr "Kessel mit Suppe (kalt)" + +#: src/cooking.lua:403 +msgid "Cauldron with Water (boiling)" +msgstr "Kessel mit Wasser (kochend)" + +#: src/cooking.lua:428 +msgid "Cauldron with River Water (boiling)" +msgstr "Kessel mit Flusswasser (kochend)" + +#: src/cooking.lua:455 +msgid "Cauldron with Soup (boiling)" +msgstr "Kessel mit Suppe (kochend)" + +#. ~ Item that can hold soup +#: src/cooking.lua:491 +msgid "Bowl" +msgstr "Schüssel" + +#: src/cooking.lua:498 +msgid "Bowl of soup" +msgstr "Schüssel mit Suppe" + +#. ~ Enchantment +#: src/enchanting.lua:32 src/enchanting.lua:76 +msgid "Efficiency" +msgstr "Effizienz" + +#. ~ Enchantment +#: src/enchanting.lua:34 src/enchanting.lua:77 +msgid "Durability" +msgstr "Haltbarkeit" + +#. ~ Enchantment +#: src/enchanting.lua:36 src/enchanting.lua:78 +msgid "Sharpness" +msgstr "Schärfe" + +#. ~ Tooltip for enchantment, in format " (+%)", e.g. "Efficiency (+5%)" +#: src/enchanting.lua:41 src/enchanting.lua:43 +msgid "@1 (+@2%)" +msgstr "@1 (+@2%)" + +#. ~ Sharpness enchantment +#: src/enchanting.lua:99 +msgid "Your weapon inflicts more damage" +msgstr "Ihre Waffe richtet mehr Schaden an" + +#. ~ Durability enchantment +#: src/enchanting.lua:101 +msgid "Your tool lasts longer" +msgstr "Ihr Werkzeug hält länger" + +#. ~ Efficiency enchantment +#: src/enchanting.lua:103 +msgid "Your tool digs faster" +msgstr "Ihr Werkzeug arbeitet schneller" + +#: src/enchanting.lua:189 src/enchanting.lua:241 +msgid "Enchantment Table" +msgstr "Zaubertisch" + +#. ~ Enchantment table tooltip +#: src/enchanting.lua:243 +msgid "Enchant your tools with mese crystals" +msgstr "Werkzeuge mit Mesekristallen verzaubern" + +#. ~ Enchanted tool description, e.g. "Enchanted Diamond Sword". @1 is the original tool name, @2 is the enchantment text, e.g. "Durability (+20%)" +#: src/enchanting.lua:388 src/enchanting.lua:516 +msgid "" +"Enchanted @1\n" +"@2" +msgstr "" +"@1 (verzaubert)\n" +"@2" + +#. ~ Enchanted tool description, e.g. "Enchanted Diamond Sword" +#: src/enchanting.lua:390 src/enchanting.lua:517 +msgid "Enchanted @1" +msgstr "@1 (verzaubert)" + +#: src/hive.lua:9 +msgid "The bees are busy making honey." +msgstr "Die Bienen sind beschäftigt, Honig herzustellen." + +#: src/hive.lua:10 +msgid "The bees are looking for flowers." +msgstr "Die Bienen halten nach Blumen Ausschau." + +#: src/hive.lua:11 +msgid "The bees want to pollinate more flowers." +msgstr "Die Bienen wollen mehr Blumen bestäuben." + +#: src/hive.lua:12 +msgid "The bees are idle." +msgstr "Die Bienen sind unbeschäftigt." + +#: src/hive.lua:13 +msgid "The bees are resting." +msgstr "Die Bienen ruhen sich aus." + +#. ~ Beehive +#: src/hive.lua:74 src/hive.lua:124 +msgid "Artificial Hive" +msgstr "Künstlicher Bienenstock" + +#. ~ Tooltip of artificial hive +#: src/hive.lua:126 +msgid "Bees live here and produce honey" +msgstr "Hier leben Bienen, die Honig produzieren" + +#: src/hive.lua:168 +msgid "Honey" +msgstr "Honig" + +#. ~ Tooltip for honey in crafting guide of the Unified Inventory mod +#: src/hive.lua:194 +msgid "Made by bees" +msgstr "Hergestellt von Bienen" + +#: src/itemframe.lua:13 +msgid "Item Frame" +msgstr "Gegenstandsrahmen" + +#. ~ Item frame infotext. @1 = item frame name, @2 = owner name (player) +#: src/itemframe.lua:81 src/itemframe.lua:97 +msgid "@1 (owned by @2)" +msgstr "@1 (Eigentum von @2)" + +#. ~ Item frame tooltip +#: src/itemframe.lua:169 +msgid "For presenting a single item" +msgstr "Präsentiert einen einzelnen Gegenstand" + +#. ~ Used in the mailbox donor list. Will be displayed as item icon followed by this string. @1 = item count +#: src/mailbox.lua:65 +msgid "× @1" +msgstr "× @1" + +#: src/mailbox.lua:73 src/mailbox.lua:185 +msgid "Mailbox" +msgstr "Briefkasten" + +#. ~ Caption of the list of players who gave items in a mailbox +#: src/mailbox.lua:75 +msgid "Last donators" +msgstr "Letzte Spender" + +#. ~ Mailbox menu title. @1 = player name +#: src/mailbox.lua:90 +msgid "" +"Send your goods to\n" +"@1" +msgstr "" +"Senden Sie Ihre Waren an\n" +"@1" + +#. ~ Mailbox infotext. @1 = owner name +#: src/mailbox.lua:117 +msgid "@1's Mailbox" +msgstr "Briefkasten von @1" + +#: src/mailbox.lua:142 +msgid "The mailbox is full." +msgstr "Der Briefkasten ist voll." + +#. ~ Mailbox tooltip +#: src/mailbox.lua:187 +msgid "Lets other players give you things" +msgstr "Hiermit kann man von anderen Spielern Dinge erhalten" + +#. ~ Pressure plate tooltip +#: src/mechanisms.lua:180 +msgid "Opens doors when stepped on" +msgstr "Öffnet Türen beim Betreten" + +#: src/mechanisms.lua:219 +msgid "Wooden Pressure Plate" +msgstr "Holzdruckplatte" + +#: src/mechanisms.lua:225 +msgid "Stone Pressure Plate" +msgstr "Steindruckplatte" + +#: src/mechanisms.lua:229 +msgid "Lever" +msgstr "Schalthebel" + +#. ~ Lever tooltip +#: src/mechanisms.lua:231 +msgid "Opens doors when pulled" +msgstr "Öffnet Türen beim Betätigen" + +#: src/nodes.lua:21 +msgid "Bamboo Frame" +msgstr "Bambusgerüst" + +#: src/nodes.lua:31 +msgid "Chainlink" +msgstr "Maschendraht" + +#: src/nodes.lua:40 +msgid "Rusty Iron Bars" +msgstr "Rostige Eisenstäbe" + +#: src/nodes.lua:52 +msgid "Wood Frame" +msgstr "Holzrahmen" + +#: src/nodes.lua:64 +msgid "Barricade" +msgstr "Barrikade" + +#: src/nodes.lua:77 +msgid "Barrel" +msgstr "Fass" + +#: src/nodes.lua:109 +msgid "Wooden Cabinet" +msgstr "Holzschrank" + +#. ~ Tooltip for block that stores items +#: src/nodes.lua:111 src/nodes.lua:139 src/nodes.lua:161 +msgid "24 inventory slots" +msgstr "24 Inventarplätze" + +#: src/nodes.lua:120 +msgid "Half Wooden Cabinet" +msgstr "Halber Holzschrank" + +#. ~ Tooltip for block that stores items +#: src/nodes.lua:123 +msgid "8 inventory slots" +msgstr "8 Inventarplätze" + +#: src/nodes.lua:138 src/nodes.lua:155 +msgid "Plain Shelf" +msgstr "Schlichtes Regal" + +#: src/nodes.lua:160 +msgid "Multi Shelf" +msgstr "Mehrzweckregal" + +#: src/nodes.lua:170 +msgid "Candle" +msgstr "Kerze" + +#: src/nodes.lua:202 +msgid "Chair" +msgstr "Stuhl" + +#: src/nodes.lua:226 +msgid "Cobweb" +msgstr "Spinnenwebe" + +#: src/nodes.lua:239 +msgid "Red Curtain" +msgstr "Roter Vorhang" + +#: src/nodes.lua:323 +msgid "Cushion" +msgstr "Sitzkissen" + +#: src/nodes.lua:338 +msgid "Cushion Block" +msgstr "Sitzkissenblock" + +#: src/nodes.lua:351 +msgid "Japanese Door" +msgstr "Japanische Tür" + +#: src/nodes.lua:359 +msgid "Prison Door" +msgstr "Kerkertür" + +#: src/nodes.lua:373 +msgid "Rusty Prison Door" +msgstr "Rostige Kerkertür" + +#: src/nodes.lua:387 +msgid "Screen Door" +msgstr "Fliegengittertür" + +#: src/nodes.lua:395 +msgid "Paper Door" +msgstr "Papiertür" + +#: src/nodes.lua:403 +msgid "Woodglass Door" +msgstr "Tür mit Lichtausschnitt" + +#: src/nodes.lua:448 src/nodes.lua:469 +msgid "Ender Chest" +msgstr "Endertruhe" + +#. ~ Ender chest tooltip +#: src/nodes.lua:450 +msgid "Interdimensional inventory" +msgstr "Interdimensionales Inventar" + +#: src/nodes.lua:479 +msgid "Ivy" +msgstr "Efeu" + +#: src/nodes.lua:493 +msgid "Weathercock" +msgstr "Wetterhahn" + +#: src/nodes.lua:506 +msgid "Lantern" +msgstr "Laterne" + +#: src/nodes.lua:581 +msgid "Hanging Lantern" +msgstr "Hängende Laterne" + +#: src/nodes.lua:625 +msgid "Steel Lattice Light Box" +msgstr "Stahlgitterlichtbox" + +#: src/nodes.lua:626 +msgid "Wooden Cross Light Box" +msgstr "Holzkreuzlichtbox" + +#: src/nodes.lua:627 +msgid "Wooden Rhombus Light Box" +msgstr "Holzrautenlichtbox" + +#: src/nodes.lua:644 +msgid "Potted White Dandelion" +msgstr "Weißer Löwenzahn im Topf" + +#: src/nodes.lua:645 +msgid "Potted Yellow Dandelion" +msgstr "Gelber Löwenzahn im Topf" + +#: src/nodes.lua:646 +msgid "Potted Blue Geranium" +msgstr "Blaue Geranie im Topf" + +#: src/nodes.lua:647 +msgid "Potted Red Rose" +msgstr "Rote Rose im Topf" + +#: src/nodes.lua:648 +msgid "Potted Orange Tulip" +msgstr "Orange Tulpe im Topf" + +#: src/nodes.lua:649 +msgid "Potted Viola" +msgstr "Veilchen im Topf" + +#: src/nodes.lua:651 +msgid "Potted Black Tulip" +msgstr "Schwarze Tulpe im Topf" + +#: src/nodes.lua:652 +msgid "Potted Green Chrysanthemum" +msgstr "Grüne Chrysantheme im Topf" + +#: src/nodes.lua:691 +msgid "Painting" +msgstr "Gemälde" + +#: src/nodes.lua:766 +msgid "Garden Stone Path" +msgstr "Steingartenweg" + +#: src/nodes.lua:796 +msgid "Cactus Brick" +msgstr "Kaktusziegel" + +#: src/nodes.lua:797 +msgid "Coal Stone Tile" +msgstr "Kohlesteinkachel" + +#: src/nodes.lua:798 +msgid "Polished Desert Stone Block" +msgstr "Hochglanzwüstensteinblock" + +#: src/nodes.lua:799 +msgid "Hardened Clay" +msgstr "Gehärteter Ton" + +#: src/nodes.lua:800 +msgid "Moon Brick" +msgstr "Mondziegel" + +#: src/nodes.lua:801 +msgid "Runestone" +msgstr "Runenstein" + +#: src/nodes.lua:805 +msgid "Polished Stone Block" +msgstr "Hochglanzsteinblock" + +#: src/nodes.lua:810 +msgid "Packed Ice" +msgstr "Packeis" + +#: src/nodes.lua:817 +msgid "Wooden Tile" +msgstr "Holzkachel" + +#. ~ Furniture +#: src/nodes.lua:826 +msgid "Table" +msgstr "Tisch" + +#: src/nodes.lua:837 +msgid "Tatami" +msgstr "Tatamimatte" + +#: src/nodes.lua:847 +msgid "Trampoline" +msgstr "Trampolin" + +#: src/nodes.lua:878 +msgid "Television" +msgstr "Fernseher" + +#: src/nodes.lua:897 +msgid "Wood Framed Glass" +msgstr "Holzrahmenglas" + +#: src/nodes.lua:957 +msgid "Radio" +msgstr "Radio" + +#. ~ as in "loudspeaker" +#: src/nodes.lua:959 +msgid "Speaker" +msgstr "Lautsprecher" + +#: src/rope.lua:123 +msgid "Rope" +msgstr "Seil" + +#. ~ Part of a block name for a tiny slab with 1/16 height and 1/4 area. E.g. "Stone Nanoslab" +#: src/workbench.lua:31 +msgid "Nanoslab" +msgstr "Nanoplatte" + +#. ~ Block name for a tiny slab with 1/16 height and 1/4 area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:33 +msgid "@1 Nanoslab" +msgstr "@1nanoplatte" + +#. ~ Part of a block name for a tiny slab with 1/16 height and 1/2 area. E.g. "Stone Micropanel" +#: src/workbench.lua:36 +msgid "Micropanel" +msgstr "Mikropaneel" + +#. ~ Block name for a tiny slab with 1/16 height and 1/2 area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:38 +msgid "@1 Micropanel" +msgstr "@1mikropaneel" + +#. ~ Part of a block name for a tiny slab with 1/16 height and full area. E.g. "Stone Microslab" +#: src/workbench.lua:41 +msgid "Microslab" +msgstr "Mikroplatte" + +#. ~ Block name for a tiny slab with 1/16 height and full area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:43 +msgid "@1 Microslab" +msgstr "@1mikroplatte" + +#. ~ Part of a block name of a thin stair, a stair-like block where the "steps" are thinner. E.g. "Stone Thin Stair" +#: src/workbench.lua:46 +msgid "Thin Stair" +msgstr "Flachtreppe" + +#. ~ Block name of a thin stair, a stair-like block where the "steps" are thinner. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:48 +msgid "@1 Thin Stair" +msgstr "@1flachtreppe" + +#. ~ Part of a block name of a tiny cube-shaped block with 1/2 the side length of a full block. E.g. "Stone Cube" +#: src/workbench.lua:51 +msgid "Cube" +msgstr "Würfel" + +#. ~ Block name of a tiny cube-shaped block with 1/2 the side length of a full block. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:53 +msgid "@1 Cube" +msgstr "@1würfel" + +#. ~ Part of a block name of a block with 1/2 the height and 1/2 the length of a full block. It's like a slab that was cut in half. E.g. "Stone Panel" +#: src/workbench.lua:56 +msgid "Panel" +msgstr "Paneel" + +#. ~ Block name of a block with 1/2 the height and 1/2 the length of a full block. It's like a slab that was cut in half. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:58 +msgid "@1 Panel" +msgstr "@1paneel" + +#. ~ Part of block name of a block with 1/2 the height of a full block. E.g. "Stone Slab" +#: src/workbench.lua:61 +msgid "Slab" +msgstr "Platte" + +#. ~ Block name of a stair-like block variant with a lower piece cut away. E.g. "Stone Double Panel" +#: src/workbench.lua:66 +msgid "Double Panel" +msgstr "Doppelpaneel" + +#. ~ Block name of a stair-like block variant with a lower piece cut away. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:68 +msgid "@1 Double Panel" +msgstr "@1doppelpaneel" + +#. ~ Part of a block name for a stair where 1/2 has been cut away sideways. Can be obtained by work bench. E.g. "Stone Half-Stair" +#: src/workbench.lua:72 +msgid "Half-Stair" +msgstr "Halbtreppe" + +#. ~ Block name of a stair where 1/2 has been cut away sideways. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:74 +msgid "@1 Half-Stair" +msgstr "@1halbtreppe" + +#. ~ Block name of a 'traditional' stair-shaped block. E.g. "Stone Stair" +#: src/workbench.lua:78 +msgid "Stair" +msgstr "Treppe" + +#. ~ Label shown in work bench menu where you can cut a block to create smaller versions of it +#: src/workbench.lua:167 +msgid "Cut" +msgstr "Zuschnitt" + +#. ~ Label shown in work bench menu where you can repair an item +#: src/workbench.lua:169 +msgid "Repair" +msgstr "Reparatur" + +#. ~ Button in work bench menu for the crafting grid +#: src/workbench.lua:173 +msgid "Crafting" +msgstr "Fertigung" + +#. ~ Button in work bench menu for its inventory +#: src/workbench.lua:175 +msgid "Storage" +msgstr "Lager" + +#. ~ Button to return to main page in work bench menu +#: src/workbench.lua:196 src/workbench.lua:204 +msgid "Back" +msgstr "Zurück" + +#: src/workbench.lua:236 src/workbench.lua:375 +msgid "Work Bench" +msgstr "Werkbank" + +#. ~ Work bench tooltip +#: src/workbench.lua:377 +msgid "" +"For cutting blocks, repairing tools with a hammer, crafting and storing items" +msgstr "" +"Für Blockzuschnitt, Werkzeugreparatur mit Hammer, Fertigung und Lagerung" + +#. ~ Hammer tooltip +#: src/workbench.lua:668 +msgid "Repairs tools at the work bench" +msgstr "Repariert Werkzeuge an der Werkbank" + +#: src/workbench.lua:756 +msgid "Hammer" +msgstr "Hammer" + +#~ msgid "Weak Computer 1" +#~ msgstr "Schwacher Computer 1" + +#~ msgid "Weak Computer 2" +#~ msgstr "Schwacher Computer 2" + +#~ msgid "A libre decoration mod meant to be simple and well-featured." +#~ msgstr "Eine freie simple Dekorationsmod mit netten Features." diff --git a/mods/xdecor/locale/xdecor.es.po b/mods/xdecor/locale/xdecor.es.po new file mode 100644 index 0000000..17996cd --- /dev/null +++ b/mods/xdecor/locale/xdecor.es.po @@ -0,0 +1,1081 @@ +msgid "" +msgstr "" +"Project-Id-Version: Luanti textdomain xdecor\n" +"Report-Msgid-Bugs-To: Wuzzy@disroot.org\n" +"POT-Creation-Date: 2025-10-18 11:01+0200\n" +"PO-Revision-Date: 2025-08-18 06:34+0200\n" +"Last-Translator: josemunozrwx\n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.6\n" + +#. ~ Block name of a 'traditional' stair-shaped block. (@1 = base block name, e.g. "Stone") +#: handlers/registration.lua:75 handlers/registration.lua:91 +#: src/workbench.lua:80 src/workbench.lua:470 +msgid "@1 Stair" +msgstr "" + +#: handlers/registration.lua:78 handlers/registration.lua:94 +#: src/workbench.lua:471 +msgid "Inner @1 Stair" +msgstr "" + +#: handlers/registration.lua:80 handlers/registration.lua:95 +#: src/workbench.lua:472 +msgid "Outer @1 Stair" +msgstr "" + +#. ~ Block name of a block with 1/2 the height of a full block. (@1 = base block name, e.g. "Stone") +#: handlers/registration.lua:84 handlers/registration.lua:92 +#: src/workbench.lua:63 src/workbench.lua:473 +msgid "@1 Slab" +msgstr "" + +#: src/chessbot_random.lua:51 +#, fuzzy +msgid "Random Computer" +msgstr "Computadora débil" + +#: src/chessbot_weak.lua:125 +msgid "Weak Computer" +msgstr "Computadora débil" + +#: src/chess.lua:196 +msgid "Chess" +msgstr "Ajedrez" + +#: src/chess.lua:197 +msgid "Chess Debug" +msgstr "" + +#. ~ Chess: Game mode selection prompt +#: src/chess.lua:1284 src/chess.lua:1285 +msgid "Select a game mode" +msgstr "Escoge un modo de juego" + +#. ~ Chess: Game mode selection prompt +#: src/chess.lua:1287 +msgid "Select a mode:" +msgstr "Escoge un modo:" + +#. ~ Chess game mode (player vs bot) +#: src/chess.lua:1289 +msgid "Singleplayer" +msgstr "Juego en solitario" + +#. ~ Chess game mode (player vs player) +#: src/chess.lua:1291 +msgid "Multiplayer" +msgstr "Multijugador" + +#. ~ Chess game mode +#: src/chess.lua:1294 +msgid "Bot vs Bot" +msgstr "" + +#. ~ Chess: player is in check +#: src/chess.lua:1814 +msgid "check" +msgstr "jaque " + +#. ~ Chess: player has been checkmated +#: src/chess.lua:1816 +msgid "checkmate" +msgstr "jaque mate" + +#. ~ Chess: player has resigned +#: src/chess.lua:1818 +msgid "resigned" +msgstr "" + +#. ~ Chess: player has won +#: src/chess.lua:1820 +msgid "winner" +msgstr "" + +#. ~ Chess: player has lost +#: src/chess.lua:1822 +msgid "loser" +msgstr "" + +#. ~ Chess: player has a draw +#: src/chess.lua:1824 +msgid "draw" +msgstr "empate" + +#. ~ Chess: Shown when black player can promote a pawn. Space for text is limited. +#: src/chess.lua:1869 +msgid "" +"PROMOTION\n" +"FOR BLACK!" +msgstr "" + +#. ~ Chess: Prompt for player who must select to which piece to promote their pawn. Space for text is limited. +#: src/chess.lua:1875 src/chess.lua:1891 +msgid "Promote pawn to:" +msgstr "" + +#. ~ Chess: Shown when white player can promote a pawn. Space for text is limited. +#: src/chess.lua:1886 +msgid "" +"PROMOTION\n" +"FOR WHITE!" +msgstr "" + +#. ~ Chess: Shown when white player wants to use the 50-move rule or threefold-repetition rule to claim a draw. Space for text is limited. +#: src/chess.lua:1904 +msgid "" +"DRAW CLAIM\n" +"BY WHITE!" +msgstr "" + +#. ~ Chess: Shown when black player wants to use the 50-move rule or threefold-repetition rule to claim a draw. Space for text is limited. +#: src/chess.lua:1907 +msgid "" +"DRAW CLAIM\n" +"BY BLACK!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1914 +msgid "" +"The player has invoked the 50-move rule for the next move. The next move " +"might draw the game." +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1920 +msgid "" +"The player has invoked the threefold-repetition rule for the next move. The " +"next move might draw the game." +msgstr "" + +#. ~ Chess button +#: src/chess.lua:1927 +msgid "New game" +msgstr "Nuevo juego" + +#. ~ Resign (give up) in Chess +#: src/chess.lua:1934 +msgid "Resign" +msgstr "Rendirse" + +#. ~ Chess: Prompt to select a player color +#: src/chess.lua:1940 +msgid "Select a color:" +msgstr "Escoge un color" + +#. ~ White Chess player +#: src/chess.lua:1944 +msgid "White" +msgstr "Blancas" + +#. ~ Black Chess player +#: src/chess.lua:1946 +msgid "Black" +msgstr "Negras" + +#. ~ Chess message +#: src/chess.lua:1958 +msgid "Invoke the 50-move rule for your next move" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1965 +msgid "Invoke the 50-move rule and draw the game" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1978 +msgid "Invoke the threefold repetition rule and draw the game" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1985 +msgid "Invoke the threefold repetition rule for your next move" +msgstr "" + +#. ~ Chess message. @1 = opponent name +#: src/chess.lua:2116 src/chess.lua:2141 +msgid "You have checkmated @1. You win!" +msgstr "" + +#. ~ Chess message. @1 = opponent name +#: src/chess.lua:2118 src/chess.lua:2143 +msgid "You were checkmated by @1. You lose!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2128 src/chess.lua:2153 +msgid "The game ended up in a stalemate! It's a draw!" +msgstr "¡Rey ahogado! ¡Es un empate!" + +#. ~ Chess message +#: src/chess.lua:2166 +msgid "The game ended up in a dead position! It's a draw!" +msgstr "¡El juego llegó a un punto muerto! ¡Es un empate!" + +#. ~ Chess message +#: src/chess.lua:2180 +msgid "" +"No piece was captured and no pawn was moved for 75 consecutive moves of each " +"player. It's a draw!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2203 src/chess.lua:3187 +msgid "You have drawn the game by invoking the 50-move rule." +msgstr "" + +#. ~ Chess message. @1 = player name +#: src/chess.lua:2206 src/chess.lua:3190 +msgid "@1 has drawn the game by invoking the 50-move rule." +msgstr "" + +#. ~ Chess message shown when player has invoked a rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2221 src/chess.lua:2334 +msgid "You have failed to make a game-drawing move. The game continues." +msgstr "" + +#. ~ Chess message shown when player (name = @1) has invoked the 50-move rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2224 +msgid "" +"@1 made a draw claim using the 50-move rule but it was false. The game " +"continues." +msgstr "" + +#. ~ Chess message when a fivefold repetition has happened +#: src/chess.lua:2294 +msgid "The exact same position has occured 5 times. It's a draw!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2317 src/chess.lua:3235 +msgid "You have drawn the game by invoking the threefold repetition rule." +msgstr "" + +#. ~ Chess message. @1 = player name +#: src/chess.lua:2320 src/chess.lua:3238 +msgid "@1 has drawn the game by invoking the threefold repetition rule." +msgstr "" + +#. ~ Chess message shown when player (name = @1) has invoked the threefold repetition rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2337 +msgid "" +"@1 made a draw claim using the threefold repetition rule but it was false. " +"The game continues." +msgstr "" + +#: src/chess.lua:2350 src/chess.lua:3479 +msgid "Chess Board" +msgstr "Tablero de ajedrez" + +#. ~ Chess message when player tries to move with someone else's pieces +#: src/chess.lua:2444 +msgid "Someone else plays white pieces!" +msgstr "¡Alguien más juega las blancas!" + +#. ~ Chess message +#: src/chess.lua:2455 src/chess.lua:2475 +msgid "It's not your turn!" +msgstr "¡No es tu turno!" + +#. ~ Chess message when player tries to move with someone else's pieces +#: src/chess.lua:2465 +msgid "Someone else plays black pieces!" +msgstr "¡Alguien más juega las negras!" + +#. ~ Chess message +#: src/chess.lua:2482 +msgid "Black cannot move first!" +msgstr "¡Las negras no pueden mover primero!" + +#. ~ number of seconds +#: src/chess.lua:3019 +msgid "@1 s" +msgstr "" + +#. ~ number of minutes and seconds +#: src/chess.lua:3023 +msgid "@1 min @2 s" +msgstr "" + +#: src/chess.lua:3096 +msgid "" +"You can't reset the chessboard, a game has been started. Try again in @1." +msgstr "" +"No puedes restablecer el tablero, ya empezó una partida. Intenta de nuevo en " +"@1." + +#. ~ Chess message when player tried to resign too early +#: src/chess.lua:3108 +msgid "Resigning is not possible yet." +msgstr "Aún no es posible rendirse." + +#. ~ Chess message when player resigned (gave up) +#: src/chess.lua:3139 +msgid "You have resigned." +msgstr "Te has rendido." + +#. ~ Chess message when player resigned (gave up). @1 = opponent name +#: src/chess.lua:3142 +msgid "@1 has resigned. You win!" +msgstr "@1 se rindió. ¡Tú ganas!" + +#. ~ Chess message +#: src/chess.lua:3148 +msgid "You can't resign, you're not playing in this game." +msgstr "No te puedes rendir, no estás jugando en esta partida." + +#. ~ Chess message +#: src/chess.lua:3176 src/chess.lua:3223 +msgid "You can't claim a draw, it's not your turn!" +msgstr "¡No puedes declarar un empate, no es tu turno!" + +#: src/chess.lua:3260 +msgid "You're only a spectator in this game of Chess." +msgstr "Solo eres un espectador en esta partida de ajedrez." + +#. ~ Chess message when player tried to promote a pawn when it's not legal +#: src/chess.lua:3267 +msgid "This isn't the time for promotion." +msgstr "" + +#. ~ Chess message when player tried to promote a pawn when it's not their turn +#: src/chess.lua:3271 src/chess.lua:3278 +msgid "It's not your turn! This promotion is meant for the other player." +msgstr "" + +#. ~ Shown when player tried to dig a chessboard but is not allowed to. @1 = time +#: src/chess.lua:3326 +msgid "" +"You can't dig the chessboard, a game has been started. Reset it first or dig " +"it again in @1." +msgstr "" + +#. ~ Shown when player tried to dig a chessboard but is not allowed to. @1 = time +#: src/chess.lua:3332 +msgid "" +"You can't dig the chessboard, a game has been started. Try it again in @1." +msgstr "" + +#. ~ Chess board tooltip +#: src/chess.lua:3497 +msgid "Play a game of Chess against another player or the computer" +msgstr "" +"Juega una partida de ajedrez contra otra persona o contra la computadora " + +#. ~ chess piece +#: src/chess.lua:3606 +msgid "White Pawn" +msgstr "Peón blanco" + +#. ~ chess piece +#: src/chess.lua:3608 +msgid "Black Pawn" +msgstr "Peón negro" + +#. ~ chess piece +#: src/chess.lua:3611 +msgid "White Rook" +msgstr "Torre blanca" + +#. ~ chess piece +#: src/chess.lua:3613 +msgid "Black Rook" +msgstr "Torre negra" + +#. ~ chess piece +#: src/chess.lua:3616 +msgid "White Knight" +msgstr "Caballo blanco" + +#. ~ chess piece +#: src/chess.lua:3618 +msgid "Black Knight" +msgstr "Caballo negro" + +#. ~ chess piece +#: src/chess.lua:3621 +msgid "White Bishop" +msgstr "Alfil blanco" + +#. ~ chess piece +#: src/chess.lua:3623 +msgid "Black Bishop" +msgstr "Alfil negro" + +#. ~ chess piece +#: src/chess.lua:3626 +msgid "White Queen" +msgstr "Reina blanca" + +#. ~ chess piece +#: src/chess.lua:3628 +msgid "Black Queen" +msgstr "Reina negra" + +#. ~ chess piece +#: src/chess.lua:3631 +msgid "White King" +msgstr "Rey blanco" + +#. ~ chess piece +#: src/chess.lua:3633 +msgid "Black King" +msgstr "Rey negro" + +#: src/chess.lua:3899 +#, fuzzy +msgid "Computer" +msgstr "Computadora débil" + +#. ~ cauldron hint +#: src/cooking.lua:8 +msgid "Light a fire below to heat it up" +msgstr "Enciende un fuego para calentarlo" + +#. ~ cauldron hint +#: src/cooking.lua:10 +msgid "Use a bowl to eat the soup" +msgstr "Usa un cuenco para comer la sopa" + +#. ~ cauldron hint +#: src/cooking.lua:12 +msgid "Drop foods inside to make a soup" +msgstr "Deja caer alimentos dentro para hacer sopa" + +#: src/cooking.lua:15 +msgid "Cauldron (empty)" +msgstr "Caldero (vacío)" + +#: src/cooking.lua:16 +msgid "Cauldron (cold water)" +msgstr "Caldero (agua fría)" + +#: src/cooking.lua:17 +msgid "Cauldron (cold river water)" +msgstr "Caldero (agua de río fría)" + +#: src/cooking.lua:18 +msgid "Cauldron (cold soup)" +msgstr "Caldero (sopa fría)" + +#: src/cooking.lua:19 +msgid "Cauldron (boiling water)" +msgstr "Caldero (agua hirviendo)" + +#: src/cooking.lua:20 +msgid "Cauldron (boiling river water)" +msgstr "Caldero (agua de río hirviendo)" + +#: src/cooking.lua:21 +msgid "Cauldron (boiling soup)" +msgstr "Caldero (sopa hirviendo)" + +#: src/cooking.lua:335 +msgid "Cauldron" +msgstr "Caldero" + +#. ~ Cauldron tooltip +#: src/cooking.lua:337 +msgid "For storing water and cooking soup" +msgstr "Para almacenar agua y hacer sopa" + +#: src/cooking.lua:354 +msgid "Cauldron with Water (cold)" +msgstr "Caldero con agua (fría)" + +#: src/cooking.lua:368 +msgid "Cauldron with River Water (cold)" +msgstr "Caldero con agua de río (fría)" + +#: src/cooking.lua:382 +msgid "Cauldron with Soup (cold)" +msgstr "Caldero con sopa (fría)" + +#: src/cooking.lua:403 +msgid "Cauldron with Water (boiling)" +msgstr "Caldero con agua (hirviendo)" + +#: src/cooking.lua:428 +msgid "Cauldron with River Water (boiling)" +msgstr "Caldero con agua de río (hirviendo)" + +#: src/cooking.lua:455 +msgid "Cauldron with Soup (boiling)" +msgstr "Caldero con sopa (hirviendo)" + +#. ~ Item that can hold soup +#: src/cooking.lua:491 +msgid "Bowl" +msgstr "Cuenco" + +#: src/cooking.lua:498 +msgid "Bowl of soup" +msgstr "Cuenco de sopa" + +#. ~ Enchantment +#: src/enchanting.lua:32 src/enchanting.lua:76 +msgid "Efficiency" +msgstr "Eficiencia" + +#. ~ Enchantment +#: src/enchanting.lua:34 src/enchanting.lua:77 +msgid "Durability" +msgstr "Durabilidad" + +#. ~ Enchantment +#: src/enchanting.lua:36 src/enchanting.lua:78 +msgid "Sharpness" +msgstr "Filo" + +#. ~ Tooltip for enchantment, in format " (+%)", e.g. "Efficiency (+5%)" +#: src/enchanting.lua:41 src/enchanting.lua:43 +msgid "@1 (+@2%)" +msgstr "" + +#. ~ Sharpness enchantment +#: src/enchanting.lua:99 +msgid "Your weapon inflicts more damage" +msgstr "Tu arma inflige más daño" + +#. ~ Durability enchantment +#: src/enchanting.lua:101 +msgid "Your tool lasts longer" +msgstr "Tu herramienta dura más" + +#. ~ Efficiency enchantment +#: src/enchanting.lua:103 +msgid "Your tool digs faster" +msgstr "Tu herramienta excava más rápido" + +#: src/enchanting.lua:189 src/enchanting.lua:241 +msgid "Enchantment Table" +msgstr "Mesa de encantamientos" + +#. ~ Enchantment table tooltip +#: src/enchanting.lua:243 +msgid "Enchant your tools with mese crystals" +msgstr "Encanta tus herramientas con cristales mese" + +#. ~ Enchanted tool description, e.g. "Enchanted Diamond Sword". @1 is the original tool name, @2 is the enchantment text, e.g. "Durability (+20%)" +#: src/enchanting.lua:388 src/enchanting.lua:516 +msgid "" +"Enchanted @1\n" +"@2" +msgstr "" + +#. ~ Enchanted tool description, e.g. "Enchanted Diamond Sword" +#: src/enchanting.lua:390 src/enchanting.lua:517 +msgid "Enchanted @1" +msgstr "" + +#: src/hive.lua:9 +msgid "The bees are busy making honey." +msgstr "Las abejas están ocupadas haciendo miel." + +#: src/hive.lua:10 +msgid "The bees are looking for flowers." +msgstr "Las abejas están buscando flores." + +#: src/hive.lua:11 +msgid "The bees want to pollinate more flowers." +msgstr "Las abejas quieren polinizar más flores." + +#: src/hive.lua:12 +msgid "The bees are idle." +msgstr "Las abejas están desocupadas." + +#: src/hive.lua:13 +msgid "The bees are resting." +msgstr "Las abejas están descansando." + +#. ~ Beehive +#: src/hive.lua:74 src/hive.lua:124 +msgid "Artificial Hive" +msgstr "Panal artificial" + +#. ~ Tooltip of artificial hive +#: src/hive.lua:126 +msgid "Bees live here and produce honey" +msgstr "Las abejas viven aquí y hacen miel" + +#: src/hive.lua:168 +msgid "Honey" +msgstr "Miel" + +#. ~ Tooltip for honey in crafting guide of the Unified Inventory mod +#: src/hive.lua:194 +msgid "Made by bees" +msgstr "Hecha por abejas" + +#: src/itemframe.lua:13 +msgid "Item Frame" +msgstr "" + +#. ~ Item frame infotext. @1 = item frame name, @2 = owner name (player) +#: src/itemframe.lua:81 src/itemframe.lua:97 +msgid "@1 (owned by @2)" +msgstr "" + +#. ~ Item frame tooltip +#: src/itemframe.lua:169 +msgid "For presenting a single item" +msgstr "" + +#. ~ Used in the mailbox donor list. Will be displayed as item icon followed by this string. @1 = item count +#: src/mailbox.lua:65 +msgid "× @1" +msgstr "" + +#: src/mailbox.lua:73 src/mailbox.lua:185 +msgid "Mailbox" +msgstr "Buzón" + +#. ~ Caption of the list of players who gave items in a mailbox +#: src/mailbox.lua:75 +msgid "Last donators" +msgstr "" + +#. ~ Mailbox menu title. @1 = player name +#: src/mailbox.lua:90 +msgid "" +"Send your goods to\n" +"@1" +msgstr "" + +#. ~ Mailbox infotext. @1 = owner name +#: src/mailbox.lua:117 +msgid "@1's Mailbox" +msgstr "Buzón de @1" + +#: src/mailbox.lua:142 +msgid "The mailbox is full." +msgstr "El buzón está lleno." + +#. ~ Mailbox tooltip +#: src/mailbox.lua:187 +msgid "Lets other players give you things" +msgstr "Permite que otros jugadores te den cosas" + +#. ~ Pressure plate tooltip +#: src/mechanisms.lua:180 +msgid "Opens doors when stepped on" +msgstr "Abre puertas cuando se pisa" + +#: src/mechanisms.lua:219 +msgid "Wooden Pressure Plate" +msgstr "Placa de presión de madera" + +#: src/mechanisms.lua:225 +msgid "Stone Pressure Plate" +msgstr "Placa de presión de piedra" + +#: src/mechanisms.lua:229 +msgid "Lever" +msgstr "Palanca" + +#. ~ Lever tooltip +#: src/mechanisms.lua:231 +msgid "Opens doors when pulled" +msgstr "Abre puertas cuando se jala" + +#: src/nodes.lua:21 +msgid "Bamboo Frame" +msgstr "Marco de bamboo" + +#: src/nodes.lua:31 +msgid "Chainlink" +msgstr "" + +#: src/nodes.lua:40 +msgid "Rusty Iron Bars" +msgstr "Barras de hierro oxidadas" + +#: src/nodes.lua:52 +msgid "Wood Frame" +msgstr "Marco de madera" + +#: src/nodes.lua:64 +msgid "Barricade" +msgstr "Barricada" + +#: src/nodes.lua:77 +msgid "Barrel" +msgstr "Barril" + +#: src/nodes.lua:109 +msgid "Wooden Cabinet" +msgstr "" + +#. ~ Tooltip for block that stores items +#: src/nodes.lua:111 src/nodes.lua:139 src/nodes.lua:161 +msgid "24 inventory slots" +msgstr "" + +#: src/nodes.lua:120 +msgid "Half Wooden Cabinet" +msgstr "" + +#. ~ Tooltip for block that stores items +#: src/nodes.lua:123 +msgid "8 inventory slots" +msgstr "" + +#: src/nodes.lua:138 src/nodes.lua:155 +msgid "Plain Shelf" +msgstr "" + +#: src/nodes.lua:160 +msgid "Multi Shelf" +msgstr "" + +#: src/nodes.lua:170 +msgid "Candle" +msgstr "Vela" + +#: src/nodes.lua:202 +msgid "Chair" +msgstr "Silla" + +#: src/nodes.lua:226 +msgid "Cobweb" +msgstr "Telaraña" + +#: src/nodes.lua:239 +msgid "Red Curtain" +msgstr "Cortina roja" + +#: src/nodes.lua:323 +msgid "Cushion" +msgstr "Cojín" + +#: src/nodes.lua:338 +msgid "Cushion Block" +msgstr "Bloque de cojín" + +#: src/nodes.lua:351 +msgid "Japanese Door" +msgstr "Puerta japonesa" + +#: src/nodes.lua:359 +msgid "Prison Door" +msgstr "Puerta de prisión" + +#: src/nodes.lua:373 +msgid "Rusty Prison Door" +msgstr "Puerta de prisión oxidada" + +#: src/nodes.lua:387 +msgid "Screen Door" +msgstr "" + +#: src/nodes.lua:395 +msgid "Paper Door" +msgstr "Puerta de papel" + +#: src/nodes.lua:403 +msgid "Woodglass Door" +msgstr "" + +#: src/nodes.lua:448 src/nodes.lua:469 +msgid "Ender Chest" +msgstr "Cofre de ender" + +#. ~ Ender chest tooltip +#: src/nodes.lua:450 +msgid "Interdimensional inventory" +msgstr "Inventario interdimensional" + +#: src/nodes.lua:479 +msgid "Ivy" +msgstr "Hiedra" + +#: src/nodes.lua:493 +msgid "Weathercock" +msgstr "Veleta" + +#: src/nodes.lua:506 +msgid "Lantern" +msgstr "Linterna" + +#: src/nodes.lua:581 +msgid "Hanging Lantern" +msgstr "Linterna colgante" + +#: src/nodes.lua:625 +msgid "Steel Lattice Light Box" +msgstr "" + +#: src/nodes.lua:626 +msgid "Wooden Cross Light Box" +msgstr "" + +#: src/nodes.lua:627 +msgid "Wooden Rhombus Light Box" +msgstr "" + +#: src/nodes.lua:644 +msgid "Potted White Dandelion" +msgstr "Flor de león blanca en maceta" + +#: src/nodes.lua:645 +msgid "Potted Yellow Dandelion" +msgstr "Flor de león en amarilla maceta" + +#: src/nodes.lua:646 +#, fuzzy +msgid "Potted Blue Geranium" +msgstr "Geranio en maceta" + +#: src/nodes.lua:647 +#, fuzzy +msgid "Potted Red Rose" +msgstr "Rosa en maceta" + +#: src/nodes.lua:648 +#, fuzzy +msgid "Potted Orange Tulip" +msgstr "Tulipán en maceta" + +#: src/nodes.lua:649 +msgid "Potted Viola" +msgstr "Violeta en maceta" + +#: src/nodes.lua:651 +#, fuzzy +msgid "Potted Black Tulip" +msgstr "Tulipán en maceta" + +#: src/nodes.lua:652 +#, fuzzy +msgid "Potted Green Chrysanthemum" +msgstr "Geranio en maceta" + +#: src/nodes.lua:691 +msgid "Painting" +msgstr "Pintura" + +#: src/nodes.lua:766 +msgid "Garden Stone Path" +msgstr "Camino de piedras de jardín" + +#: src/nodes.lua:796 +msgid "Cactus Brick" +msgstr "Ladrillo de cactus" + +#: src/nodes.lua:797 +msgid "Coal Stone Tile" +msgstr "Baldosas de piedra de carbón" + +#: src/nodes.lua:798 +msgid "Polished Desert Stone Block" +msgstr "Bloque de piedra del desierto pulido" + +#: src/nodes.lua:799 +msgid "Hardened Clay" +msgstr "Arcilla endurecida" + +#: src/nodes.lua:800 +msgid "Moon Brick" +msgstr "Ladrillo de luna" + +#: src/nodes.lua:801 +msgid "Runestone" +msgstr "Piedra rúnica" + +#: src/nodes.lua:805 +msgid "Polished Stone Block" +msgstr "Bloque de piedra pulido" + +#: src/nodes.lua:810 +msgid "Packed Ice" +msgstr "Hielo compacto" + +#: src/nodes.lua:817 +msgid "Wooden Tile" +msgstr "Baldosas de madera" + +#. ~ Furniture +#: src/nodes.lua:826 +msgid "Table" +msgstr "Mesa" + +#: src/nodes.lua:837 +msgid "Tatami" +msgstr "Tatami" + +#: src/nodes.lua:847 +msgid "Trampoline" +msgstr "Trampolín" + +#: src/nodes.lua:878 +msgid "Television" +msgstr "Televisión" + +#: src/nodes.lua:897 +msgid "Wood Framed Glass" +msgstr "" + +#: src/nodes.lua:957 +msgid "Radio" +msgstr "Radio" + +#. ~ as in "loudspeaker" +#: src/nodes.lua:959 +msgid "Speaker" +msgstr "Bocina" + +#: src/rope.lua:123 +msgid "Rope" +msgstr "Cuerda" + +#. ~ Part of a block name for a tiny slab with 1/16 height and 1/4 area. E.g. "Stone Nanoslab" +#: src/workbench.lua:31 +msgid "Nanoslab" +msgstr "" + +#. ~ Block name for a tiny slab with 1/16 height and 1/4 area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:33 +msgid "@1 Nanoslab" +msgstr "" + +#. ~ Part of a block name for a tiny slab with 1/16 height and 1/2 area. E.g. "Stone Micropanel" +#: src/workbench.lua:36 +msgid "Micropanel" +msgstr "" + +#. ~ Block name for a tiny slab with 1/16 height and 1/2 area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:38 +msgid "@1 Micropanel" +msgstr "" + +#. ~ Part of a block name for a tiny slab with 1/16 height and full area. E.g. "Stone Microslab" +#: src/workbench.lua:41 +msgid "Microslab" +msgstr "" + +#. ~ Block name for a tiny slab with 1/16 height and full area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:43 +msgid "@1 Microslab" +msgstr "" + +#. ~ Part of a block name of a thin stair, a stair-like block where the "steps" are thinner. E.g. "Stone Thin Stair" +#: src/workbench.lua:46 +msgid "Thin Stair" +msgstr "" + +#. ~ Block name of a thin stair, a stair-like block where the "steps" are thinner. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:48 +msgid "@1 Thin Stair" +msgstr "" + +#. ~ Part of a block name of a tiny cube-shaped block with 1/2 the side length of a full block. E.g. "Stone Cube" +#: src/workbench.lua:51 +msgid "Cube" +msgstr "" + +#. ~ Block name of a tiny cube-shaped block with 1/2 the side length of a full block. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:53 +msgid "@1 Cube" +msgstr "" + +#. ~ Part of a block name of a block with 1/2 the height and 1/2 the length of a full block. It's like a slab that was cut in half. E.g. "Stone Panel" +#: src/workbench.lua:56 +msgid "Panel" +msgstr "" + +#. ~ Block name of a block with 1/2 the height and 1/2 the length of a full block. It's like a slab that was cut in half. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:58 +msgid "@1 Panel" +msgstr "" + +#. ~ Part of block name of a block with 1/2 the height of a full block. E.g. "Stone Slab" +#: src/workbench.lua:61 +msgid "Slab" +msgstr "" + +#. ~ Block name of a stair-like block variant with a lower piece cut away. E.g. "Stone Double Panel" +#: src/workbench.lua:66 +msgid "Double Panel" +msgstr "" + +#. ~ Block name of a stair-like block variant with a lower piece cut away. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:68 +msgid "@1 Double Panel" +msgstr "" + +#. ~ Part of a block name for a stair where 1/2 has been cut away sideways. Can be obtained by work bench. E.g. "Stone Half-Stair" +#: src/workbench.lua:72 +msgid "Half-Stair" +msgstr "" + +#. ~ Block name of a stair where 1/2 has been cut away sideways. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:74 +msgid "@1 Half-Stair" +msgstr "" + +#. ~ Block name of a 'traditional' stair-shaped block. E.g. "Stone Stair" +#: src/workbench.lua:78 +msgid "Stair" +msgstr "" + +#. ~ Label shown in work bench menu where you can cut a block to create smaller versions of it +#: src/workbench.lua:167 +msgid "Cut" +msgstr "Cortar" + +#. ~ Label shown in work bench menu where you can repair an item +#: src/workbench.lua:169 +msgid "Repair" +msgstr "Reparar" + +#. ~ Button in work bench menu for the crafting grid +#: src/workbench.lua:173 +msgid "Crafting" +msgstr "Fabricar" + +#. ~ Button in work bench menu for its inventory +#: src/workbench.lua:175 +msgid "Storage" +msgstr "" + +#. ~ Button to return to main page in work bench menu +#: src/workbench.lua:196 src/workbench.lua:204 +msgid "Back" +msgstr "Atrás" + +#: src/workbench.lua:236 src/workbench.lua:375 +msgid "Work Bench" +msgstr "Mesa de trabajo" + +#. ~ Work bench tooltip +#: src/workbench.lua:377 +msgid "" +"For cutting blocks, repairing tools with a hammer, crafting and storing items" +msgstr "" +"Para cortar bloques, reparar herramientas con un martillo, fabricar y " +"almacenar objetos" + +#. ~ Hammer tooltip +#: src/workbench.lua:668 +msgid "Repairs tools at the work bench" +msgstr "Repara herramientas en la mesa de trabajo" + +#: src/workbench.lua:756 +msgid "Hammer" +msgstr "Martillo" + +#~ msgid "Weak Computer 1" +#~ msgstr "Computadora débil 1" + +#~ msgid "Weak Computer 2" +#~ msgstr "Computadora débil 2" + +#~ msgid "A libre decoration mod meant to be simple and well-featured." +#~ msgstr "Un mod de decoración libre diseñado para ser simple pero completo." diff --git a/mods/xdecor/locale/xdecor.fr.po b/mods/xdecor/locale/xdecor.fr.po new file mode 100644 index 0000000..63a3165 --- /dev/null +++ b/mods/xdecor/locale/xdecor.fr.po @@ -0,0 +1,1067 @@ +msgid "" +msgstr "" +"Project-Id-Version: Luanti textdomain xdecor\n" +"Report-Msgid-Bugs-To: Wuzzy@disroot.org\n" +"POT-Creation-Date: 2025-10-18 11:01+0200\n" +"PO-Revision-Date: 2025-08-18 06:34+0200\n" +"Last-Translator: Louis Royer\n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Poedit 3.6\n" + +#. ~ Block name of a 'traditional' stair-shaped block. (@1 = base block name, e.g. "Stone") +#: handlers/registration.lua:75 handlers/registration.lua:91 +#: src/workbench.lua:80 src/workbench.lua:470 +msgid "@1 Stair" +msgstr "" + +#: handlers/registration.lua:78 handlers/registration.lua:94 +#: src/workbench.lua:471 +msgid "Inner @1 Stair" +msgstr "" + +#: handlers/registration.lua:80 handlers/registration.lua:95 +#: src/workbench.lua:472 +msgid "Outer @1 Stair" +msgstr "" + +#. ~ Block name of a block with 1/2 the height of a full block. (@1 = base block name, e.g. "Stone") +#: handlers/registration.lua:84 handlers/registration.lua:92 +#: src/workbench.lua:63 src/workbench.lua:473 +msgid "@1 Slab" +msgstr "" + +#: src/chessbot_random.lua:51 +msgid "Random Computer" +msgstr "" + +#: src/chessbot_weak.lua:125 +msgid "Weak Computer" +msgstr "" + +#: src/chess.lua:196 +msgid "Chess" +msgstr "Echecs" + +#: src/chess.lua:197 +msgid "Chess Debug" +msgstr "" + +#. ~ Chess: Game mode selection prompt +#: src/chess.lua:1284 src/chess.lua:1285 +msgid "Select a game mode" +msgstr "" + +#. ~ Chess: Game mode selection prompt +#: src/chess.lua:1287 +msgid "Select a mode:" +msgstr "Sélectionnez un mode de jeu:" + +#. ~ Chess game mode (player vs bot) +#: src/chess.lua:1289 +msgid "Singleplayer" +msgstr "Solo" + +#. ~ Chess game mode (player vs player) +#: src/chess.lua:1291 +msgid "Multiplayer" +msgstr "Multijoueur" + +#. ~ Chess game mode +#: src/chess.lua:1294 +msgid "Bot vs Bot" +msgstr "" + +#. ~ Chess: player is in check +#: src/chess.lua:1814 +msgid "check" +msgstr "échec" + +#. ~ Chess: player has been checkmated +#: src/chess.lua:1816 +msgid "checkmate" +msgstr "" + +#. ~ Chess: player has resigned +#: src/chess.lua:1818 +msgid "resigned" +msgstr "" + +#. ~ Chess: player has won +#: src/chess.lua:1820 +msgid "winner" +msgstr "" + +#. ~ Chess: player has lost +#: src/chess.lua:1822 +msgid "loser" +msgstr "" + +#. ~ Chess: player has a draw +#: src/chess.lua:1824 +msgid "draw" +msgstr "" + +#. ~ Chess: Shown when black player can promote a pawn. Space for text is limited. +#: src/chess.lua:1869 +msgid "" +"PROMOTION\n" +"FOR BLACK!" +msgstr "" + +#. ~ Chess: Prompt for player who must select to which piece to promote their pawn. Space for text is limited. +#: src/chess.lua:1875 src/chess.lua:1891 +msgid "Promote pawn to:" +msgstr "" + +#. ~ Chess: Shown when white player can promote a pawn. Space for text is limited. +#: src/chess.lua:1886 +msgid "" +"PROMOTION\n" +"FOR WHITE!" +msgstr "" + +#. ~ Chess: Shown when white player wants to use the 50-move rule or threefold-repetition rule to claim a draw. Space for text is limited. +#: src/chess.lua:1904 +msgid "" +"DRAW CLAIM\n" +"BY WHITE!" +msgstr "" + +#. ~ Chess: Shown when black player wants to use the 50-move rule or threefold-repetition rule to claim a draw. Space for text is limited. +#: src/chess.lua:1907 +msgid "" +"DRAW CLAIM\n" +"BY BLACK!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1914 +msgid "" +"The player has invoked the 50-move rule for the next move. The next move " +"might draw the game." +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1920 +msgid "" +"The player has invoked the threefold-repetition rule for the next move. The " +"next move might draw the game." +msgstr "" + +#. ~ Chess button +#: src/chess.lua:1927 +msgid "New game" +msgstr "Nouvelle partie" + +#. ~ Resign (give up) in Chess +#: src/chess.lua:1934 +msgid "Resign" +msgstr "" + +#. ~ Chess: Prompt to select a player color +#: src/chess.lua:1940 +msgid "Select a color:" +msgstr "" + +#. ~ White Chess player +#: src/chess.lua:1944 +msgid "White" +msgstr "" + +#. ~ Black Chess player +#: src/chess.lua:1946 +msgid "Black" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1958 +msgid "Invoke the 50-move rule for your next move" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1965 +msgid "Invoke the 50-move rule and draw the game" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1978 +msgid "Invoke the threefold repetition rule and draw the game" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1985 +msgid "Invoke the threefold repetition rule for your next move" +msgstr "" + +#. ~ Chess message. @1 = opponent name +#: src/chess.lua:2116 src/chess.lua:2141 +msgid "You have checkmated @1. You win!" +msgstr "" + +#. ~ Chess message. @1 = opponent name +#: src/chess.lua:2118 src/chess.lua:2143 +msgid "You were checkmated by @1. You lose!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2128 src/chess.lua:2153 +msgid "The game ended up in a stalemate! It's a draw!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2166 +msgid "The game ended up in a dead position! It's a draw!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2180 +msgid "" +"No piece was captured and no pawn was moved for 75 consecutive moves of each " +"player. It's a draw!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2203 src/chess.lua:3187 +msgid "You have drawn the game by invoking the 50-move rule." +msgstr "" + +#. ~ Chess message. @1 = player name +#: src/chess.lua:2206 src/chess.lua:3190 +msgid "@1 has drawn the game by invoking the 50-move rule." +msgstr "" + +#. ~ Chess message shown when player has invoked a rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2221 src/chess.lua:2334 +msgid "You have failed to make a game-drawing move. The game continues." +msgstr "" + +#. ~ Chess message shown when player (name = @1) has invoked the 50-move rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2224 +msgid "" +"@1 made a draw claim using the 50-move rule but it was false. The game " +"continues." +msgstr "" + +#. ~ Chess message when a fivefold repetition has happened +#: src/chess.lua:2294 +msgid "The exact same position has occured 5 times. It's a draw!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2317 src/chess.lua:3235 +msgid "You have drawn the game by invoking the threefold repetition rule." +msgstr "" + +#. ~ Chess message. @1 = player name +#: src/chess.lua:2320 src/chess.lua:3238 +msgid "@1 has drawn the game by invoking the threefold repetition rule." +msgstr "" + +#. ~ Chess message shown when player (name = @1) has invoked the threefold repetition rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2337 +msgid "" +"@1 made a draw claim using the threefold repetition rule but it was false. " +"The game continues." +msgstr "" + +#: src/chess.lua:2350 src/chess.lua:3479 +msgid "Chess Board" +msgstr "Echiquier" + +#. ~ Chess message when player tries to move with someone else's pieces +#: src/chess.lua:2444 +msgid "Someone else plays white pieces!" +msgstr "Quelqu’un d’autre joue les pièces blanches !" + +#. ~ Chess message +#: src/chess.lua:2455 src/chess.lua:2475 +msgid "It's not your turn!" +msgstr "" + +#. ~ Chess message when player tries to move with someone else's pieces +#: src/chess.lua:2465 +msgid "Someone else plays black pieces!" +msgstr "Quelqu’un d’autre joue les pièces noires !" + +#. ~ Chess message +#: src/chess.lua:2482 +msgid "Black cannot move first!" +msgstr "" + +#. ~ number of seconds +#: src/chess.lua:3019 +msgid "@1 s" +msgstr "" + +#. ~ number of minutes and seconds +#: src/chess.lua:3023 +msgid "@1 min @2 s" +msgstr "" + +#: src/chess.lua:3096 +msgid "" +"You can't reset the chessboard, a game has been started. Try again in @1." +msgstr "" + +#. ~ Chess message when player tried to resign too early +#: src/chess.lua:3108 +msgid "Resigning is not possible yet." +msgstr "" + +#. ~ Chess message when player resigned (gave up) +#: src/chess.lua:3139 +msgid "You have resigned." +msgstr "" + +#. ~ Chess message when player resigned (gave up). @1 = opponent name +#: src/chess.lua:3142 +msgid "@1 has resigned. You win!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:3148 +msgid "You can't resign, you're not playing in this game." +msgstr "" + +#. ~ Chess message +#: src/chess.lua:3176 src/chess.lua:3223 +msgid "You can't claim a draw, it's not your turn!" +msgstr "" + +#: src/chess.lua:3260 +msgid "You're only a spectator in this game of Chess." +msgstr "" + +#. ~ Chess message when player tried to promote a pawn when it's not legal +#: src/chess.lua:3267 +msgid "This isn't the time for promotion." +msgstr "" + +#. ~ Chess message when player tried to promote a pawn when it's not their turn +#: src/chess.lua:3271 src/chess.lua:3278 +msgid "It's not your turn! This promotion is meant for the other player." +msgstr "" + +#. ~ Shown when player tried to dig a chessboard but is not allowed to. @1 = time +#: src/chess.lua:3326 +msgid "" +"You can't dig the chessboard, a game has been started. Reset it first or dig " +"it again in @1." +msgstr "" + +#. ~ Shown when player tried to dig a chessboard but is not allowed to. @1 = time +#: src/chess.lua:3332 +msgid "" +"You can't dig the chessboard, a game has been started. Try it again in @1." +msgstr "" + +#. ~ Chess board tooltip +#: src/chess.lua:3497 +msgid "Play a game of Chess against another player or the computer" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3606 +msgid "White Pawn" +msgstr "Pion blanc" + +#. ~ chess piece +#: src/chess.lua:3608 +msgid "Black Pawn" +msgstr "Pion noir" + +#. ~ chess piece +#: src/chess.lua:3611 +msgid "White Rook" +msgstr "Tour blanche" + +#. ~ chess piece +#: src/chess.lua:3613 +msgid "Black Rook" +msgstr "Tour noire" + +#. ~ chess piece +#: src/chess.lua:3616 +msgid "White Knight" +msgstr "Cavalier blanc" + +#. ~ chess piece +#: src/chess.lua:3618 +msgid "Black Knight" +msgstr "Cavalier noir" + +#. ~ chess piece +#: src/chess.lua:3621 +msgid "White Bishop" +msgstr "Fou blanc" + +#. ~ chess piece +#: src/chess.lua:3623 +msgid "Black Bishop" +msgstr "Fou noir" + +#. ~ chess piece +#: src/chess.lua:3626 +msgid "White Queen" +msgstr "Reine blanche" + +#. ~ chess piece +#: src/chess.lua:3628 +msgid "Black Queen" +msgstr "Reine noire" + +#. ~ chess piece +#: src/chess.lua:3631 +msgid "White King" +msgstr "Roi blanc" + +#. ~ chess piece +#: src/chess.lua:3633 +msgid "Black King" +msgstr "Roi noir" + +#: src/chess.lua:3899 +msgid "Computer" +msgstr "" + +#. ~ cauldron hint +#: src/cooking.lua:8 +msgid "Light a fire below to heat it up" +msgstr "" + +#. ~ cauldron hint +#: src/cooking.lua:10 +msgid "Use a bowl to eat the soup" +msgstr "Utilisez un bol pour boire la soupe" + +#. ~ cauldron hint +#: src/cooking.lua:12 +msgid "Drop foods inside to make a soup" +msgstr "Placez des ingrédients à l’intérieur pour faire une soupe" + +#: src/cooking.lua:15 +msgid "Cauldron (empty)" +msgstr "Chaudron (vide)" + +#: src/cooking.lua:16 +msgid "Cauldron (cold water)" +msgstr "" + +#: src/cooking.lua:17 +msgid "Cauldron (cold river water)" +msgstr "" + +#: src/cooking.lua:18 +msgid "Cauldron (cold soup)" +msgstr "" + +#: src/cooking.lua:19 +msgid "Cauldron (boiling water)" +msgstr "" + +#: src/cooking.lua:20 +msgid "Cauldron (boiling river water)" +msgstr "" + +#: src/cooking.lua:21 +msgid "Cauldron (boiling soup)" +msgstr "" + +#: src/cooking.lua:335 +msgid "Cauldron" +msgstr "Chaudron" + +#. ~ Cauldron tooltip +#: src/cooking.lua:337 +msgid "For storing water and cooking soup" +msgstr "" + +#: src/cooking.lua:354 +msgid "Cauldron with Water (cold)" +msgstr "" + +#: src/cooking.lua:368 +msgid "Cauldron with River Water (cold)" +msgstr "" + +#: src/cooking.lua:382 +msgid "Cauldron with Soup (cold)" +msgstr "" + +#: src/cooking.lua:403 +msgid "Cauldron with Water (boiling)" +msgstr "" + +#: src/cooking.lua:428 +msgid "Cauldron with River Water (boiling)" +msgstr "" + +#: src/cooking.lua:455 +msgid "Cauldron with Soup (boiling)" +msgstr "" + +#. ~ Item that can hold soup +#: src/cooking.lua:491 +msgid "Bowl" +msgstr "Bol" + +#: src/cooking.lua:498 +msgid "Bowl of soup" +msgstr "Bol de soupe" + +#. ~ Enchantment +#: src/enchanting.lua:32 src/enchanting.lua:76 +msgid "Efficiency" +msgstr "Efficacité" + +#. ~ Enchantment +#: src/enchanting.lua:34 src/enchanting.lua:77 +msgid "Durability" +msgstr "Durabilité" + +#. ~ Enchantment +#: src/enchanting.lua:36 src/enchanting.lua:78 +msgid "Sharpness" +msgstr "Tranchant" + +#. ~ Tooltip for enchantment, in format " (+%)", e.g. "Efficiency (+5%)" +#: src/enchanting.lua:41 src/enchanting.lua:43 +msgid "@1 (+@2%)" +msgstr "" + +#. ~ Sharpness enchantment +#: src/enchanting.lua:99 +msgid "Your weapon inflicts more damage" +msgstr "Votre arme inflige plus de dégâts" + +#. ~ Durability enchantment +#: src/enchanting.lua:101 +msgid "Your tool lasts longer" +msgstr "Votre outil dure plus longtemps" + +#. ~ Efficiency enchantment +#: src/enchanting.lua:103 +msgid "Your tool digs faster" +msgstr "Votre outil creuse plus vite" + +#: src/enchanting.lua:189 src/enchanting.lua:241 +msgid "Enchantment Table" +msgstr "Table d’enchantements" + +#. ~ Enchantment table tooltip +#: src/enchanting.lua:243 +msgid "Enchant your tools with mese crystals" +msgstr "" + +#. ~ Enchanted tool description, e.g. "Enchanted Diamond Sword". @1 is the original tool name, @2 is the enchantment text, e.g. "Durability (+20%)" +#: src/enchanting.lua:388 src/enchanting.lua:516 +msgid "" +"Enchanted @1\n" +"@2" +msgstr "" + +#. ~ Enchanted tool description, e.g. "Enchanted Diamond Sword" +#: src/enchanting.lua:390 src/enchanting.lua:517 +msgid "Enchanted @1" +msgstr "" + +#: src/hive.lua:9 +msgid "The bees are busy making honey." +msgstr "" + +#: src/hive.lua:10 +msgid "The bees are looking for flowers." +msgstr "" + +#: src/hive.lua:11 +msgid "The bees want to pollinate more flowers." +msgstr "" + +#: src/hive.lua:12 +msgid "The bees are idle." +msgstr "" + +#: src/hive.lua:13 +msgid "The bees are resting." +msgstr "" + +#. ~ Beehive +#: src/hive.lua:74 src/hive.lua:124 +msgid "Artificial Hive" +msgstr "Ruche artificielle" + +#. ~ Tooltip of artificial hive +#: src/hive.lua:126 +msgid "Bees live here and produce honey" +msgstr "" + +#: src/hive.lua:168 +msgid "Honey" +msgstr "Miel" + +#. ~ Tooltip for honey in crafting guide of the Unified Inventory mod +#: src/hive.lua:194 +msgid "Made by bees" +msgstr "" + +#: src/itemframe.lua:13 +msgid "Item Frame" +msgstr "Cadre" + +#. ~ Item frame infotext. @1 = item frame name, @2 = owner name (player) +#: src/itemframe.lua:81 src/itemframe.lua:97 +msgid "@1 (owned by @2)" +msgstr "@1 (propriété de @2)" + +#. ~ Item frame tooltip +#: src/itemframe.lua:169 +msgid "For presenting a single item" +msgstr "" + +#. ~ Used in the mailbox donor list. Will be displayed as item icon followed by this string. @1 = item count +#: src/mailbox.lua:65 +msgid "× @1" +msgstr "" + +#: src/mailbox.lua:73 src/mailbox.lua:185 +msgid "Mailbox" +msgstr "Boite aux lettres" + +#. ~ Caption of the list of players who gave items in a mailbox +#: src/mailbox.lua:75 +msgid "Last donators" +msgstr "Derniers donateurs" + +#. ~ Mailbox menu title. @1 = player name +#: src/mailbox.lua:90 +msgid "" +"Send your goods to\n" +"@1" +msgstr "" +"Envoyer vos biens à\n" +"@1" + +#. ~ Mailbox infotext. @1 = owner name +#: src/mailbox.lua:117 +msgid "@1's Mailbox" +msgstr "Boite aux lettres de @1" + +#: src/mailbox.lua:142 +msgid "The mailbox is full." +msgstr "La boite aux lettres est pleine." + +#. ~ Mailbox tooltip +#: src/mailbox.lua:187 +msgid "Lets other players give you things" +msgstr "" + +#. ~ Pressure plate tooltip +#: src/mechanisms.lua:180 +msgid "Opens doors when stepped on" +msgstr "" + +#: src/mechanisms.lua:219 +msgid "Wooden Pressure Plate" +msgstr "Plaque de pression en bois" + +#: src/mechanisms.lua:225 +msgid "Stone Pressure Plate" +msgstr "Plaque de pression en pierre" + +#: src/mechanisms.lua:229 +msgid "Lever" +msgstr "Levier" + +#. ~ Lever tooltip +#: src/mechanisms.lua:231 +msgid "Opens doors when pulled" +msgstr "" + +#: src/nodes.lua:21 +msgid "Bamboo Frame" +msgstr "Cadre en bambou" + +#: src/nodes.lua:31 +msgid "Chainlink" +msgstr "Maillon de chaîne" + +#: src/nodes.lua:40 +msgid "Rusty Iron Bars" +msgstr "Barreaux en fer rouillé" + +#: src/nodes.lua:52 +msgid "Wood Frame" +msgstr "Cadre en bois" + +#: src/nodes.lua:64 +msgid "Barricade" +msgstr "Barricade" + +#: src/nodes.lua:77 +msgid "Barrel" +msgstr "Tonneau" + +#: src/nodes.lua:109 +msgid "Wooden Cabinet" +msgstr "Meuble en bois" + +#. ~ Tooltip for block that stores items +#: src/nodes.lua:111 src/nodes.lua:139 src/nodes.lua:161 +msgid "24 inventory slots" +msgstr "" + +#: src/nodes.lua:120 +msgid "Half Wooden Cabinet" +msgstr "Demi meuble en bois" + +#. ~ Tooltip for block that stores items +#: src/nodes.lua:123 +msgid "8 inventory slots" +msgstr "" + +#: src/nodes.lua:138 src/nodes.lua:155 +msgid "Plain Shelf" +msgstr "" + +#: src/nodes.lua:160 +msgid "Multi Shelf" +msgstr "Étagères multiple" + +#: src/nodes.lua:170 +msgid "Candle" +msgstr "Bougie" + +#: src/nodes.lua:202 +msgid "Chair" +msgstr "Chaise" + +#: src/nodes.lua:226 +msgid "Cobweb" +msgstr "Toile d’araignée" + +#: src/nodes.lua:239 +msgid "Red Curtain" +msgstr "Rideaux rouge" + +#: src/nodes.lua:323 +msgid "Cushion" +msgstr "Coussin" + +#: src/nodes.lua:338 +msgid "Cushion Block" +msgstr "Bloc de coussin" + +#: src/nodes.lua:351 +msgid "Japanese Door" +msgstr "Porte japonaise" + +#: src/nodes.lua:359 +msgid "Prison Door" +msgstr "Porte de prison" + +#: src/nodes.lua:373 +msgid "Rusty Prison Door" +msgstr "Barreaux de prison rouillés" + +#: src/nodes.lua:387 +msgid "Screen Door" +msgstr "Porte avec moustiquaire" + +#: src/nodes.lua:395 +msgid "Paper Door" +msgstr "" + +#: src/nodes.lua:403 +msgid "Woodglass Door" +msgstr "Porte vitrée" + +#: src/nodes.lua:448 src/nodes.lua:469 +msgid "Ender Chest" +msgstr "Coffre de l’End" + +#. ~ Ender chest tooltip +#: src/nodes.lua:450 +msgid "Interdimensional inventory" +msgstr "" + +#: src/nodes.lua:479 +msgid "Ivy" +msgstr "Lierre" + +#: src/nodes.lua:493 +msgid "Weathercock" +msgstr "" + +#: src/nodes.lua:506 +msgid "Lantern" +msgstr "Lanterne" + +#: src/nodes.lua:581 +msgid "Hanging Lantern" +msgstr "" + +#: src/nodes.lua:625 +msgid "Steel Lattice Light Box" +msgstr "" + +#: src/nodes.lua:626 +msgid "Wooden Cross Light Box" +msgstr "" + +#: src/nodes.lua:627 +msgid "Wooden Rhombus Light Box" +msgstr "" + +#: src/nodes.lua:644 +msgid "Potted White Dandelion" +msgstr "Pissenlit blanc en pot" + +#: src/nodes.lua:645 +msgid "Potted Yellow Dandelion" +msgstr "Pissenlit jaune en pot" + +#: src/nodes.lua:646 +#, fuzzy +msgid "Potted Blue Geranium" +msgstr "Géranium en pot" + +#: src/nodes.lua:647 +#, fuzzy +msgid "Potted Red Rose" +msgstr "Rose en pot" + +#: src/nodes.lua:648 +#, fuzzy +msgid "Potted Orange Tulip" +msgstr "Tulipe en pot" + +#: src/nodes.lua:649 +msgid "Potted Viola" +msgstr "Violette en pot" + +#: src/nodes.lua:651 +#, fuzzy +msgid "Potted Black Tulip" +msgstr "Tulipe en pot" + +#: src/nodes.lua:652 +#, fuzzy +msgid "Potted Green Chrysanthemum" +msgstr "Géranium en pot" + +#: src/nodes.lua:691 +msgid "Painting" +msgstr "Tableau" + +#: src/nodes.lua:766 +msgid "Garden Stone Path" +msgstr "Chemin de pierres de jardin" + +#: src/nodes.lua:796 +msgid "Cactus Brick" +msgstr "Brique en cactus" + +#: src/nodes.lua:797 +msgid "Coal Stone Tile" +msgstr "Carreau en charbon et pierre" + +#: src/nodes.lua:798 +msgid "Polished Desert Stone Block" +msgstr "" + +#: src/nodes.lua:799 +msgid "Hardened Clay" +msgstr "Argile durcie" + +#: src/nodes.lua:800 +msgid "Moon Brick" +msgstr "Brique lunaire" + +#: src/nodes.lua:801 +msgid "Runestone" +msgstr "Pierre runique" + +#: src/nodes.lua:805 +msgid "Polished Stone Block" +msgstr "" + +#: src/nodes.lua:810 +msgid "Packed Ice" +msgstr "Glace compactée" + +#: src/nodes.lua:817 +msgid "Wooden Tile" +msgstr "Carreau en bois" + +#. ~ Furniture +#: src/nodes.lua:826 +msgid "Table" +msgstr "Table" + +#: src/nodes.lua:837 +msgid "Tatami" +msgstr "Tatami" + +#: src/nodes.lua:847 +msgid "Trampoline" +msgstr "Trampoline" + +#: src/nodes.lua:878 +msgid "Television" +msgstr "Télévision" + +#: src/nodes.lua:897 +msgid "Wood Framed Glass" +msgstr "Verre encadré par du bois" + +#: src/nodes.lua:957 +msgid "Radio" +msgstr "" + +#. ~ as in "loudspeaker" +#: src/nodes.lua:959 +msgid "Speaker" +msgstr "" + +#: src/rope.lua:123 +msgid "Rope" +msgstr "Corde" + +#. ~ Part of a block name for a tiny slab with 1/16 height and 1/4 area. E.g. "Stone Nanoslab" +#: src/workbench.lua:31 +msgid "Nanoslab" +msgstr "" + +#. ~ Block name for a tiny slab with 1/16 height and 1/4 area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:33 +msgid "@1 Nanoslab" +msgstr "" + +#. ~ Part of a block name for a tiny slab with 1/16 height and 1/2 area. E.g. "Stone Micropanel" +#: src/workbench.lua:36 +msgid "Micropanel" +msgstr "" + +#. ~ Block name for a tiny slab with 1/16 height and 1/2 area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:38 +msgid "@1 Micropanel" +msgstr "" + +#. ~ Part of a block name for a tiny slab with 1/16 height and full area. E.g. "Stone Microslab" +#: src/workbench.lua:41 +msgid "Microslab" +msgstr "" + +#. ~ Block name for a tiny slab with 1/16 height and full area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:43 +msgid "@1 Microslab" +msgstr "" + +#. ~ Part of a block name of a thin stair, a stair-like block where the "steps" are thinner. E.g. "Stone Thin Stair" +#: src/workbench.lua:46 +msgid "Thin Stair" +msgstr "" + +#. ~ Block name of a thin stair, a stair-like block where the "steps" are thinner. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:48 +msgid "@1 Thin Stair" +msgstr "" + +#. ~ Part of a block name of a tiny cube-shaped block with 1/2 the side length of a full block. E.g. "Stone Cube" +#: src/workbench.lua:51 +msgid "Cube" +msgstr "" + +#. ~ Block name of a tiny cube-shaped block with 1/2 the side length of a full block. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:53 +msgid "@1 Cube" +msgstr "" + +#. ~ Part of a block name of a block with 1/2 the height and 1/2 the length of a full block. It's like a slab that was cut in half. E.g. "Stone Panel" +#: src/workbench.lua:56 +msgid "Panel" +msgstr "" + +#. ~ Block name of a block with 1/2 the height and 1/2 the length of a full block. It's like a slab that was cut in half. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:58 +msgid "@1 Panel" +msgstr "" + +#. ~ Part of block name of a block with 1/2 the height of a full block. E.g. "Stone Slab" +#: src/workbench.lua:61 +msgid "Slab" +msgstr "" + +#. ~ Block name of a stair-like block variant with a lower piece cut away. E.g. "Stone Double Panel" +#: src/workbench.lua:66 +msgid "Double Panel" +msgstr "" + +#. ~ Block name of a stair-like block variant with a lower piece cut away. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:68 +msgid "@1 Double Panel" +msgstr "" + +#. ~ Part of a block name for a stair where 1/2 has been cut away sideways. Can be obtained by work bench. E.g. "Stone Half-Stair" +#: src/workbench.lua:72 +msgid "Half-Stair" +msgstr "" + +#. ~ Block name of a stair where 1/2 has been cut away sideways. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:74 +msgid "@1 Half-Stair" +msgstr "" + +#. ~ Block name of a 'traditional' stair-shaped block. E.g. "Stone Stair" +#: src/workbench.lua:78 +msgid "Stair" +msgstr "" + +#. ~ Label shown in work bench menu where you can cut a block to create smaller versions of it +#: src/workbench.lua:167 +msgid "Cut" +msgstr "Couper" + +#. ~ Label shown in work bench menu where you can repair an item +#: src/workbench.lua:169 +msgid "Repair" +msgstr "Réparer" + +#. ~ Button in work bench menu for the crafting grid +#: src/workbench.lua:173 +msgid "Crafting" +msgstr "Fabrication" + +#. ~ Button in work bench menu for its inventory +#: src/workbench.lua:175 +msgid "Storage" +msgstr "Stockage" + +#. ~ Button to return to main page in work bench menu +#: src/workbench.lua:196 src/workbench.lua:204 +msgid "Back" +msgstr "Retour" + +#: src/workbench.lua:236 src/workbench.lua:375 +msgid "Work Bench" +msgstr "Atelier" + +#. ~ Work bench tooltip +#: src/workbench.lua:377 +msgid "" +"For cutting blocks, repairing tools with a hammer, crafting and storing items" +msgstr "" + +#. ~ Hammer tooltip +#: src/workbench.lua:668 +msgid "Repairs tools at the work bench" +msgstr "" + +#: src/workbench.lua:756 +msgid "Hammer" +msgstr "Marteau" diff --git a/mods/xdecor/locale/xdecor.it.po b/mods/xdecor/locale/xdecor.it.po new file mode 100644 index 0000000..1bcc714 --- /dev/null +++ b/mods/xdecor/locale/xdecor.it.po @@ -0,0 +1,1104 @@ +msgid "" +msgstr "" +"Project-Id-Version: Luanti textdomain xdecor\n" +"Report-Msgid-Bugs-To: Wuzzy@disroot.org\n" +"POT-Creation-Date: 2025-10-18 11:01+0200\n" +"PO-Revision-Date: 2025-08-18 06:34+0200\n" +"Last-Translator: Zughy\n" +"Language-Team: \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.6\n" + +#. ~ Block name of a 'traditional' stair-shaped block. (@1 = base block name, e.g. "Stone") +#: handlers/registration.lua:75 handlers/registration.lua:91 +#: src/workbench.lua:80 src/workbench.lua:470 +msgid "@1 Stair" +msgstr "" + +#: handlers/registration.lua:78 handlers/registration.lua:94 +#: src/workbench.lua:471 +msgid "Inner @1 Stair" +msgstr "" + +#: handlers/registration.lua:80 handlers/registration.lua:95 +#: src/workbench.lua:472 +msgid "Outer @1 Stair" +msgstr "" + +#. ~ Block name of a block with 1/2 the height of a full block. (@1 = base block name, e.g. "Stone") +#: handlers/registration.lua:84 handlers/registration.lua:92 +#: src/workbench.lua:63 src/workbench.lua:473 +msgid "@1 Slab" +msgstr "" + +#: src/chessbot_random.lua:51 +#, fuzzy +msgid "Random Computer" +msgstr "Computer facile" + +#: src/chessbot_weak.lua:125 +msgid "Weak Computer" +msgstr "Computer facile" + +#: src/chess.lua:196 +msgid "Chess" +msgstr "Scacchi" + +#: src/chess.lua:197 +msgid "Chess Debug" +msgstr "Debug scacchi" + +#. ~ Chess: Game mode selection prompt +#: src/chess.lua:1284 src/chess.lua:1285 +msgid "Select a game mode" +msgstr "Seleziona modalità di gioco" + +#. ~ Chess: Game mode selection prompt +#: src/chess.lua:1287 +msgid "Select a mode:" +msgstr "Seleziona una modalità:" + +#. ~ Chess game mode (player vs bot) +#: src/chess.lua:1289 +msgid "Singleplayer" +msgstr "Giocante singolə" + +#. ~ Chess game mode (player vs player) +#: src/chess.lua:1291 +msgid "Multiplayer" +msgstr "Multigiocante" + +#. ~ Chess game mode +#: src/chess.lua:1294 +msgid "Bot vs Bot" +msgstr "Bot contro Bot" + +#. ~ Chess: player is in check +#: src/chess.lua:1814 +msgid "check" +msgstr "scacco" + +#. ~ Chess: player has been checkmated +#: src/chess.lua:1816 +msgid "checkmate" +msgstr "scacco matto" + +#. ~ Chess: player has resigned +#: src/chess.lua:1818 +msgid "resigned" +msgstr "arresə" + +#. ~ Chess: player has won +#: src/chess.lua:1820 +msgid "winner" +msgstr "vince" + +#. ~ Chess: player has lost +#: src/chess.lua:1822 +msgid "loser" +msgstr "perde" + +#. ~ Chess: player has a draw +#: src/chess.lua:1824 +msgid "draw" +msgstr "patta" + +#. ~ Chess: Shown when black player can promote a pawn. Space for text is limited. +#: src/chess.lua:1869 +msgid "" +"PROMOTION\n" +"FOR BLACK!" +msgstr "" +"PROMOZIONE\n" +"PER IL NERO!" + +#. ~ Chess: Prompt for player who must select to which piece to promote their pawn. Space for text is limited. +#: src/chess.lua:1875 src/chess.lua:1891 +msgid "Promote pawn to:" +msgstr "Promuovi pedone a:" + +#. ~ Chess: Shown when white player can promote a pawn. Space for text is limited. +#: src/chess.lua:1886 +msgid "" +"PROMOTION\n" +"FOR WHITE!" +msgstr "" +"PROMOZIONE\n" +"PER IL BIANCO!" + +#. ~ Chess: Shown when white player wants to use the 50-move rule or threefold-repetition rule to claim a draw. Space for text is limited. +#: src/chess.lua:1904 +msgid "" +"DRAW CLAIM\n" +"BY WHITE!" +msgstr "" +"PATTA DICHIARATA\n" +"DAL BIANCO!" + +#. ~ Chess: Shown when black player wants to use the 50-move rule or threefold-repetition rule to claim a draw. Space for text is limited. +#: src/chess.lua:1907 +msgid "" +"DRAW CLAIM\n" +"BY BLACK!" +msgstr "" +"PATTA DICHIARATA\n" +"DAL NERO!" + +#. ~ Chess message +#: src/chess.lua:1914 +msgid "" +"The player has invoked the 50-move rule for the next move. The next move " +"might draw the game." +msgstr "" +"Lə giocante ha invocato la regola delle 50 mosse per la prossima mossa. " +"Quest'ultima potrebbe portare a una patta." + +#. ~ Chess message +#: src/chess.lua:1920 +msgid "" +"The player has invoked the threefold-repetition rule for the next move. The " +"next move might draw the game." +msgstr "" +"Lə giocante ha invocato la regola della tripla ripetizione per la prossima " +"mossa. Quest'ultima potrebbe portare a una patta" + +#. ~ Chess button +#: src/chess.lua:1927 +msgid "New game" +msgstr "Nuova partita" + +#. ~ Resign (give up) in Chess +#: src/chess.lua:1934 +msgid "Resign" +msgstr "Arrenditi" + +#. ~ Chess: Prompt to select a player color +#: src/chess.lua:1940 +msgid "Select a color:" +msgstr "Seleziona un colore:" + +#. ~ White Chess player +#: src/chess.lua:1944 +msgid "White" +msgstr "Bianco" + +#. ~ Black Chess player +#: src/chess.lua:1946 +msgid "Black" +msgstr "Nero" + +#. ~ Chess message +#: src/chess.lua:1958 +msgid "Invoke the 50-move rule for your next move" +msgstr "Invoca la regola delle 50 mosse per la tua prossima mossa" + +#. ~ Chess message +#: src/chess.lua:1965 +msgid "Invoke the 50-move rule and draw the game" +msgstr "Invoca la regola delle 50 mosse e chiudi in patta" + +#. ~ Chess message +#: src/chess.lua:1978 +msgid "Invoke the threefold repetition rule and draw the game" +msgstr "Invoca la regola della tripla ripetizione e chiudi in patta" + +#. ~ Chess message +#: src/chess.lua:1985 +msgid "Invoke the threefold repetition rule for your next move" +msgstr "Invoca la regola della tripla ripetizione per la tua prossima mossa" + +#. ~ Chess message. @1 = opponent name +#: src/chess.lua:2116 src/chess.lua:2141 +msgid "You have checkmated @1. You win!" +msgstr "Scacco matto a @1. Hai vinto!" + +#. ~ Chess message. @1 = opponent name +#: src/chess.lua:2118 src/chess.lua:2143 +msgid "You were checkmated by @1. You lose!" +msgstr "Scacco matto da @1. Hai perso!" + +#. ~ Chess message +#: src/chess.lua:2128 src/chess.lua:2153 +msgid "The game ended up in a stalemate! It's a draw!" +msgstr "È uno stallo! Patta!" + +#. ~ Chess message +#: src/chess.lua:2166 +msgid "The game ended up in a dead position! It's a draw!" +msgstr "È una posizione morta! Patta!" + +#. ~ Chess message +#: src/chess.lua:2180 +msgid "" +"No piece was captured and no pawn was moved for 75 consecutive moves of each " +"player. It's a draw!" +msgstr "" +"Nessun giocante ha catturato pezzi né mosso pedoni per 75 mosse consecutive. " +"Patta!" + +#. ~ Chess message +#: src/chess.lua:2203 src/chess.lua:3187 +msgid "You have drawn the game by invoking the 50-move rule." +msgstr "Hai chiuso in patta con l'invocazione della regola delle 50 mosse." + +#. ~ Chess message. @1 = player name +#: src/chess.lua:2206 src/chess.lua:3190 +msgid "@1 has drawn the game by invoking the 50-move rule." +msgstr "@1 ha chiuso in patta con l'invocazione della regola delle 50 mosse." + +#. ~ Chess message shown when player has invoked a rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2221 src/chess.lua:2334 +msgid "You have failed to make a game-drawing move. The game continues." +msgstr "" +"Non sei riuscitə a fare una mossa che portasse a una patta. Il gioco " +"continua." + +#. ~ Chess message shown when player (name = @1) has invoked the 50-move rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2224 +msgid "" +"@1 made a draw claim using the 50-move rule but it was false. The game " +"continues." +msgstr "" +"@1 ha tentato la patta con la regola delle 50 mosse ma ha fallito. La " +"partita continua." + +#. ~ Chess message when a fivefold repetition has happened +#: src/chess.lua:2294 +msgid "The exact same position has occured 5 times. It's a draw!" +msgstr "La stessa identica mossa si è ripetuta per 5 volte. Patta!" + +#. ~ Chess message +#: src/chess.lua:2317 src/chess.lua:3235 +msgid "You have drawn the game by invoking the threefold repetition rule." +msgstr "" +"Hai chiuso in patta con l'invocazione della regola della tripla ripetizione." + +#. ~ Chess message. @1 = player name +#: src/chess.lua:2320 src/chess.lua:3238 +msgid "@1 has drawn the game by invoking the threefold repetition rule." +msgstr "" +"@1 ha chiuso in patta con l'invocazione della regola della tripla " +"ripetizione." + +#. ~ Chess message shown when player (name = @1) has invoked the threefold repetition rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2337 +msgid "" +"@1 made a draw claim using the threefold repetition rule but it was false. " +"The game continues." +msgstr "" +"@1 ha tentato la patta con la regola della tripla ripetizione ma ha fallito. " +"La partita continua." + +#: src/chess.lua:2350 src/chess.lua:3479 +msgid "Chess Board" +msgstr "Scacchiera" + +#. ~ Chess message when player tries to move with someone else's pieces +#: src/chess.lua:2444 +msgid "Someone else plays white pieces!" +msgstr "Qualcun`altrə sta già giocando con il bianco!" + +#. ~ Chess message +#: src/chess.lua:2455 src/chess.lua:2475 +msgid "It's not your turn!" +msgstr "Non è il tuo turno!" + +#. ~ Chess message when player tries to move with someone else's pieces +#: src/chess.lua:2465 +msgid "Someone else plays black pieces!" +msgstr "Qualcun`altrə sta già giocando con il nero!" + +#. ~ Chess message +#: src/chess.lua:2482 +msgid "Black cannot move first!" +msgstr "Il nero non può muovere per primo!" + +#. ~ number of seconds +#: src/chess.lua:3019 +msgid "@1 s" +msgstr "@1 s" + +#. ~ number of minutes and seconds +#: src/chess.lua:3023 +msgid "@1 min @2 s" +msgstr "@1 min @2 s" + +#: src/chess.lua:3096 +msgid "" +"You can't reset the chessboard, a game has been started. Try again in @1." +msgstr "" +"Non puoi ripristinare la scacchiera, c'è una partita in corso. Riprova tra " +"@1." + +#. ~ Chess message when player tried to resign too early +#: src/chess.lua:3108 +msgid "Resigning is not possible yet." +msgstr "Non ci si può ancora arrendere." + +#. ~ Chess message when player resigned (gave up) +#: src/chess.lua:3139 +msgid "You have resigned." +msgstr "Ti sei arresə." + +#. ~ Chess message when player resigned (gave up). @1 = opponent name +#: src/chess.lua:3142 +msgid "@1 has resigned. You win!" +msgstr "@1 si è arresə. Hai vinto!" + +#. ~ Chess message +#: src/chess.lua:3148 +msgid "You can't resign, you're not playing in this game." +msgstr "Non ti puoi arrendere, non stai giocando in questa partita." + +#. ~ Chess message +#: src/chess.lua:3176 src/chess.lua:3223 +msgid "You can't claim a draw, it's not your turn!" +msgstr "Non puoi chiamare patta, non è il tuo turno!" + +#: src/chess.lua:3260 +msgid "You're only a spectator in this game of Chess." +msgstr "Sei solo un`osservante in questa partita di scacchi." + +#. ~ Chess message when player tried to promote a pawn when it's not legal +#: src/chess.lua:3267 +msgid "This isn't the time for promotion." +msgstr "Non è il momento per una promozione." + +#. ~ Chess message when player tried to promote a pawn when it's not their turn +#: src/chess.lua:3271 src/chess.lua:3278 +msgid "It's not your turn! This promotion is meant for the other player." +msgstr "Non è il tuo turno! Questa promozione spetta all'altrə giocante." + +#. ~ Shown when player tried to dig a chessboard but is not allowed to. @1 = time +#: src/chess.lua:3326 +msgid "" +"You can't dig the chessboard, a game has been started. Reset it first or dig " +"it again in @1." +msgstr "" +"Non puoi rimuovere la scacchiera, c'è una partita in corso. Ripristinala " +"prima, o riprova a rimuoverla in @1." + +#. ~ Shown when player tried to dig a chessboard but is not allowed to. @1 = time +#: src/chess.lua:3332 +msgid "" +"You can't dig the chessboard, a game has been started. Try it again in @1." +msgstr "" +"Non puoi rimuovere la scacchiera, c'è una partita in corso. Riprova tra @1." + +#. ~ Chess board tooltip +#: src/chess.lua:3497 +msgid "Play a game of Chess against another player or the computer" +msgstr "" +"Gioca una partita a scacchi contro un`altrə giocante o contro il computer" + +#. ~ chess piece +#: src/chess.lua:3606 +msgid "White Pawn" +msgstr "Pedone bianco" + +#. ~ chess piece +#: src/chess.lua:3608 +msgid "Black Pawn" +msgstr "Pedone nero" + +#. ~ chess piece +#: src/chess.lua:3611 +msgid "White Rook" +msgstr "Torre bianca" + +#. ~ chess piece +#: src/chess.lua:3613 +msgid "Black Rook" +msgstr "Torre nera" + +#. ~ chess piece +#: src/chess.lua:3616 +msgid "White Knight" +msgstr "Cavallo bianco" + +#. ~ chess piece +#: src/chess.lua:3618 +msgid "Black Knight" +msgstr "Cavallo nero" + +#. ~ chess piece +#: src/chess.lua:3621 +msgid "White Bishop" +msgstr "Alfiere bianco" + +#. ~ chess piece +#: src/chess.lua:3623 +msgid "Black Bishop" +msgstr "Alfiere nero" + +#. ~ chess piece +#: src/chess.lua:3626 +msgid "White Queen" +msgstr "Regina bianca" + +#. ~ chess piece +#: src/chess.lua:3628 +msgid "Black Queen" +msgstr "Regina nera" + +#. ~ chess piece +#: src/chess.lua:3631 +msgid "White King" +msgstr "Re bianco" + +#. ~ chess piece +#: src/chess.lua:3633 +msgid "Black King" +msgstr "Re nero" + +#: src/chess.lua:3899 +#, fuzzy +msgid "Computer" +msgstr "Computer facile" + +#. ~ cauldron hint +#: src/cooking.lua:8 +msgid "Light a fire below to heat it up" +msgstr "" + +#. ~ cauldron hint +#: src/cooking.lua:10 +msgid "Use a bowl to eat the soup" +msgstr "Utilizzare una ciotola per mangiare la zuppa" + +#. ~ cauldron hint +#: src/cooking.lua:12 +msgid "Drop foods inside to make a soup" +msgstr "Mettere gli ingredienti all'interno per fare una zuppa" + +#: src/cooking.lua:15 +msgid "Cauldron (empty)" +msgstr "Calderone (vuoto)" + +#: src/cooking.lua:16 +msgid "Cauldron (cold water)" +msgstr "" + +#: src/cooking.lua:17 +msgid "Cauldron (cold river water)" +msgstr "" + +#: src/cooking.lua:18 +msgid "Cauldron (cold soup)" +msgstr "" + +#: src/cooking.lua:19 +msgid "Cauldron (boiling water)" +msgstr "" + +#: src/cooking.lua:20 +msgid "Cauldron (boiling river water)" +msgstr "" + +#: src/cooking.lua:21 +msgid "Cauldron (boiling soup)" +msgstr "" + +#: src/cooking.lua:335 +msgid "Cauldron" +msgstr "Calderone" + +#. ~ Cauldron tooltip +#: src/cooking.lua:337 +msgid "For storing water and cooking soup" +msgstr "" + +#: src/cooking.lua:354 +msgid "Cauldron with Water (cold)" +msgstr "" + +#: src/cooking.lua:368 +msgid "Cauldron with River Water (cold)" +msgstr "" + +#: src/cooking.lua:382 +msgid "Cauldron with Soup (cold)" +msgstr "" + +#: src/cooking.lua:403 +msgid "Cauldron with Water (boiling)" +msgstr "" + +#: src/cooking.lua:428 +msgid "Cauldron with River Water (boiling)" +msgstr "" + +#: src/cooking.lua:455 +msgid "Cauldron with Soup (boiling)" +msgstr "" + +#. ~ Item that can hold soup +#: src/cooking.lua:491 +msgid "Bowl" +msgstr "Ciotola" + +#: src/cooking.lua:498 +msgid "Bowl of soup" +msgstr "Ciotola di zuppa" + +#. ~ Enchantment +#: src/enchanting.lua:32 src/enchanting.lua:76 +msgid "Efficiency" +msgstr "Efficacia" + +#. ~ Enchantment +#: src/enchanting.lua:34 src/enchanting.lua:77 +msgid "Durability" +msgstr "Durabilità" + +#. ~ Enchantment +#: src/enchanting.lua:36 src/enchanting.lua:78 +msgid "Sharpness" +msgstr "Affilatezza" + +#. ~ Tooltip for enchantment, in format " (+%)", e.g. "Efficiency (+5%)" +#: src/enchanting.lua:41 src/enchanting.lua:43 +msgid "@1 (+@2%)" +msgstr "" + +#. ~ Sharpness enchantment +#: src/enchanting.lua:99 +msgid "Your weapon inflicts more damage" +msgstr "La tua arma infligge più danno" + +#. ~ Durability enchantment +#: src/enchanting.lua:101 +msgid "Your tool lasts longer" +msgstr "Il tuo utensile dura di più" + +#. ~ Efficiency enchantment +#: src/enchanting.lua:103 +msgid "Your tool digs faster" +msgstr "Il tuo utensile scava più rapidamente" + +#: src/enchanting.lua:189 src/enchanting.lua:241 +msgid "Enchantment Table" +msgstr "Tavolo per migliorie" + +#. ~ Enchantment table tooltip +#: src/enchanting.lua:243 +msgid "Enchant your tools with mese crystals" +msgstr "" + +#. ~ Enchanted tool description, e.g. "Enchanted Diamond Sword". @1 is the original tool name, @2 is the enchantment text, e.g. "Durability (+20%)" +#: src/enchanting.lua:388 src/enchanting.lua:516 +msgid "" +"Enchanted @1\n" +"@2" +msgstr "" + +#. ~ Enchanted tool description, e.g. "Enchanted Diamond Sword" +#: src/enchanting.lua:390 src/enchanting.lua:517 +msgid "Enchanted @1" +msgstr "" + +#: src/hive.lua:9 +msgid "The bees are busy making honey." +msgstr "" + +#: src/hive.lua:10 +msgid "The bees are looking for flowers." +msgstr "" + +#: src/hive.lua:11 +msgid "The bees want to pollinate more flowers." +msgstr "" + +#: src/hive.lua:12 +msgid "The bees are idle." +msgstr "" + +#: src/hive.lua:13 +msgid "The bees are resting." +msgstr "" + +#. ~ Beehive +#: src/hive.lua:74 src/hive.lua:124 +msgid "Artificial Hive" +msgstr "Favo artificiale" + +#. ~ Tooltip of artificial hive +#: src/hive.lua:126 +msgid "Bees live here and produce honey" +msgstr "" + +#: src/hive.lua:168 +msgid "Honey" +msgstr "Miele" + +#. ~ Tooltip for honey in crafting guide of the Unified Inventory mod +#: src/hive.lua:194 +msgid "Made by bees" +msgstr "" + +#: src/itemframe.lua:13 +msgid "Item Frame" +msgstr "Teca" + +#. ~ Item frame infotext. @1 = item frame name, @2 = owner name (player) +#: src/itemframe.lua:81 src/itemframe.lua:97 +msgid "@1 (owned by @2)" +msgstr "@1 (proprietà di @2)" + +#. ~ Item frame tooltip +#: src/itemframe.lua:169 +msgid "For presenting a single item" +msgstr "" + +#. ~ Used in the mailbox donor list. Will be displayed as item icon followed by this string. @1 = item count +#: src/mailbox.lua:65 +msgid "× @1" +msgstr "" + +#: src/mailbox.lua:73 src/mailbox.lua:185 +msgid "Mailbox" +msgstr "Cassetta delle lettere" + +#. ~ Caption of the list of players who gave items in a mailbox +#: src/mailbox.lua:75 +msgid "Last donators" +msgstr "Ultimi donatori" + +#. ~ Mailbox menu title. @1 = player name +#: src/mailbox.lua:90 +msgid "" +"Send your goods to\n" +"@1" +msgstr "" +"Invia i tuoi item a\n" +"@1" + +#. ~ Mailbox infotext. @1 = owner name +#: src/mailbox.lua:117 +msgid "@1's Mailbox" +msgstr "Cassetta delle lettere di @1" + +#: src/mailbox.lua:142 +msgid "The mailbox is full." +msgstr "La cassetta delle lettere è piena" + +#. ~ Mailbox tooltip +#: src/mailbox.lua:187 +msgid "Lets other players give you things" +msgstr "" + +#. ~ Pressure plate tooltip +#: src/mechanisms.lua:180 +msgid "Opens doors when stepped on" +msgstr "" + +#: src/mechanisms.lua:219 +msgid "Wooden Pressure Plate" +msgstr "Placca di pressione di legno" + +#: src/mechanisms.lua:225 +msgid "Stone Pressure Plate" +msgstr "Placca di pressione di pietra" + +#: src/mechanisms.lua:229 +msgid "Lever" +msgstr "Leva" + +#. ~ Lever tooltip +#: src/mechanisms.lua:231 +msgid "Opens doors when pulled" +msgstr "" + +#: src/nodes.lua:21 +msgid "Bamboo Frame" +msgstr "Cornice di bambù" + +#: src/nodes.lua:31 +msgid "Chainlink" +msgstr "Cotta di maglia" + +#: src/nodes.lua:40 +msgid "Rusty Iron Bars" +msgstr "Sbarre di prigione arrugginite" + +#: src/nodes.lua:52 +msgid "Wood Frame" +msgstr "Cornice in legno" + +#: src/nodes.lua:64 +msgid "Barricade" +msgstr "Barricata" + +#: src/nodes.lua:77 +msgid "Barrel" +msgstr "Barile" + +#: src/nodes.lua:109 +msgid "Wooden Cabinet" +msgstr "Stipo di legno" + +#. ~ Tooltip for block that stores items +#: src/nodes.lua:111 src/nodes.lua:139 src/nodes.lua:161 +msgid "24 inventory slots" +msgstr "" + +#: src/nodes.lua:120 +msgid "Half Wooden Cabinet" +msgstr "Stipo di legno a metà" + +#. ~ Tooltip for block that stores items +#: src/nodes.lua:123 +msgid "8 inventory slots" +msgstr "" + +#: src/nodes.lua:138 src/nodes.lua:155 +msgid "Plain Shelf" +msgstr "" + +#: src/nodes.lua:160 +msgid "Multi Shelf" +msgstr "Mensole" + +#: src/nodes.lua:170 +msgid "Candle" +msgstr "Candela" + +#: src/nodes.lua:202 +msgid "Chair" +msgstr "Sedia" + +#: src/nodes.lua:226 +msgid "Cobweb" +msgstr "Ragnatela" + +#: src/nodes.lua:239 +msgid "Red Curtain" +msgstr "Tenda rossa" + +#: src/nodes.lua:323 +msgid "Cushion" +msgstr "Cuscino" + +#: src/nodes.lua:338 +msgid "Cushion Block" +msgstr "Blocco di cuscini" + +#: src/nodes.lua:351 +msgid "Japanese Door" +msgstr "Porta giapponese" + +#: src/nodes.lua:359 +msgid "Prison Door" +msgstr "Porta di prigione" + +#: src/nodes.lua:373 +msgid "Rusty Prison Door" +msgstr "Porta di prigione arrugginita" + +#: src/nodes.lua:387 +msgid "Screen Door" +msgstr "Porta a schermo" + +#: src/nodes.lua:395 +msgid "Paper Door" +msgstr "" + +#: src/nodes.lua:403 +msgid "Woodglass Door" +msgstr "Porta di vetro" + +#: src/nodes.lua:448 src/nodes.lua:469 +msgid "Ender Chest" +msgstr "Baule ender" + +#. ~ Ender chest tooltip +#: src/nodes.lua:450 +msgid "Interdimensional inventory" +msgstr "" + +#: src/nodes.lua:479 +msgid "Ivy" +msgstr "Edera" + +#: src/nodes.lua:493 +msgid "Weathercock" +msgstr "" + +#: src/nodes.lua:506 +msgid "Lantern" +msgstr "Lanterna" + +#: src/nodes.lua:581 +msgid "Hanging Lantern" +msgstr "" + +#: src/nodes.lua:625 +msgid "Steel Lattice Light Box" +msgstr "" + +#: src/nodes.lua:626 +msgid "Wooden Cross Light Box" +msgstr "" + +#: src/nodes.lua:627 +msgid "Wooden Rhombus Light Box" +msgstr "" + +#: src/nodes.lua:644 +msgid "Potted White Dandelion" +msgstr "Soffione bianco in vaso" + +#: src/nodes.lua:645 +msgid "Potted Yellow Dandelion" +msgstr "Soffione giallo in vaso" + +#: src/nodes.lua:646 +#, fuzzy +msgid "Potted Blue Geranium" +msgstr "Geranio in vaso" + +#: src/nodes.lua:647 +#, fuzzy +msgid "Potted Red Rose" +msgstr "Rosa in vaso" + +#: src/nodes.lua:648 +#, fuzzy +msgid "Potted Orange Tulip" +msgstr "Tulipano in vaso" + +#: src/nodes.lua:649 +msgid "Potted Viola" +msgstr "Violetta in vaso" + +#: src/nodes.lua:651 +#, fuzzy +msgid "Potted Black Tulip" +msgstr "Tulipano in vaso" + +#: src/nodes.lua:652 +#, fuzzy +msgid "Potted Green Chrysanthemum" +msgstr "Geranio in vaso" + +#: src/nodes.lua:691 +msgid "Painting" +msgstr "Dipinto" + +#: src/nodes.lua:766 +msgid "Garden Stone Path" +msgstr "Sentiero da giardino in pietra" + +#: src/nodes.lua:796 +msgid "Cactus Brick" +msgstr "Mattone di cactus" + +#: src/nodes.lua:797 +msgid "Coal Stone Tile" +msgstr "Mattonella di pietra di carbone" + +#: src/nodes.lua:798 +msgid "Polished Desert Stone Block" +msgstr "" + +#: src/nodes.lua:799 +msgid "Hardened Clay" +msgstr "Argilla indurita" + +#: src/nodes.lua:800 +msgid "Moon Brick" +msgstr "Mattone lunare" + +#: src/nodes.lua:801 +msgid "Runestone" +msgstr "Pietra runica" + +#: src/nodes.lua:805 +msgid "Polished Stone Block" +msgstr "" + +#: src/nodes.lua:810 +msgid "Packed Ice" +msgstr "Ghiaccio compatto" + +#: src/nodes.lua:817 +msgid "Wooden Tile" +msgstr "Mattonella di legno" + +#. ~ Furniture +#: src/nodes.lua:826 +msgid "Table" +msgstr "Tavolo" + +#: src/nodes.lua:837 +msgid "Tatami" +msgstr "Tatami" + +#: src/nodes.lua:847 +msgid "Trampoline" +msgstr "Trampolino" + +#: src/nodes.lua:878 +msgid "Television" +msgstr "Televisione" + +#: src/nodes.lua:897 +msgid "Wood Framed Glass" +msgstr "Cornice in legno con vetro" + +#: src/nodes.lua:957 +msgid "Radio" +msgstr "" + +#. ~ as in "loudspeaker" +#: src/nodes.lua:959 +msgid "Speaker" +msgstr "" + +#: src/rope.lua:123 +msgid "Rope" +msgstr "Corda" + +#. ~ Part of a block name for a tiny slab with 1/16 height and 1/4 area. E.g. "Stone Nanoslab" +#: src/workbench.lua:31 +msgid "Nanoslab" +msgstr "" + +#. ~ Block name for a tiny slab with 1/16 height and 1/4 area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:33 +msgid "@1 Nanoslab" +msgstr "" + +#. ~ Part of a block name for a tiny slab with 1/16 height and 1/2 area. E.g. "Stone Micropanel" +#: src/workbench.lua:36 +msgid "Micropanel" +msgstr "" + +#. ~ Block name for a tiny slab with 1/16 height and 1/2 area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:38 +msgid "@1 Micropanel" +msgstr "" + +#. ~ Part of a block name for a tiny slab with 1/16 height and full area. E.g. "Stone Microslab" +#: src/workbench.lua:41 +msgid "Microslab" +msgstr "" + +#. ~ Block name for a tiny slab with 1/16 height and full area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:43 +msgid "@1 Microslab" +msgstr "" + +#. ~ Part of a block name of a thin stair, a stair-like block where the "steps" are thinner. E.g. "Stone Thin Stair" +#: src/workbench.lua:46 +msgid "Thin Stair" +msgstr "" + +#. ~ Block name of a thin stair, a stair-like block where the "steps" are thinner. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:48 +msgid "@1 Thin Stair" +msgstr "" + +#. ~ Part of a block name of a tiny cube-shaped block with 1/2 the side length of a full block. E.g. "Stone Cube" +#: src/workbench.lua:51 +msgid "Cube" +msgstr "" + +#. ~ Block name of a tiny cube-shaped block with 1/2 the side length of a full block. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:53 +msgid "@1 Cube" +msgstr "" + +#. ~ Part of a block name of a block with 1/2 the height and 1/2 the length of a full block. It's like a slab that was cut in half. E.g. "Stone Panel" +#: src/workbench.lua:56 +msgid "Panel" +msgstr "" + +#. ~ Block name of a block with 1/2 the height and 1/2 the length of a full block. It's like a slab that was cut in half. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:58 +msgid "@1 Panel" +msgstr "" + +#. ~ Part of block name of a block with 1/2 the height of a full block. E.g. "Stone Slab" +#: src/workbench.lua:61 +msgid "Slab" +msgstr "" + +#. ~ Block name of a stair-like block variant with a lower piece cut away. E.g. "Stone Double Panel" +#: src/workbench.lua:66 +msgid "Double Panel" +msgstr "" + +#. ~ Block name of a stair-like block variant with a lower piece cut away. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:68 +msgid "@1 Double Panel" +msgstr "" + +#. ~ Part of a block name for a stair where 1/2 has been cut away sideways. Can be obtained by work bench. E.g. "Stone Half-Stair" +#: src/workbench.lua:72 +msgid "Half-Stair" +msgstr "" + +#. ~ Block name of a stair where 1/2 has been cut away sideways. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:74 +msgid "@1 Half-Stair" +msgstr "" + +#. ~ Block name of a 'traditional' stair-shaped block. E.g. "Stone Stair" +#: src/workbench.lua:78 +msgid "Stair" +msgstr "" + +#. ~ Label shown in work bench menu where you can cut a block to create smaller versions of it +#: src/workbench.lua:167 +msgid "Cut" +msgstr "Tagliare" + +#. ~ Label shown in work bench menu where you can repair an item +#: src/workbench.lua:169 +msgid "Repair" +msgstr "Riparare" + +#. ~ Button in work bench menu for the crafting grid +#: src/workbench.lua:173 +msgid "Crafting" +msgstr "Fabbricare" + +#. ~ Button in work bench menu for its inventory +#: src/workbench.lua:175 +msgid "Storage" +msgstr "Conservare" + +#. ~ Button to return to main page in work bench menu +#: src/workbench.lua:196 src/workbench.lua:204 +msgid "Back" +msgstr "Indietro" + +#: src/workbench.lua:236 src/workbench.lua:375 +msgid "Work Bench" +msgstr "Banco da lavoro" + +#. ~ Work bench tooltip +#: src/workbench.lua:377 +msgid "" +"For cutting blocks, repairing tools with a hammer, crafting and storing items" +msgstr "" + +#. ~ Hammer tooltip +#: src/workbench.lua:668 +msgid "Repairs tools at the work bench" +msgstr "" + +#: src/workbench.lua:756 +msgid "Hammer" +msgstr "Martello" + +#~ msgid "Weak Computer 1" +#~ msgstr "Computer facile 1" + +#~ msgid "Weak Computer 2" +#~ msgstr "Computer facile 2" diff --git a/mods/xdecor/locale/xdecor.pot b/mods/xdecor/locale/xdecor.pot new file mode 100644 index 0000000..7dd29d3 --- /dev/null +++ b/mods/xdecor/locale/xdecor.pot @@ -0,0 +1,1064 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the xdecor package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: xdecor\n" +"Report-Msgid-Bugs-To: Wuzzy@disroot.org\n" +"POT-Creation-Date: 2025-10-18 11:01+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. ~ Block name of a 'traditional' stair-shaped block. (@1 = base block name, e.g. "Stone") +#: handlers/registration.lua:75 handlers/registration.lua:91 +#: src/workbench.lua:80 src/workbench.lua:470 +msgid "@1 Stair" +msgstr "" + +#: handlers/registration.lua:78 handlers/registration.lua:94 +#: src/workbench.lua:471 +msgid "Inner @1 Stair" +msgstr "" + +#: handlers/registration.lua:80 handlers/registration.lua:95 +#: src/workbench.lua:472 +msgid "Outer @1 Stair" +msgstr "" + +#. ~ Block name of a block with 1/2 the height of a full block. (@1 = base block name, e.g. "Stone") +#: handlers/registration.lua:84 handlers/registration.lua:92 +#: src/workbench.lua:63 src/workbench.lua:473 +msgid "@1 Slab" +msgstr "" + +#: src/chessbot_random.lua:51 +msgid "Random Computer" +msgstr "" + +#: src/chessbot_weak.lua:125 +msgid "Weak Computer" +msgstr "" + +#: src/chess.lua:196 +msgid "Chess" +msgstr "" + +#: src/chess.lua:197 +msgid "Chess Debug" +msgstr "" + +#. ~ Chess: Game mode selection prompt +#: src/chess.lua:1284 src/chess.lua:1285 +msgid "Select a game mode" +msgstr "" + +#. ~ Chess: Game mode selection prompt +#: src/chess.lua:1287 +msgid "Select a mode:" +msgstr "" + +#. ~ Chess game mode (player vs bot) +#: src/chess.lua:1289 +msgid "Singleplayer" +msgstr "" + +#. ~ Chess game mode (player vs player) +#: src/chess.lua:1291 +msgid "Multiplayer" +msgstr "" + +#. ~ Chess game mode +#: src/chess.lua:1294 +msgid "Bot vs Bot" +msgstr "" + +#. ~ Chess: player is in check +#: src/chess.lua:1814 +msgid "check" +msgstr "" + +#. ~ Chess: player has been checkmated +#: src/chess.lua:1816 +msgid "checkmate" +msgstr "" + +#. ~ Chess: player has resigned +#: src/chess.lua:1818 +msgid "resigned" +msgstr "" + +#. ~ Chess: player has won +#: src/chess.lua:1820 +msgid "winner" +msgstr "" + +#. ~ Chess: player has lost +#: src/chess.lua:1822 +msgid "loser" +msgstr "" + +#. ~ Chess: player has a draw +#: src/chess.lua:1824 +msgid "draw" +msgstr "" + +#. ~ Chess: Shown when black player can promote a pawn. Space for text is limited. +#: src/chess.lua:1869 +msgid "" +"PROMOTION\n" +"FOR BLACK!" +msgstr "" + +#. ~ Chess: Prompt for player who must select to which piece to promote their pawn. Space for text is limited. +#: src/chess.lua:1875 src/chess.lua:1891 +msgid "Promote pawn to:" +msgstr "" + +#. ~ Chess: Shown when white player can promote a pawn. Space for text is limited. +#: src/chess.lua:1886 +msgid "" +"PROMOTION\n" +"FOR WHITE!" +msgstr "" + +#. ~ Chess: Shown when white player wants to use the 50-move rule or threefold-repetition rule to claim a draw. Space for text is limited. +#: src/chess.lua:1904 +msgid "" +"DRAW CLAIM\n" +"BY WHITE!" +msgstr "" + +#. ~ Chess: Shown when black player wants to use the 50-move rule or threefold-repetition rule to claim a draw. Space for text is limited. +#: src/chess.lua:1907 +msgid "" +"DRAW CLAIM\n" +"BY BLACK!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1914 +msgid "" +"The player has invoked the 50-move rule for the next move. The next move " +"might draw the game." +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1920 +msgid "" +"The player has invoked the threefold-repetition rule for the next move. The " +"next move might draw the game." +msgstr "" + +#. ~ Chess button +#: src/chess.lua:1927 +msgid "New game" +msgstr "" + +#. ~ Resign (give up) in Chess +#: src/chess.lua:1934 +msgid "Resign" +msgstr "" + +#. ~ Chess: Prompt to select a player color +#: src/chess.lua:1940 +msgid "Select a color:" +msgstr "" + +#. ~ White Chess player +#: src/chess.lua:1944 +msgid "White" +msgstr "" + +#. ~ Black Chess player +#: src/chess.lua:1946 +msgid "Black" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1958 +msgid "Invoke the 50-move rule for your next move" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1965 +msgid "Invoke the 50-move rule and draw the game" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1978 +msgid "Invoke the threefold repetition rule and draw the game" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:1985 +msgid "Invoke the threefold repetition rule for your next move" +msgstr "" + +#. ~ Chess message. @1 = opponent name +#: src/chess.lua:2116 src/chess.lua:2141 +msgid "You have checkmated @1. You win!" +msgstr "" + +#. ~ Chess message. @1 = opponent name +#: src/chess.lua:2118 src/chess.lua:2143 +msgid "You were checkmated by @1. You lose!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2128 src/chess.lua:2153 +msgid "The game ended up in a stalemate! It's a draw!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2166 +msgid "The game ended up in a dead position! It's a draw!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2180 +msgid "" +"No piece was captured and no pawn was moved for 75 consecutive moves of each " +"player. It's a draw!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2203 src/chess.lua:3187 +msgid "You have drawn the game by invoking the 50-move rule." +msgstr "" + +#. ~ Chess message. @1 = player name +#: src/chess.lua:2206 src/chess.lua:3190 +msgid "@1 has drawn the game by invoking the 50-move rule." +msgstr "" + +#. ~ Chess message shown when player has invoked a rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2221 src/chess.lua:2334 +msgid "You have failed to make a game-drawing move. The game continues." +msgstr "" + +#. ~ Chess message shown when player (name = @1) has invoked the 50-move rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2224 +msgid "" +"@1 made a draw claim using the 50-move rule but it was false. The game " +"continues." +msgstr "" + +#. ~ Chess message when a fivefold repetition has happened +#: src/chess.lua:2294 +msgid "The exact same position has occured 5 times. It's a draw!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2317 src/chess.lua:3235 +msgid "You have drawn the game by invoking the threefold repetition rule." +msgstr "" + +#. ~ Chess message. @1 = player name +#: src/chess.lua:2320 src/chess.lua:3238 +msgid "@1 has drawn the game by invoking the threefold repetition rule." +msgstr "" + +#. ~ Chess message shown when player (name = @1) has invoked the threefold repetition rule to claim a draw and had to make a game-drawing move but instead made a different move +#: src/chess.lua:2337 +msgid "" +"@1 made a draw claim using the threefold repetition rule but it was false. " +"The game continues." +msgstr "" + +#: src/chess.lua:2350 src/chess.lua:3479 +msgid "Chess Board" +msgstr "" + +#. ~ Chess message when player tries to move with someone else's pieces +#: src/chess.lua:2444 +msgid "Someone else plays white pieces!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2455 src/chess.lua:2475 +msgid "It's not your turn!" +msgstr "" + +#. ~ Chess message when player tries to move with someone else's pieces +#: src/chess.lua:2465 +msgid "Someone else plays black pieces!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:2482 +msgid "Black cannot move first!" +msgstr "" + +#. ~ number of seconds +#: src/chess.lua:3019 +msgid "@1 s" +msgstr "" + +#. ~ number of minutes and seconds +#: src/chess.lua:3023 +msgid "@1 min @2 s" +msgstr "" + +#: src/chess.lua:3096 +msgid "" +"You can't reset the chessboard, a game has been started. Try again in @1." +msgstr "" + +#. ~ Chess message when player tried to resign too early +#: src/chess.lua:3108 +msgid "Resigning is not possible yet." +msgstr "" + +#. ~ Chess message when player resigned (gave up) +#: src/chess.lua:3139 +msgid "You have resigned." +msgstr "" + +#. ~ Chess message when player resigned (gave up). @1 = opponent name +#: src/chess.lua:3142 +msgid "@1 has resigned. You win!" +msgstr "" + +#. ~ Chess message +#: src/chess.lua:3148 +msgid "You can't resign, you're not playing in this game." +msgstr "" + +#. ~ Chess message +#: src/chess.lua:3176 src/chess.lua:3223 +msgid "You can't claim a draw, it's not your turn!" +msgstr "" + +#: src/chess.lua:3260 +msgid "You're only a spectator in this game of Chess." +msgstr "" + +#. ~ Chess message when player tried to promote a pawn when it's not legal +#: src/chess.lua:3267 +msgid "This isn't the time for promotion." +msgstr "" + +#. ~ Chess message when player tried to promote a pawn when it's not their turn +#: src/chess.lua:3271 src/chess.lua:3278 +msgid "It's not your turn! This promotion is meant for the other player." +msgstr "" + +#. ~ Shown when player tried to dig a chessboard but is not allowed to. @1 = time +#: src/chess.lua:3326 +msgid "" +"You can't dig the chessboard, a game has been started. Reset it first or dig " +"it again in @1." +msgstr "" + +#. ~ Shown when player tried to dig a chessboard but is not allowed to. @1 = time +#: src/chess.lua:3332 +msgid "" +"You can't dig the chessboard, a game has been started. Try it again in @1." +msgstr "" + +#. ~ Chess board tooltip +#: src/chess.lua:3497 +msgid "Play a game of Chess against another player or the computer" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3606 +msgid "White Pawn" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3608 +msgid "Black Pawn" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3611 +msgid "White Rook" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3613 +msgid "Black Rook" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3616 +msgid "White Knight" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3618 +msgid "Black Knight" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3621 +msgid "White Bishop" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3623 +msgid "Black Bishop" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3626 +msgid "White Queen" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3628 +msgid "Black Queen" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3631 +msgid "White King" +msgstr "" + +#. ~ chess piece +#: src/chess.lua:3633 +msgid "Black King" +msgstr "" + +#: src/chess.lua:3899 +msgid "Computer" +msgstr "" + +#. ~ cauldron hint +#: src/cooking.lua:8 +msgid "Light a fire below to heat it up" +msgstr "" + +#. ~ cauldron hint +#: src/cooking.lua:10 +msgid "Use a bowl to eat the soup" +msgstr "" + +#. ~ cauldron hint +#: src/cooking.lua:12 +msgid "Drop foods inside to make a soup" +msgstr "" + +#: src/cooking.lua:15 +msgid "Cauldron (empty)" +msgstr "" + +#: src/cooking.lua:16 +msgid "Cauldron (cold water)" +msgstr "" + +#: src/cooking.lua:17 +msgid "Cauldron (cold river water)" +msgstr "" + +#: src/cooking.lua:18 +msgid "Cauldron (cold soup)" +msgstr "" + +#: src/cooking.lua:19 +msgid "Cauldron (boiling water)" +msgstr "" + +#: src/cooking.lua:20 +msgid "Cauldron (boiling river water)" +msgstr "" + +#: src/cooking.lua:21 +msgid "Cauldron (boiling soup)" +msgstr "" + +#: src/cooking.lua:335 +msgid "Cauldron" +msgstr "" + +#. ~ Cauldron tooltip +#: src/cooking.lua:337 +msgid "For storing water and cooking soup" +msgstr "" + +#: src/cooking.lua:354 +msgid "Cauldron with Water (cold)" +msgstr "" + +#: src/cooking.lua:368 +msgid "Cauldron with River Water (cold)" +msgstr "" + +#: src/cooking.lua:382 +msgid "Cauldron with Soup (cold)" +msgstr "" + +#: src/cooking.lua:403 +msgid "Cauldron with Water (boiling)" +msgstr "" + +#: src/cooking.lua:428 +msgid "Cauldron with River Water (boiling)" +msgstr "" + +#: src/cooking.lua:455 +msgid "Cauldron with Soup (boiling)" +msgstr "" + +#. ~ Item that can hold soup +#: src/cooking.lua:491 +msgid "Bowl" +msgstr "" + +#: src/cooking.lua:498 +msgid "Bowl of soup" +msgstr "" + +#. ~ Enchantment +#: src/enchanting.lua:32 src/enchanting.lua:76 +msgid "Efficiency" +msgstr "" + +#. ~ Enchantment +#: src/enchanting.lua:34 src/enchanting.lua:77 +msgid "Durability" +msgstr "" + +#. ~ Enchantment +#: src/enchanting.lua:36 src/enchanting.lua:78 +msgid "Sharpness" +msgstr "" + +#. ~ Tooltip for enchantment, in format " (+%)", e.g. "Efficiency (+5%)" +#: src/enchanting.lua:41 src/enchanting.lua:43 +msgid "@1 (+@2%)" +msgstr "" + +#. ~ Sharpness enchantment +#: src/enchanting.lua:99 +msgid "Your weapon inflicts more damage" +msgstr "" + +#. ~ Durability enchantment +#: src/enchanting.lua:101 +msgid "Your tool lasts longer" +msgstr "" + +#. ~ Efficiency enchantment +#: src/enchanting.lua:103 +msgid "Your tool digs faster" +msgstr "" + +#: src/enchanting.lua:189 src/enchanting.lua:241 +msgid "Enchantment Table" +msgstr "" + +#. ~ Enchantment table tooltip +#: src/enchanting.lua:243 +msgid "Enchant your tools with mese crystals" +msgstr "" + +#. ~ Enchanted tool description, e.g. "Enchanted Diamond Sword". @1 is the original tool name, @2 is the enchantment text, e.g. "Durability (+20%)" +#: src/enchanting.lua:388 src/enchanting.lua:516 +msgid "" +"Enchanted @1\n" +"@2" +msgstr "" + +#. ~ Enchanted tool description, e.g. "Enchanted Diamond Sword" +#: src/enchanting.lua:390 src/enchanting.lua:517 +msgid "Enchanted @1" +msgstr "" + +#: src/hive.lua:9 +msgid "The bees are busy making honey." +msgstr "" + +#: src/hive.lua:10 +msgid "The bees are looking for flowers." +msgstr "" + +#: src/hive.lua:11 +msgid "The bees want to pollinate more flowers." +msgstr "" + +#: src/hive.lua:12 +msgid "The bees are idle." +msgstr "" + +#: src/hive.lua:13 +msgid "The bees are resting." +msgstr "" + +#. ~ Beehive +#: src/hive.lua:74 src/hive.lua:124 +msgid "Artificial Hive" +msgstr "" + +#. ~ Tooltip of artificial hive +#: src/hive.lua:126 +msgid "Bees live here and produce honey" +msgstr "" + +#: src/hive.lua:168 +msgid "Honey" +msgstr "" + +#. ~ Tooltip for honey in crafting guide of the Unified Inventory mod +#: src/hive.lua:194 +msgid "Made by bees" +msgstr "" + +#: src/itemframe.lua:13 +msgid "Item Frame" +msgstr "" + +#. ~ Item frame infotext. @1 = item frame name, @2 = owner name (player) +#: src/itemframe.lua:81 src/itemframe.lua:97 +msgid "@1 (owned by @2)" +msgstr "" + +#. ~ Item frame tooltip +#: src/itemframe.lua:169 +msgid "For presenting a single item" +msgstr "" + +#. ~ Used in the mailbox donor list. Will be displayed as item icon followed by this string. @1 = item count +#: src/mailbox.lua:65 +msgid "× @1" +msgstr "" + +#: src/mailbox.lua:73 src/mailbox.lua:185 +msgid "Mailbox" +msgstr "" + +#. ~ Caption of the list of players who gave items in a mailbox +#: src/mailbox.lua:75 +msgid "Last donators" +msgstr "" + +#. ~ Mailbox menu title. @1 = player name +#: src/mailbox.lua:90 +msgid "" +"Send your goods to\n" +"@1" +msgstr "" + +#. ~ Mailbox infotext. @1 = owner name +#: src/mailbox.lua:117 +msgid "@1's Mailbox" +msgstr "" + +#: src/mailbox.lua:142 +msgid "The mailbox is full." +msgstr "" + +#. ~ Mailbox tooltip +#: src/mailbox.lua:187 +msgid "Lets other players give you things" +msgstr "" + +#. ~ Pressure plate tooltip +#: src/mechanisms.lua:180 +msgid "Opens doors when stepped on" +msgstr "" + +#: src/mechanisms.lua:219 +msgid "Wooden Pressure Plate" +msgstr "" + +#: src/mechanisms.lua:225 +msgid "Stone Pressure Plate" +msgstr "" + +#: src/mechanisms.lua:229 +msgid "Lever" +msgstr "" + +#. ~ Lever tooltip +#: src/mechanisms.lua:231 +msgid "Opens doors when pulled" +msgstr "" + +#: src/nodes.lua:21 +msgid "Bamboo Frame" +msgstr "" + +#: src/nodes.lua:31 +msgid "Chainlink" +msgstr "" + +#: src/nodes.lua:40 +msgid "Rusty Iron Bars" +msgstr "" + +#: src/nodes.lua:52 +msgid "Wood Frame" +msgstr "" + +#: src/nodes.lua:64 +msgid "Barricade" +msgstr "" + +#: src/nodes.lua:77 +msgid "Barrel" +msgstr "" + +#: src/nodes.lua:109 +msgid "Wooden Cabinet" +msgstr "" + +#. ~ Tooltip for block that stores items +#: src/nodes.lua:111 src/nodes.lua:139 src/nodes.lua:161 +msgid "24 inventory slots" +msgstr "" + +#: src/nodes.lua:120 +msgid "Half Wooden Cabinet" +msgstr "" + +#. ~ Tooltip for block that stores items +#: src/nodes.lua:123 +msgid "8 inventory slots" +msgstr "" + +#: src/nodes.lua:138 src/nodes.lua:155 +msgid "Plain Shelf" +msgstr "" + +#: src/nodes.lua:160 +msgid "Multi Shelf" +msgstr "" + +#: src/nodes.lua:170 +msgid "Candle" +msgstr "" + +#: src/nodes.lua:202 +msgid "Chair" +msgstr "" + +#: src/nodes.lua:226 +msgid "Cobweb" +msgstr "" + +#: src/nodes.lua:239 +msgid "Red Curtain" +msgstr "" + +#: src/nodes.lua:323 +msgid "Cushion" +msgstr "" + +#: src/nodes.lua:338 +msgid "Cushion Block" +msgstr "" + +#: src/nodes.lua:351 +msgid "Japanese Door" +msgstr "" + +#: src/nodes.lua:359 +msgid "Prison Door" +msgstr "" + +#: src/nodes.lua:373 +msgid "Rusty Prison Door" +msgstr "" + +#: src/nodes.lua:387 +msgid "Screen Door" +msgstr "" + +#: src/nodes.lua:395 +msgid "Paper Door" +msgstr "" + +#: src/nodes.lua:403 +msgid "Woodglass Door" +msgstr "" + +#: src/nodes.lua:448 src/nodes.lua:469 +msgid "Ender Chest" +msgstr "" + +#. ~ Ender chest tooltip +#: src/nodes.lua:450 +msgid "Interdimensional inventory" +msgstr "" + +#: src/nodes.lua:479 +msgid "Ivy" +msgstr "" + +#: src/nodes.lua:493 +msgid "Weathercock" +msgstr "" + +#: src/nodes.lua:506 +msgid "Lantern" +msgstr "" + +#: src/nodes.lua:581 +msgid "Hanging Lantern" +msgstr "" + +#: src/nodes.lua:625 +msgid "Steel Lattice Light Box" +msgstr "" + +#: src/nodes.lua:626 +msgid "Wooden Cross Light Box" +msgstr "" + +#: src/nodes.lua:627 +msgid "Wooden Rhombus Light Box" +msgstr "" + +#: src/nodes.lua:644 +msgid "Potted White Dandelion" +msgstr "" + +#: src/nodes.lua:645 +msgid "Potted Yellow Dandelion" +msgstr "" + +#: src/nodes.lua:646 +msgid "Potted Blue Geranium" +msgstr "" + +#: src/nodes.lua:647 +msgid "Potted Red Rose" +msgstr "" + +#: src/nodes.lua:648 +msgid "Potted Orange Tulip" +msgstr "" + +#: src/nodes.lua:649 +msgid "Potted Viola" +msgstr "" + +#: src/nodes.lua:651 +msgid "Potted Black Tulip" +msgstr "" + +#: src/nodes.lua:652 +msgid "Potted Green Chrysanthemum" +msgstr "" + +#: src/nodes.lua:691 +msgid "Painting" +msgstr "" + +#: src/nodes.lua:766 +msgid "Garden Stone Path" +msgstr "" + +#: src/nodes.lua:796 +msgid "Cactus Brick" +msgstr "" + +#: src/nodes.lua:797 +msgid "Coal Stone Tile" +msgstr "" + +#: src/nodes.lua:798 +msgid "Polished Desert Stone Block" +msgstr "" + +#: src/nodes.lua:799 +msgid "Hardened Clay" +msgstr "" + +#: src/nodes.lua:800 +msgid "Moon Brick" +msgstr "" + +#: src/nodes.lua:801 +msgid "Runestone" +msgstr "" + +#: src/nodes.lua:805 +msgid "Polished Stone Block" +msgstr "" + +#: src/nodes.lua:810 +msgid "Packed Ice" +msgstr "" + +#: src/nodes.lua:817 +msgid "Wooden Tile" +msgstr "" + +#. ~ Furniture +#: src/nodes.lua:826 +msgid "Table" +msgstr "" + +#: src/nodes.lua:837 +msgid "Tatami" +msgstr "" + +#: src/nodes.lua:847 +msgid "Trampoline" +msgstr "" + +#: src/nodes.lua:878 +msgid "Television" +msgstr "" + +#: src/nodes.lua:897 +msgid "Wood Framed Glass" +msgstr "" + +#: src/nodes.lua:957 +msgid "Radio" +msgstr "" + +#. ~ as in "loudspeaker" +#: src/nodes.lua:959 +msgid "Speaker" +msgstr "" + +#: src/rope.lua:123 +msgid "Rope" +msgstr "" + +#. ~ Part of a block name for a tiny slab with 1/16 height and 1/4 area. E.g. "Stone Nanoslab" +#: src/workbench.lua:31 +msgid "Nanoslab" +msgstr "" + +#. ~ Block name for a tiny slab with 1/16 height and 1/4 area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:33 +msgid "@1 Nanoslab" +msgstr "" + +#. ~ Part of a block name for a tiny slab with 1/16 height and 1/2 area. E.g. "Stone Micropanel" +#: src/workbench.lua:36 +msgid "Micropanel" +msgstr "" + +#. ~ Block name for a tiny slab with 1/16 height and 1/2 area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:38 +msgid "@1 Micropanel" +msgstr "" + +#. ~ Part of a block name for a tiny slab with 1/16 height and full area. E.g. "Stone Microslab" +#: src/workbench.lua:41 +msgid "Microslab" +msgstr "" + +#. ~ Block name for a tiny slab with 1/16 height and full area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:43 +msgid "@1 Microslab" +msgstr "" + +#. ~ Part of a block name of a thin stair, a stair-like block where the "steps" are thinner. E.g. "Stone Thin Stair" +#: src/workbench.lua:46 +msgid "Thin Stair" +msgstr "" + +#. ~ Block name of a thin stair, a stair-like block where the "steps" are thinner. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:48 +msgid "@1 Thin Stair" +msgstr "" + +#. ~ Part of a block name of a tiny cube-shaped block with 1/2 the side length of a full block. E.g. "Stone Cube" +#: src/workbench.lua:51 +msgid "Cube" +msgstr "" + +#. ~ Block name of a tiny cube-shaped block with 1/2 the side length of a full block. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:53 +msgid "@1 Cube" +msgstr "" + +#. ~ Part of a block name of a block with 1/2 the height and 1/2 the length of a full block. It's like a slab that was cut in half. E.g. "Stone Panel" +#: src/workbench.lua:56 +msgid "Panel" +msgstr "" + +#. ~ Block name of a block with 1/2 the height and 1/2 the length of a full block. It's like a slab that was cut in half. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:58 +msgid "@1 Panel" +msgstr "" + +#. ~ Part of block name of a block with 1/2 the height of a full block. E.g. "Stone Slab" +#: src/workbench.lua:61 +msgid "Slab" +msgstr "" + +#. ~ Block name of a stair-like block variant with a lower piece cut away. E.g. "Stone Double Panel" +#: src/workbench.lua:66 +msgid "Double Panel" +msgstr "" + +#. ~ Block name of a stair-like block variant with a lower piece cut away. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:68 +msgid "@1 Double Panel" +msgstr "" + +#. ~ Part of a block name for a stair where 1/2 has been cut away sideways. Can be obtained by work bench. E.g. "Stone Half-Stair" +#: src/workbench.lua:72 +msgid "Half-Stair" +msgstr "" + +#. ~ Block name of a stair where 1/2 has been cut away sideways. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") +#: src/workbench.lua:74 +msgid "@1 Half-Stair" +msgstr "" + +#. ~ Block name of a 'traditional' stair-shaped block. E.g. "Stone Stair" +#: src/workbench.lua:78 +msgid "Stair" +msgstr "" + +#. ~ Label shown in work bench menu where you can cut a block to create smaller versions of it +#: src/workbench.lua:167 +msgid "Cut" +msgstr "" + +#. ~ Label shown in work bench menu where you can repair an item +#: src/workbench.lua:169 +msgid "Repair" +msgstr "" + +#. ~ Button in work bench menu for the crafting grid +#: src/workbench.lua:173 +msgid "Crafting" +msgstr "" + +#. ~ Button in work bench menu for its inventory +#: src/workbench.lua:175 +msgid "Storage" +msgstr "" + +#. ~ Button to return to main page in work bench menu +#: src/workbench.lua:196 src/workbench.lua:204 +msgid "Back" +msgstr "" + +#: src/workbench.lua:236 src/workbench.lua:375 +msgid "Work Bench" +msgstr "" + +#. ~ Work bench tooltip +#: src/workbench.lua:377 +msgid "" +"For cutting blocks, repairing tools with a hammer, crafting and storing items" +msgstr "" + +#. ~ Hammer tooltip +#: src/workbench.lua:668 +msgid "Repairs tools at the work bench" +msgstr "" + +#: src/workbench.lua:756 +msgid "Hammer" +msgstr "" diff --git a/mods/xdecor/mod.conf b/mods/xdecor/mod.conf new file mode 100644 index 0000000..b8d0fdf --- /dev/null +++ b/mods/xdecor/mod.conf @@ -0,0 +1,6 @@ +name = xdecor +title = X-Decor-libre +description = A libre decoration mod meant to be simple and well-featured. +depends = default, bucket, doors, farming, stairs, xpanes +optional_depends = flowers, player_api, fire, moreblocks, mesecons, unified_inventory, tt, toolranks, wool, farming +min_minetest_version = 5.9 diff --git a/mods/xdecor/screenshot.png b/mods/xdecor/screenshot.png new file mode 100644 index 0000000..2ccdaad Binary files /dev/null and b/mods/xdecor/screenshot.png differ diff --git a/mods/xdecor/settingtypes.txt b/mods/xdecor/settingtypes.txt new file mode 100644 index 0000000..0c64b59 --- /dev/null +++ b/mods/xdecor/settingtypes.txt @@ -0,0 +1,31 @@ +# For enabling components of X-Decor-libre. + + + +# This adds a chessboard on which you can play Chess against other players or the computer. +enable_xdecor_chess (Enable Chess) bool true + +# This enables the cauldron which you can use to store water and cook soup. +enable_xdecor_cooking (Enable Cooking) bool true + +# This adds the enchanting table which you can use to upgrade your tools with mese crystals. +enable_xdecor_enchanting (Enable Enchanting) bool true + +# This adds the artificial beehive which produces honey. +enable_xdecor_hive (Enable Hive) bool true + +# This adds itemframes which are used to show off items on a wall. +enable_xdecor_itemframe (Enable Itemframe) bool true + +# This enables the mailbox which allows players to receive gifts from other players. +enable_xdecor_mailbox (Enable Mailbox) bool true + +# This adds mechanisms like the lever and pressure plate which are used to trigger doors. +enable_xdecor_mechanisms (Enable Mechanisms) bool true + +# This adds ropes which can be used for climbing. +enable_xdecor_rope (Enable Rope) bool true + +# This adds the workbench which allows you to craft, store items, cut blocks and repair tools. +# Due to block cutting, many new block shapes become available. +enable_xdecor_workbench (Enable Workbench) bool true diff --git a/mods/xdecor/sounds/xdecor_boiling_water.ogg b/mods/xdecor/sounds/xdecor_boiling_water.ogg new file mode 100644 index 0000000..cc1e7a5 Binary files /dev/null and b/mods/xdecor/sounds/xdecor_boiling_water.ogg differ diff --git a/mods/xdecor/sounds/xdecor_bouncy.ogg b/mods/xdecor/sounds/xdecor_bouncy.ogg new file mode 100644 index 0000000..779e825 Binary files /dev/null and b/mods/xdecor/sounds/xdecor_bouncy.ogg differ diff --git a/mods/xdecor/sounds/xdecor_enchanting.ogg b/mods/xdecor/sounds/xdecor_enchanting.ogg new file mode 100644 index 0000000..81f5e51 Binary files /dev/null and b/mods/xdecor/sounds/xdecor_enchanting.ogg differ diff --git a/mods/xdecor/src/_locale_workbench.lua b/mods/xdecor/src/_locale_workbench.lua new file mode 100644 index 0000000..801d758 --- /dev/null +++ b/mods/xdecor/src/_locale_workbench.lua @@ -0,0 +1,785 @@ +-- This Lua file is not actually meant to be executed. Instead, it contains +-- dummy function calls to NS_CUT() to allow translation scripts to detect the strings +-- for the cut nodes this mod registers by default. +-- This should contain cut nodes for this mod and Minetest Game. +-- It MUST be updated before release when new nodes have arrived. + +-- To update this list, do this: +-- 1. Set `GENERATE_TRANSLATABLE_STRING_LIST` in `src/workbench.lua` to `true` +-- 2. Start Minetest Game with this mod enabled, but not any other mod that registers cut nodes +-- 3. Paste the relevant part of the console output into this file + +-- Note: This needs Luanti 5.14.0 or later to work. + +local NS_CUT = function(s) return end + +-- LIST OF STRINGS BEGINS HERE -- + +NS_CUT("Barrel Stair") +NS_CUT("Barrel Slab") +NS_CUT("Inner Barrel Stair") +NS_CUT("Outer Barrel Stair") +NS_CUT("Barrel Nanoslab") +NS_CUT("Barrel Micropanel") +NS_CUT("Barrel Microslab") +NS_CUT("Barrel Thin Stair") +NS_CUT("Barrel Cube") +NS_CUT("Barrel Panel") +NS_CUT("Barrel Double Panel") +NS_CUT("Barrel Half-Stair") +NS_CUT("Cactus Brick Stair") +NS_CUT("Cactus Brick Slab") +NS_CUT("Inner Cactus Brick Stair") +NS_CUT("Outer Cactus Brick Stair") +NS_CUT("Cactus Brick Nanoslab") +NS_CUT("Cactus Brick Micropanel") +NS_CUT("Cactus Brick Microslab") +NS_CUT("Cactus Brick Thin Stair") +NS_CUT("Cactus Brick Cube") +NS_CUT("Cactus Brick Panel") +NS_CUT("Cactus Brick Double Panel") +NS_CUT("Cactus Brick Half-Stair") +NS_CUT("Coal Stone Tile Stair") +NS_CUT("Coal Stone Tile Slab") +NS_CUT("Inner Coal Stone Tile Stair") +NS_CUT("Outer Coal Stone Tile Stair") +NS_CUT("Coal Stone Tile Nanoslab") +NS_CUT("Coal Stone Tile Micropanel") +NS_CUT("Coal Stone Tile Microslab") +NS_CUT("Coal Stone Tile Thin Stair") +NS_CUT("Coal Stone Tile Cube") +NS_CUT("Coal Stone Tile Panel") +NS_CUT("Coal Stone Tile Double Panel") +NS_CUT("Coal Stone Tile Half-Stair") +NS_CUT("Polished Desert Stone Block Stair") +NS_CUT("Polished Desert Stone Block Slab") +NS_CUT("Inner Polished Desert Stone Block Stair") +NS_CUT("Outer Polished Desert Stone Block Stair") +NS_CUT("Polished Desert Stone Block Nanoslab") +NS_CUT("Polished Desert Stone Block Micropanel") +NS_CUT("Polished Desert Stone Block Microslab") +NS_CUT("Polished Desert Stone Block Thin Stair") +NS_CUT("Polished Desert Stone Block Cube") +NS_CUT("Polished Desert Stone Block Panel") +NS_CUT("Polished Desert Stone Block Double Panel") +NS_CUT("Polished Desert Stone Block Half-Stair") +NS_CUT("Hardened Clay Stair") +NS_CUT("Hardened Clay Slab") +NS_CUT("Inner Hardened Clay Stair") +NS_CUT("Outer Hardened Clay Stair") +NS_CUT("Hardened Clay Nanoslab") +NS_CUT("Hardened Clay Micropanel") +NS_CUT("Hardened Clay Microslab") +NS_CUT("Hardened Clay Thin Stair") +NS_CUT("Hardened Clay Cube") +NS_CUT("Hardened Clay Panel") +NS_CUT("Hardened Clay Double Panel") +NS_CUT("Hardened Clay Half-Stair") +NS_CUT("Moon Brick Stair") +NS_CUT("Moon Brick Slab") +NS_CUT("Inner Moon Brick Stair") +NS_CUT("Outer Moon Brick Stair") +NS_CUT("Moon Brick Nanoslab") +NS_CUT("Moon Brick Micropanel") +NS_CUT("Moon Brick Microslab") +NS_CUT("Moon Brick Thin Stair") +NS_CUT("Moon Brick Cube") +NS_CUT("Moon Brick Panel") +NS_CUT("Moon Brick Double Panel") +NS_CUT("Moon Brick Half-Stair") +NS_CUT("Packed Ice Stair") +NS_CUT("Packed Ice Slab") +NS_CUT("Inner Packed Ice Stair") +NS_CUT("Outer Packed Ice Stair") +NS_CUT("Packed Ice Nanoslab") +NS_CUT("Packed Ice Micropanel") +NS_CUT("Packed Ice Microslab") +NS_CUT("Packed Ice Thin Stair") +NS_CUT("Packed Ice Cube") +NS_CUT("Packed Ice Panel") +NS_CUT("Packed Ice Double Panel") +NS_CUT("Packed Ice Half-Stair") +NS_CUT("Runestone Stair") +NS_CUT("Runestone Slab") +NS_CUT("Inner Runestone Stair") +NS_CUT("Outer Runestone Stair") +NS_CUT("Runestone Nanoslab") +NS_CUT("Runestone Micropanel") +NS_CUT("Runestone Microslab") +NS_CUT("Runestone Thin Stair") +NS_CUT("Runestone Cube") +NS_CUT("Runestone Panel") +NS_CUT("Runestone Double Panel") +NS_CUT("Runestone Half-Stair") +NS_CUT("Polished Stone Block Stair") +NS_CUT("Polished Stone Block Slab") +NS_CUT("Inner Polished Stone Block Stair") +NS_CUT("Outer Polished Stone Block Stair") +NS_CUT("Polished Stone Block Nanoslab") +NS_CUT("Polished Stone Block Micropanel") +NS_CUT("Polished Stone Block Microslab") +NS_CUT("Polished Stone Block Thin Stair") +NS_CUT("Polished Stone Block Cube") +NS_CUT("Polished Stone Block Panel") +NS_CUT("Polished Stone Block Double Panel") +NS_CUT("Polished Stone Block Half-Stair") +NS_CUT("Wooden Tile Stair") +NS_CUT("Wooden Tile Slab") +NS_CUT("Inner Wooden Tile Stair") +NS_CUT("Outer Wooden Tile Stair") +NS_CUT("Wooden Tile Nanoslab") +NS_CUT("Wooden Tile Micropanel") +NS_CUT("Wooden Tile Microslab") +NS_CUT("Wooden Tile Thin Stair") +NS_CUT("Wooden Tile Cube") +NS_CUT("Wooden Tile Panel") +NS_CUT("Wooden Tile Double Panel") +NS_CUT("Wooden Tile Half-Stair") +NS_CUT("Wood Framed Glass Stair") +NS_CUT("Inner Wood Framed Glass Stair") +NS_CUT("Outer Wood Framed Glass Stair") +NS_CUT("Wood Framed Glass Slab") +NS_CUT("Wood Framed Glass Nanoslab") +NS_CUT("Wood Framed Glass Micropanel") +NS_CUT("Wood Framed Glass Microslab") +NS_CUT("Wood Framed Glass Thin Stair") +NS_CUT("Wood Framed Glass Cube") +NS_CUT("Wood Framed Glass Panel") +NS_CUT("Wood Framed Glass Double Panel") +NS_CUT("Wood Framed Glass Half-Stair") +NS_CUT("Acacia Tree Stair") +NS_CUT("Acacia Tree Slab") +NS_CUT("Inner Acacia Tree Stair") +NS_CUT("Outer Acacia Tree Stair") +NS_CUT("Acacia Tree Nanoslab") +NS_CUT("Acacia Tree Micropanel") +NS_CUT("Acacia Tree Microslab") +NS_CUT("Acacia Tree Thin Stair") +NS_CUT("Acacia Tree Cube") +NS_CUT("Acacia Tree Panel") +NS_CUT("Acacia Tree Double Panel") +NS_CUT("Acacia Tree Half-Stair") +NS_CUT("Acacia Wood Planks Nanoslab") +NS_CUT("Acacia Wood Planks Micropanel") +NS_CUT("Acacia Wood Planks Microslab") +NS_CUT("Acacia Wood Planks Thin Stair") +NS_CUT("Acacia Wood Planks Cube") +NS_CUT("Acacia Wood Planks Panel") +NS_CUT("Acacia Wood Planks Double Panel") +NS_CUT("Acacia Wood Planks Half-Stair") +NS_CUT("Aspen Tree Stair") +NS_CUT("Aspen Tree Slab") +NS_CUT("Inner Aspen Tree Stair") +NS_CUT("Outer Aspen Tree Stair") +NS_CUT("Aspen Tree Nanoslab") +NS_CUT("Aspen Tree Micropanel") +NS_CUT("Aspen Tree Microslab") +NS_CUT("Aspen Tree Thin Stair") +NS_CUT("Aspen Tree Cube") +NS_CUT("Aspen Tree Panel") +NS_CUT("Aspen Tree Double Panel") +NS_CUT("Aspen Tree Half-Stair") +NS_CUT("Aspen Wood Planks Nanoslab") +NS_CUT("Aspen Wood Planks Micropanel") +NS_CUT("Aspen Wood Planks Microslab") +NS_CUT("Aspen Wood Planks Thin Stair") +NS_CUT("Aspen Wood Planks Cube") +NS_CUT("Aspen Wood Planks Panel") +NS_CUT("Aspen Wood Planks Double Panel") +NS_CUT("Aspen Wood Planks Half-Stair") +NS_CUT("Brick Block Nanoslab") +NS_CUT("Brick Block Micropanel") +NS_CUT("Brick Block Microslab") +NS_CUT("Brick Block Thin Stair") +NS_CUT("Brick Block Cube") +NS_CUT("Brick Block Panel") +NS_CUT("Brick Block Double Panel") +NS_CUT("Brick Block Half-Stair") +NS_CUT("Bronze Block Nanoslab") +NS_CUT("Bronze Block Micropanel") +NS_CUT("Bronze Block Microslab") +NS_CUT("Bronze Block Thin Stair") +NS_CUT("Bronze Block Cube") +NS_CUT("Bronze Block Panel") +NS_CUT("Bronze Block Double Panel") +NS_CUT("Bronze Block Half-Stair") +NS_CUT("Cactus Stair") +NS_CUT("Cactus Slab") +NS_CUT("Inner Cactus Stair") +NS_CUT("Outer Cactus Stair") +NS_CUT("Cactus Nanoslab") +NS_CUT("Cactus Micropanel") +NS_CUT("Cactus Microslab") +NS_CUT("Cactus Thin Stair") +NS_CUT("Cactus Cube") +NS_CUT("Cactus Panel") +NS_CUT("Cactus Double Panel") +NS_CUT("Cactus Half-Stair") +NS_CUT("Coal Block Stair") +NS_CUT("Coal Block Slab") +NS_CUT("Inner Coal Block Stair") +NS_CUT("Outer Coal Block Stair") +NS_CUT("Coal Block Nanoslab") +NS_CUT("Coal Block Micropanel") +NS_CUT("Coal Block Microslab") +NS_CUT("Coal Block Thin Stair") +NS_CUT("Coal Block Cube") +NS_CUT("Coal Block Panel") +NS_CUT("Coal Block Double Panel") +NS_CUT("Coal Block Half-Stair") +NS_CUT("Cobblestone Nanoslab") +NS_CUT("Cobblestone Micropanel") +NS_CUT("Cobblestone Microslab") +NS_CUT("Cobblestone Thin Stair") +NS_CUT("Cobblestone Cube") +NS_CUT("Cobblestone Panel") +NS_CUT("Cobblestone Double Panel") +NS_CUT("Cobblestone Half-Stair") +NS_CUT("Copper Block Nanoslab") +NS_CUT("Copper Block Micropanel") +NS_CUT("Copper Block Microslab") +NS_CUT("Copper Block Thin Stair") +NS_CUT("Copper Block Cube") +NS_CUT("Copper Block Panel") +NS_CUT("Copper Block Double Panel") +NS_CUT("Copper Block Half-Stair") +NS_CUT("Brown Coral Stair") +NS_CUT("Brown Coral Slab") +NS_CUT("Inner Brown Coral Stair") +NS_CUT("Outer Brown Coral Stair") +NS_CUT("Brown Coral Nanoslab") +NS_CUT("Brown Coral Micropanel") +NS_CUT("Brown Coral Microslab") +NS_CUT("Brown Coral Thin Stair") +NS_CUT("Brown Coral Cube") +NS_CUT("Brown Coral Panel") +NS_CUT("Brown Coral Double Panel") +NS_CUT("Brown Coral Half-Stair") +NS_CUT("Orange Coral Stair") +NS_CUT("Orange Coral Slab") +NS_CUT("Inner Orange Coral Stair") +NS_CUT("Outer Orange Coral Stair") +NS_CUT("Orange Coral Nanoslab") +NS_CUT("Orange Coral Micropanel") +NS_CUT("Orange Coral Microslab") +NS_CUT("Orange Coral Thin Stair") +NS_CUT("Orange Coral Cube") +NS_CUT("Orange Coral Panel") +NS_CUT("Orange Coral Double Panel") +NS_CUT("Orange Coral Half-Stair") +NS_CUT("Coral Skeleton Stair") +NS_CUT("Coral Skeleton Slab") +NS_CUT("Inner Coral Skeleton Stair") +NS_CUT("Outer Coral Skeleton Stair") +NS_CUT("Coral Skeleton Nanoslab") +NS_CUT("Coral Skeleton Micropanel") +NS_CUT("Coral Skeleton Microslab") +NS_CUT("Coral Skeleton Thin Stair") +NS_CUT("Coral Skeleton Cube") +NS_CUT("Coral Skeleton Panel") +NS_CUT("Coral Skeleton Double Panel") +NS_CUT("Coral Skeleton Half-Stair") +NS_CUT("Desert Cobblestone Nanoslab") +NS_CUT("Desert Cobblestone Micropanel") +NS_CUT("Desert Cobblestone Microslab") +NS_CUT("Desert Cobblestone Thin Stair") +NS_CUT("Desert Cobblestone Cube") +NS_CUT("Desert Cobblestone Panel") +NS_CUT("Desert Cobblestone Double Panel") +NS_CUT("Desert Cobblestone Half-Stair") +NS_CUT("Desert Sandstone Nanoslab") +NS_CUT("Desert Sandstone Micropanel") +NS_CUT("Desert Sandstone Microslab") +NS_CUT("Desert Sandstone Thin Stair") +NS_CUT("Desert Sandstone Cube") +NS_CUT("Desert Sandstone Panel") +NS_CUT("Desert Sandstone Double Panel") +NS_CUT("Desert Sandstone Half-Stair") +NS_CUT("Desert Sandstone Block Nanoslab") +NS_CUT("Desert Sandstone Block Micropanel") +NS_CUT("Desert Sandstone Block Microslab") +NS_CUT("Desert Sandstone Block Thin Stair") +NS_CUT("Desert Sandstone Block Cube") +NS_CUT("Desert Sandstone Block Panel") +NS_CUT("Desert Sandstone Block Double Panel") +NS_CUT("Desert Sandstone Block Half-Stair") +NS_CUT("Desert Sandstone Brick Nanoslab") +NS_CUT("Desert Sandstone Brick Micropanel") +NS_CUT("Desert Sandstone Brick Microslab") +NS_CUT("Desert Sandstone Brick Thin Stair") +NS_CUT("Desert Sandstone Brick Cube") +NS_CUT("Desert Sandstone Brick Panel") +NS_CUT("Desert Sandstone Brick Double Panel") +NS_CUT("Desert Sandstone Brick Half-Stair") +NS_CUT("Desert Stone Nanoslab") +NS_CUT("Desert Stone Micropanel") +NS_CUT("Desert Stone Microslab") +NS_CUT("Desert Stone Thin Stair") +NS_CUT("Desert Stone Cube") +NS_CUT("Desert Stone Panel") +NS_CUT("Desert Stone Double Panel") +NS_CUT("Desert Stone Half-Stair") +NS_CUT("Desert Stone Block Nanoslab") +NS_CUT("Desert Stone Block Micropanel") +NS_CUT("Desert Stone Block Microslab") +NS_CUT("Desert Stone Block Thin Stair") +NS_CUT("Desert Stone Block Cube") +NS_CUT("Desert Stone Block Panel") +NS_CUT("Desert Stone Block Double Panel") +NS_CUT("Desert Stone Block Half-Stair") +NS_CUT("Desert Stone Brick Nanoslab") +NS_CUT("Desert Stone Brick Micropanel") +NS_CUT("Desert Stone Brick Microslab") +NS_CUT("Desert Stone Brick Thin Stair") +NS_CUT("Desert Stone Brick Cube") +NS_CUT("Desert Stone Brick Panel") +NS_CUT("Desert Stone Brick Double Panel") +NS_CUT("Desert Stone Brick Half-Stair") +NS_CUT("Diamond Block Stair") +NS_CUT("Diamond Block Slab") +NS_CUT("Inner Diamond Block Stair") +NS_CUT("Outer Diamond Block Stair") +NS_CUT("Diamond Block Nanoslab") +NS_CUT("Diamond Block Micropanel") +NS_CUT("Diamond Block Microslab") +NS_CUT("Diamond Block Thin Stair") +NS_CUT("Diamond Block Cube") +NS_CUT("Diamond Block Panel") +NS_CUT("Diamond Block Double Panel") +NS_CUT("Diamond Block Half-Stair") +NS_CUT("Glass Nanoslab") +NS_CUT("Glass Micropanel") +NS_CUT("Glass Microslab") +NS_CUT("Glass Thin Stair") +NS_CUT("Glass Cube") +NS_CUT("Glass Panel") +NS_CUT("Glass Double Panel") +NS_CUT("Glass Half-Stair") +NS_CUT("Gold Block Nanoslab") +NS_CUT("Gold Block Micropanel") +NS_CUT("Gold Block Microslab") +NS_CUT("Gold Block Thin Stair") +NS_CUT("Gold Block Cube") +NS_CUT("Gold Block Panel") +NS_CUT("Gold Block Double Panel") +NS_CUT("Gold Block Half-Stair") +NS_CUT("Ice Nanoslab") +NS_CUT("Ice Micropanel") +NS_CUT("Ice Microslab") +NS_CUT("Ice Thin Stair") +NS_CUT("Ice Cube") +NS_CUT("Ice Panel") +NS_CUT("Ice Double Panel") +NS_CUT("Ice Half-Stair") +NS_CUT("Jungle Tree Stair") +NS_CUT("Jungle Tree Slab") +NS_CUT("Inner Jungle Tree Stair") +NS_CUT("Outer Jungle Tree Stair") +NS_CUT("Jungle Tree Nanoslab") +NS_CUT("Jungle Tree Micropanel") +NS_CUT("Jungle Tree Microslab") +NS_CUT("Jungle Tree Thin Stair") +NS_CUT("Jungle Tree Cube") +NS_CUT("Jungle Tree Panel") +NS_CUT("Jungle Tree Double Panel") +NS_CUT("Jungle Tree Half-Stair") +NS_CUT("Jungle Wood Planks Nanoslab") +NS_CUT("Jungle Wood Planks Micropanel") +NS_CUT("Jungle Wood Planks Microslab") +NS_CUT("Jungle Wood Planks Thin Stair") +NS_CUT("Jungle Wood Planks Cube") +NS_CUT("Jungle Wood Planks Panel") +NS_CUT("Jungle Wood Planks Double Panel") +NS_CUT("Jungle Wood Planks Half-Stair") +NS_CUT("Mossy Cobblestone Nanoslab") +NS_CUT("Mossy Cobblestone Micropanel") +NS_CUT("Mossy Cobblestone Microslab") +NS_CUT("Mossy Cobblestone Thin Stair") +NS_CUT("Mossy Cobblestone Cube") +NS_CUT("Mossy Cobblestone Panel") +NS_CUT("Mossy Cobblestone Double Panel") +NS_CUT("Mossy Cobblestone Half-Stair") +NS_CUT("Obsidian Nanoslab") +NS_CUT("Obsidian Micropanel") +NS_CUT("Obsidian Microslab") +NS_CUT("Obsidian Thin Stair") +NS_CUT("Obsidian Cube") +NS_CUT("Obsidian Panel") +NS_CUT("Obsidian Double Panel") +NS_CUT("Obsidian Half-Stair") +NS_CUT("Obsidian Block Nanoslab") +NS_CUT("Obsidian Block Micropanel") +NS_CUT("Obsidian Block Microslab") +NS_CUT("Obsidian Block Thin Stair") +NS_CUT("Obsidian Block Cube") +NS_CUT("Obsidian Block Panel") +NS_CUT("Obsidian Block Double Panel") +NS_CUT("Obsidian Block Half-Stair") +NS_CUT("Obsidian Glass Nanoslab") +NS_CUT("Obsidian Glass Micropanel") +NS_CUT("Obsidian Glass Microslab") +NS_CUT("Obsidian Glass Thin Stair") +NS_CUT("Obsidian Glass Cube") +NS_CUT("Obsidian Glass Panel") +NS_CUT("Obsidian Glass Double Panel") +NS_CUT("Obsidian Glass Half-Stair") +NS_CUT("Obsidian Brick Nanoslab") +NS_CUT("Obsidian Brick Micropanel") +NS_CUT("Obsidian Brick Microslab") +NS_CUT("Obsidian Brick Thin Stair") +NS_CUT("Obsidian Brick Cube") +NS_CUT("Obsidian Brick Panel") +NS_CUT("Obsidian Brick Double Panel") +NS_CUT("Obsidian Brick Half-Stair") +NS_CUT("Permafrost Stair") +NS_CUT("Permafrost Slab") +NS_CUT("Inner Permafrost Stair") +NS_CUT("Outer Permafrost Stair") +NS_CUT("Permafrost Nanoslab") +NS_CUT("Permafrost Micropanel") +NS_CUT("Permafrost Microslab") +NS_CUT("Permafrost Thin Stair") +NS_CUT("Permafrost Cube") +NS_CUT("Permafrost Panel") +NS_CUT("Permafrost Double Panel") +NS_CUT("Permafrost Half-Stair") +NS_CUT("Permafrost with Moss Stair") +NS_CUT("Inner Permafrost with Moss Stair") +NS_CUT("Outer Permafrost with Moss Stair") +NS_CUT("Permafrost with Moss Slab") +NS_CUT("Permafrost with Moss Nanoslab") +NS_CUT("Permafrost with Moss Micropanel") +NS_CUT("Permafrost with Moss Microslab") +NS_CUT("Permafrost with Moss Thin Stair") +NS_CUT("Permafrost with Moss Cube") +NS_CUT("Permafrost with Moss Panel") +NS_CUT("Permafrost with Moss Double Panel") +NS_CUT("Permafrost with Moss Half-Stair") +NS_CUT("Permafrost with Stones Stair") +NS_CUT("Inner Permafrost with Stones Stair") +NS_CUT("Outer Permafrost with Stones Stair") +NS_CUT("Permafrost with Stones Slab") +NS_CUT("Permafrost with Stones Nanoslab") +NS_CUT("Permafrost with Stones Micropanel") +NS_CUT("Permafrost with Stones Microslab") +NS_CUT("Permafrost with Stones Thin Stair") +NS_CUT("Permafrost with Stones Cube") +NS_CUT("Permafrost with Stones Panel") +NS_CUT("Permafrost with Stones Double Panel") +NS_CUT("Permafrost with Stones Half-Stair") +NS_CUT("Pine Tree Stair") +NS_CUT("Pine Tree Slab") +NS_CUT("Inner Pine Tree Stair") +NS_CUT("Outer Pine Tree Stair") +NS_CUT("Pine Tree Nanoslab") +NS_CUT("Pine Tree Micropanel") +NS_CUT("Pine Tree Microslab") +NS_CUT("Pine Tree Thin Stair") +NS_CUT("Pine Tree Cube") +NS_CUT("Pine Tree Panel") +NS_CUT("Pine Tree Double Panel") +NS_CUT("Pine Tree Half-Stair") +NS_CUT("Pine Wood Planks Nanoslab") +NS_CUT("Pine Wood Planks Micropanel") +NS_CUT("Pine Wood Planks Microslab") +NS_CUT("Pine Wood Planks Thin Stair") +NS_CUT("Pine Wood Planks Cube") +NS_CUT("Pine Wood Planks Panel") +NS_CUT("Pine Wood Planks Double Panel") +NS_CUT("Pine Wood Planks Half-Stair") +NS_CUT("Sandstone Nanoslab") +NS_CUT("Sandstone Micropanel") +NS_CUT("Sandstone Microslab") +NS_CUT("Sandstone Thin Stair") +NS_CUT("Sandstone Cube") +NS_CUT("Sandstone Panel") +NS_CUT("Sandstone Double Panel") +NS_CUT("Sandstone Half-Stair") +NS_CUT("Sandstone Block Nanoslab") +NS_CUT("Sandstone Block Micropanel") +NS_CUT("Sandstone Block Microslab") +NS_CUT("Sandstone Block Thin Stair") +NS_CUT("Sandstone Block Cube") +NS_CUT("Sandstone Block Panel") +NS_CUT("Sandstone Block Double Panel") +NS_CUT("Sandstone Block Half-Stair") +NS_CUT("Sandstone Brick Nanoslab") +NS_CUT("Sandstone Brick Micropanel") +NS_CUT("Sandstone Brick Microslab") +NS_CUT("Sandstone Brick Thin Stair") +NS_CUT("Sandstone Brick Cube") +NS_CUT("Sandstone Brick Panel") +NS_CUT("Sandstone Brick Double Panel") +NS_CUT("Sandstone Brick Half-Stair") +NS_CUT("Silver Sandstone Nanoslab") +NS_CUT("Silver Sandstone Micropanel") +NS_CUT("Silver Sandstone Microslab") +NS_CUT("Silver Sandstone Thin Stair") +NS_CUT("Silver Sandstone Cube") +NS_CUT("Silver Sandstone Panel") +NS_CUT("Silver Sandstone Double Panel") +NS_CUT("Silver Sandstone Half-Stair") +NS_CUT("Silver Sandstone Block Nanoslab") +NS_CUT("Silver Sandstone Block Micropanel") +NS_CUT("Silver Sandstone Block Microslab") +NS_CUT("Silver Sandstone Block Thin Stair") +NS_CUT("Silver Sandstone Block Cube") +NS_CUT("Silver Sandstone Block Panel") +NS_CUT("Silver Sandstone Block Double Panel") +NS_CUT("Silver Sandstone Block Half-Stair") +NS_CUT("Silver Sandstone Brick Nanoslab") +NS_CUT("Silver Sandstone Brick Micropanel") +NS_CUT("Silver Sandstone Brick Microslab") +NS_CUT("Silver Sandstone Brick Thin Stair") +NS_CUT("Silver Sandstone Brick Cube") +NS_CUT("Silver Sandstone Brick Panel") +NS_CUT("Silver Sandstone Brick Double Panel") +NS_CUT("Silver Sandstone Brick Half-Stair") +NS_CUT("Steel Block Nanoslab") +NS_CUT("Steel Block Micropanel") +NS_CUT("Steel Block Microslab") +NS_CUT("Steel Block Thin Stair") +NS_CUT("Steel Block Cube") +NS_CUT("Steel Block Panel") +NS_CUT("Steel Block Double Panel") +NS_CUT("Steel Block Half-Stair") +NS_CUT("Stone Nanoslab") +NS_CUT("Stone Micropanel") +NS_CUT("Stone Microslab") +NS_CUT("Stone Thin Stair") +NS_CUT("Stone Cube") +NS_CUT("Stone Panel") +NS_CUT("Stone Double Panel") +NS_CUT("Stone Half-Stair") +NS_CUT("Stone Block Nanoslab") +NS_CUT("Stone Block Micropanel") +NS_CUT("Stone Block Microslab") +NS_CUT("Stone Block Thin Stair") +NS_CUT("Stone Block Cube") +NS_CUT("Stone Block Panel") +NS_CUT("Stone Block Double Panel") +NS_CUT("Stone Block Half-Stair") +NS_CUT("Stone Brick Nanoslab") +NS_CUT("Stone Brick Micropanel") +NS_CUT("Stone Brick Microslab") +NS_CUT("Stone Brick Thin Stair") +NS_CUT("Stone Brick Cube") +NS_CUT("Stone Brick Panel") +NS_CUT("Stone Brick Double Panel") +NS_CUT("Stone Brick Half-Stair") +NS_CUT("Tin Block Nanoslab") +NS_CUT("Tin Block Micropanel") +NS_CUT("Tin Block Microslab") +NS_CUT("Tin Block Thin Stair") +NS_CUT("Tin Block Cube") +NS_CUT("Tin Block Panel") +NS_CUT("Tin Block Double Panel") +NS_CUT("Tin Block Half-Stair") +NS_CUT("Apple Tree Stair") +NS_CUT("Apple Tree Slab") +NS_CUT("Inner Apple Tree Stair") +NS_CUT("Outer Apple Tree Stair") +NS_CUT("Apple Tree Nanoslab") +NS_CUT("Apple Tree Micropanel") +NS_CUT("Apple Tree Microslab") +NS_CUT("Apple Tree Thin Stair") +NS_CUT("Apple Tree Cube") +NS_CUT("Apple Tree Panel") +NS_CUT("Apple Tree Double Panel") +NS_CUT("Apple Tree Half-Stair") +NS_CUT("Apple Wood Planks Nanoslab") +NS_CUT("Apple Wood Planks Micropanel") +NS_CUT("Apple Wood Planks Microslab") +NS_CUT("Apple Wood Planks Thin Stair") +NS_CUT("Apple Wood Planks Cube") +NS_CUT("Apple Wood Planks Panel") +NS_CUT("Apple Wood Planks Double Panel") +NS_CUT("Apple Wood Planks Half-Stair") +NS_CUT("Straw Nanoslab") +NS_CUT("Straw Micropanel") +NS_CUT("Straw Microslab") +NS_CUT("Straw Thin Stair") +NS_CUT("Straw Cube") +NS_CUT("Straw Panel") +NS_CUT("Straw Double Panel") +NS_CUT("Straw Half-Stair") +NS_CUT("Black Wool Stair") +NS_CUT("Black Wool Slab") +NS_CUT("Inner Black Wool Stair") +NS_CUT("Outer Black Wool Stair") +NS_CUT("Black Wool Nanoslab") +NS_CUT("Black Wool Micropanel") +NS_CUT("Black Wool Microslab") +NS_CUT("Black Wool Thin Stair") +NS_CUT("Black Wool Cube") +NS_CUT("Black Wool Panel") +NS_CUT("Black Wool Double Panel") +NS_CUT("Black Wool Half-Stair") +NS_CUT("Blue Wool Stair") +NS_CUT("Blue Wool Slab") +NS_CUT("Inner Blue Wool Stair") +NS_CUT("Outer Blue Wool Stair") +NS_CUT("Blue Wool Nanoslab") +NS_CUT("Blue Wool Micropanel") +NS_CUT("Blue Wool Microslab") +NS_CUT("Blue Wool Thin Stair") +NS_CUT("Blue Wool Cube") +NS_CUT("Blue Wool Panel") +NS_CUT("Blue Wool Double Panel") +NS_CUT("Blue Wool Half-Stair") +NS_CUT("Brown Wool Stair") +NS_CUT("Brown Wool Slab") +NS_CUT("Inner Brown Wool Stair") +NS_CUT("Outer Brown Wool Stair") +NS_CUT("Brown Wool Nanoslab") +NS_CUT("Brown Wool Micropanel") +NS_CUT("Brown Wool Microslab") +NS_CUT("Brown Wool Thin Stair") +NS_CUT("Brown Wool Cube") +NS_CUT("Brown Wool Panel") +NS_CUT("Brown Wool Double Panel") +NS_CUT("Brown Wool Half-Stair") +NS_CUT("Cyan Wool Stair") +NS_CUT("Cyan Wool Slab") +NS_CUT("Inner Cyan Wool Stair") +NS_CUT("Outer Cyan Wool Stair") +NS_CUT("Cyan Wool Nanoslab") +NS_CUT("Cyan Wool Micropanel") +NS_CUT("Cyan Wool Microslab") +NS_CUT("Cyan Wool Thin Stair") +NS_CUT("Cyan Wool Cube") +NS_CUT("Cyan Wool Panel") +NS_CUT("Cyan Wool Double Panel") +NS_CUT("Cyan Wool Half-Stair") +NS_CUT("Dark Green Wool Stair") +NS_CUT("Dark Green Wool Slab") +NS_CUT("Inner Dark Green Wool Stair") +NS_CUT("Outer Dark Green Wool Stair") +NS_CUT("Dark Green Wool Nanoslab") +NS_CUT("Dark Green Wool Micropanel") +NS_CUT("Dark Green Wool Microslab") +NS_CUT("Dark Green Wool Thin Stair") +NS_CUT("Dark Green Wool Cube") +NS_CUT("Dark Green Wool Panel") +NS_CUT("Dark Green Wool Double Panel") +NS_CUT("Dark Green Wool Half-Stair") +NS_CUT("Dark Grey Wool Stair") +NS_CUT("Dark Grey Wool Slab") +NS_CUT("Inner Dark Grey Wool Stair") +NS_CUT("Outer Dark Grey Wool Stair") +NS_CUT("Dark Grey Wool Nanoslab") +NS_CUT("Dark Grey Wool Micropanel") +NS_CUT("Dark Grey Wool Microslab") +NS_CUT("Dark Grey Wool Thin Stair") +NS_CUT("Dark Grey Wool Cube") +NS_CUT("Dark Grey Wool Panel") +NS_CUT("Dark Grey Wool Double Panel") +NS_CUT("Dark Grey Wool Half-Stair") +NS_CUT("Green Wool Stair") +NS_CUT("Green Wool Slab") +NS_CUT("Inner Green Wool Stair") +NS_CUT("Outer Green Wool Stair") +NS_CUT("Green Wool Nanoslab") +NS_CUT("Green Wool Micropanel") +NS_CUT("Green Wool Microslab") +NS_CUT("Green Wool Thin Stair") +NS_CUT("Green Wool Cube") +NS_CUT("Green Wool Panel") +NS_CUT("Green Wool Double Panel") +NS_CUT("Green Wool Half-Stair") +NS_CUT("Grey Wool Stair") +NS_CUT("Grey Wool Slab") +NS_CUT("Inner Grey Wool Stair") +NS_CUT("Outer Grey Wool Stair") +NS_CUT("Grey Wool Nanoslab") +NS_CUT("Grey Wool Micropanel") +NS_CUT("Grey Wool Microslab") +NS_CUT("Grey Wool Thin Stair") +NS_CUT("Grey Wool Cube") +NS_CUT("Grey Wool Panel") +NS_CUT("Grey Wool Double Panel") +NS_CUT("Grey Wool Half-Stair") +NS_CUT("Magenta Wool Stair") +NS_CUT("Magenta Wool Slab") +NS_CUT("Inner Magenta Wool Stair") +NS_CUT("Outer Magenta Wool Stair") +NS_CUT("Magenta Wool Nanoslab") +NS_CUT("Magenta Wool Micropanel") +NS_CUT("Magenta Wool Microslab") +NS_CUT("Magenta Wool Thin Stair") +NS_CUT("Magenta Wool Cube") +NS_CUT("Magenta Wool Panel") +NS_CUT("Magenta Wool Double Panel") +NS_CUT("Magenta Wool Half-Stair") +NS_CUT("Orange Wool Stair") +NS_CUT("Orange Wool Slab") +NS_CUT("Inner Orange Wool Stair") +NS_CUT("Outer Orange Wool Stair") +NS_CUT("Orange Wool Nanoslab") +NS_CUT("Orange Wool Micropanel") +NS_CUT("Orange Wool Microslab") +NS_CUT("Orange Wool Thin Stair") +NS_CUT("Orange Wool Cube") +NS_CUT("Orange Wool Panel") +NS_CUT("Orange Wool Double Panel") +NS_CUT("Orange Wool Half-Stair") +NS_CUT("Pink Wool Stair") +NS_CUT("Pink Wool Slab") +NS_CUT("Inner Pink Wool Stair") +NS_CUT("Outer Pink Wool Stair") +NS_CUT("Pink Wool Nanoslab") +NS_CUT("Pink Wool Micropanel") +NS_CUT("Pink Wool Microslab") +NS_CUT("Pink Wool Thin Stair") +NS_CUT("Pink Wool Cube") +NS_CUT("Pink Wool Panel") +NS_CUT("Pink Wool Double Panel") +NS_CUT("Pink Wool Half-Stair") +NS_CUT("Red Wool Stair") +NS_CUT("Red Wool Slab") +NS_CUT("Inner Red Wool Stair") +NS_CUT("Outer Red Wool Stair") +NS_CUT("Red Wool Nanoslab") +NS_CUT("Red Wool Micropanel") +NS_CUT("Red Wool Microslab") +NS_CUT("Red Wool Thin Stair") +NS_CUT("Red Wool Cube") +NS_CUT("Red Wool Panel") +NS_CUT("Red Wool Double Panel") +NS_CUT("Red Wool Half-Stair") +NS_CUT("Violet Wool Stair") +NS_CUT("Violet Wool Slab") +NS_CUT("Inner Violet Wool Stair") +NS_CUT("Outer Violet Wool Stair") +NS_CUT("Violet Wool Nanoslab") +NS_CUT("Violet Wool Micropanel") +NS_CUT("Violet Wool Microslab") +NS_CUT("Violet Wool Thin Stair") +NS_CUT("Violet Wool Cube") +NS_CUT("Violet Wool Panel") +NS_CUT("Violet Wool Double Panel") +NS_CUT("Violet Wool Half-Stair") +NS_CUT("White Wool Stair") +NS_CUT("White Wool Slab") +NS_CUT("Inner White Wool Stair") +NS_CUT("Outer White Wool Stair") +NS_CUT("White Wool Nanoslab") +NS_CUT("White Wool Micropanel") +NS_CUT("White Wool Microslab") +NS_CUT("White Wool Thin Stair") +NS_CUT("White Wool Cube") +NS_CUT("White Wool Panel") +NS_CUT("White Wool Double Panel") +NS_CUT("White Wool Half-Stair") +NS_CUT("Yellow Wool Stair") +NS_CUT("Yellow Wool Slab") +NS_CUT("Inner Yellow Wool Stair") +NS_CUT("Outer Yellow Wool Stair") +NS_CUT("Yellow Wool Nanoslab") +NS_CUT("Yellow Wool Micropanel") +NS_CUT("Yellow Wool Microslab") +NS_CUT("Yellow Wool Thin Stair") +NS_CUT("Yellow Wool Cube") +NS_CUT("Yellow Wool Panel") +NS_CUT("Yellow Wool Double Panel") +NS_CUT("Yellow Wool Half-Stair") diff --git a/mods/xdecor/src/chess.lua b/mods/xdecor/src/chess.lua new file mode 100644 index 0000000..5754ced --- /dev/null +++ b/mods/xdecor/src/chess.lua @@ -0,0 +1,3911 @@ +-- Init stuff +if minetest.get_modpath("realchess") ~= nil then + -- If the 'realchess' mod was found, don't use any of this mod's Chess code + minetest.log("action", "[xdecor] 'realchess' mod detected. Disabling X-Decor-libre's Chess module in favor of realchess") + return +end + +-- For making some functions available for the chessbot. +-- It is NOT recommended to use the public chess function outside of this mod! +xdecor.chess = {} + +local realchess = xdecor.chess -- just an alias + +-- Load chessbot code (framework only) +local chessbot = dofile(minetest.get_modpath(minetest.get_current_modname()).."/src/chessbot.lua") + +screwdriver = screwdriver or {} + +-- Translation init +local S = minetest.get_translator("xdecor") +local NS = function(s) return s end +local FS = function(...) return minetest.formspec_escape(S(...)) end + +-- Chess games are disabled because they are currently too broken. +-- Set this to true to enable this again and try your luck. +local ENABLE_CHESS_GAMES = true + +-- If true, will show some hidden state for debugging purposes +-- and enables a "Bot vs Bot" gamemode for testing the bot +local CHESS_DEBUG = false + +-- Number of consecutive halfmoves in which no pawn was moved +-- and no piece was captured after which a player can claim a draw. +local DRAWCLAIM_LONGGAME_PLAYER = 100 -- 50-move rule +-- Number of consecutive halfmoves in which no pawn was moved +-- and no piece was captured after which the game draw automatically. +local DRAWCLAIM_LONGGAME_FORCE = 150 -- 75-move rule + +-- Piece types expressed as numbers. +-- Used for chess_piece group. +local PIECE_PAWN = 1 +local PIECE_ROOK = 2 +local PIECE_KNIGHT = 3 +local PIECE_BISHOP = 4 +local PIECE_QUEEN = 5 +local PIECE_KING = 6 +local PIECE_TYPES = 6 -- number of piece types above + +function realchess.get_piece_letter_color(letter) + if letter == "." then + return nil + else + local byte = string.byte(letter) + if not byte then + return nil + -- uppercase letter A-Z + elseif byte >= 0x41 and byte <= 0x5A then + return "white" + -- lowercase letter a-z + elseif byte >= 0x61 and byte <= 0x7A then + return "black" + else + return nil + end + end +end +function realchess.get_piece_letter_type(letter) + local ll = string.lower(letter) + if ll == "p" then + return "pawn" + elseif ll == "r" then + return "rook" + elseif ll == "n" then + return "knight" + elseif ll == "b" then + return "bishop" + elseif ll == "q" then + return "queen" + elseif ll == "k" then + return "king" + else + return nil + end +end + +-- Takes an itemname and if it's a chess piece of this mod, +-- returns its color. "black" or "white". +-- Returns nil if not a chess piece. +function realchess.get_piece_color(itemname) + local g = minetest.get_item_group(itemname, "chess_piece") + if g > 0 then + return "white" + elseif g < 0 then + return "black" + else + return nil + end +end + +-- Takes an itemname and if it's a chess piece of this mod, +-- returns its type as a string ("pawn", "rook", etc.). +-- Returns nil if not a chess piece. +function realchess.get_piece_type(itemname) + local g = minetest.get_item_group(itemname, "chess_piece") + if g == 0 then + return nil + end + g = math.abs(g) + if g == PIECE_PAWN then + return "pawn" + elseif g == PIECE_ROOK then + return "rook" + elseif g == PIECE_KNIGHT then + return "knight" + elseif g == PIECE_BISHOP then + return "bishop" + elseif g == PIECE_QUEEN then + return "queen" + elseif g == PIECE_KING then + return "king" + else + return nil + end +end + +-- Timeout in seconds to allow resetting the game or digging the chessboard. +-- If no move was made for this time, everyone can reset the game +-- and remove the chessboard. +local TIMEOUT = 300 + +local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false + +-- Returns the player name for the given player color. +-- In case of a bot player, will return a translated +-- bot name. +local function get_display_player_name(meta, playerColor) + local botColor = meta:get_string("botColor") + local displayName + if playerColor == botColor and (botColor == "white" or botColor == "black") then + return "*"..S(chessbot.name).."*" + elseif botColor == "both" then + return "*"..S(chessbot.name).."*" + elseif playerColor == "white" then + return meta:get_string("playerWhite") + elseif playerColor == "black" then + return meta:get_string("playerBlack") + else + return "" + end +end + +local function index_to_xy(idx) + if not idx then + return nil + end + + idx = idx - 1 + + local x = idx % 8 + local y = math.floor((idx - x) / 8) + + return x, y +end + +local function xy_to_index(x, y) + return x + y * 8 + 1 +end + +local function get_square(a, b) + return (a * 8) - (8 - b) +end + +-- Given a board index (1..64), returns the color of the square at +-- this position: "light" or "dark". +-- Undefined behavior if given an invalid board index +local function get_square_index_color(idx) + local x, y = index_to_xy(idx) + if not x then + return nil + end + if x % 2 == 0 then + if y % 2 == 0 then + return "light" + else + return "dark" + end + else + if y % 2 == 0 then + return "dark" + else + return "light" + end + end +end + +local chat_prefix = minetest.colorize("#FFFF00", "["..S("Chess").."] ") +local chat_prefix_debug = minetest.colorize("#FFFF00", "["..S("Chess Debug").."] ") + +-- Send a chat message to a player with a prefix. +-- If you pass playerColor and botColor, this function will also +-- check if the player is a bot, in which case the message +-- is not sent. +-- If you only pass playerName and message, the message will always +-- be sent (if the player exists). +-- +-- Parameters: +-- * playerName: Name of player to send message to (can be a bot name) +-- * message: The message text +-- * playerColor: "white", "black" or nil (if color is irrelevant) +-- * botColor: optional color of the bot(s): +-- * "white", "black": white or black +-- * "both": Both players are bots +-- * "": No player is a bot (default) +-- * isDebug: if true, message will only be shown in Chess Debug Mode (default: false) +local function send_message(playerName, message, playerColor, botColor, isDebug) + local prefix + if isDebug then + if not CHESS_DEBUG then + return + end + prefix = chat_prefix_debug + else + prefix = chat_prefix + end + minetest.chat_send_player(playerName, prefix .. message) +end +-- Send a message to both players of the chess game (except bots, if botColor is provided) +-- * playerName1: White player name +-- * playerName2: Black player name +-- * message: Message text +-- * botColor: See `send_message` +-- * isDebug: See `send_message` +local function send_message_2(playerName1, playerName2, message, botColor, isDebug) + send_message(playerName1, message, "white", botColor, isDebug) + if playerName2 ~= playerName1 then + send_message(playerName2, message, "black", botColor, isDebug) + end +end + +local notation_letters = {'a','b','c','d','e','f','g','h'} + +-- Converts a numeric board index (1..64) to square coordinates +-- into algebraic notation (a1, a2, a3, etc.) in string form. +function realchess.index_to_notation(idx) + local x, y = index_to_xy(idx) + if not x or not y then + return "??" + end + local xstr = notation_letters[x+1] or "?" + local ystr = tostring(9 - (y+1)) or "?" + return xstr .. ystr +end + +-- abbreviations for each piece for the string +-- representation of the board (like in FEN). +-- To be populated by register_piece +local letters_to_pieces = {} +local pieces_to_letters = {} + +-- Converts a piece (itemname) to a single letter (black pawn = "p", white king = "K", etc.) +local function piece_to_letter(piece) + if piece == "" then + -- The dot represents an empty space + return "." + else + return pieces_to_letters[piece] + end +end +-- Converts a piece letter back to an itemname +local function letter_to_piece(letter) + -- The dot represents an empty space (and thus, an empty item) + if letter == "." then + return "" + else + return letters_to_pieces[letter] + end +end + +--[[ +Takes a chessboard inventory with the inventory list 'board' +which may contain Chess pieces and converts it into a table +with indexes 1 to 64, each containing a 1-character string +which tells you which piece it contains. +List of possible letters: + . empty space + p black pawn + b black bishop + q black queen + k black king + r black rook + n black knight + P white pawn + B white bishop + Q white queen + K white king + R white rook + N white knight +]] +function realchess.board_inv_to_table(inv) + local t = {} + for i = 1, 64 do + local piece = inv:get_stack("board", i):get_name() + local letter = piece_to_letter(piece) + t[i] = letter + end + return t +end +-- Takes a board table (see realchess.board_inv_to_table) 'tabl' +-- and uses it to populate a chessboard inventory 'inv' with it. +-- This will replace ALL items of the 'board' list of +-- the given inventory. +-- The board table MUST be valid; invalid input may lead to crashes. +function realchess.board_table_to_inv(tabl, inv) + local inv_list = {} + for i = 1, 64 do + local letter = tabl[i] + local piece = letter_to_piece(letter) + inv_list[i] = piece + end + inv:set_list("board", inv_list) +end + +local rowDirs = {-1, -1, -1, 0, 0, 1, 1, 1} +local colDirs = {-1, 0, 1, -1, 1, -1, 0, 1} + +local rowDirsKnight = { 2, 1, 2, 1, -2, -1, -2, -1} +local colDirsKnight = {-1, -2, 1, 2, 1, 2, -1, -2} + +local bishopThreats = {true, false, true, false, false, true, false, true} +local rookThreats = {false, true, false, true, true, false, true, false} +local queenThreats = {true, true, true, true, true, true, true, true} +local kingThreats = {true, true, true, true, true, true, true, true} + +function realchess.attacked(color, idx, board_t) + local threatDetected = false + local kill = color == "white" + local pawnThreats = {kill, false, kill, false, false, not kill, false, not kill} + + for dir = 1, 8 do + if not threatDetected then + local col, row = index_to_xy(idx) + col, row = col + 1, row + 1 + + for step = 1, 8 do + row = row + rowDirs[dir] + col = col + colDirs[dir] + + if row >= 1 and row <= 8 and col >= 1 and col <= 8 then + local square = get_square(row, col) + local square_name = board_t[square] + local piece = realchess.get_piece_letter_type(square_name) + local pieceColor = realchess.get_piece_letter_color(square_name) + + if piece then + if pieceColor ~= color then + if piece == "bishop" and bishopThreats[dir] then + threatDetected = true + elseif piece == "rook" and rookThreats[dir] then + threatDetected = true + elseif piece == "queen" and queenThreats[dir] then + threatDetected = true + else + if step == 1 then + if piece == "pawn" and pawnThreats[dir] then + threatDetected = true + end + if piece == "king" and kingThreats[dir] then + threatDetected = true + end + end + end + end + break + end + end + end + + local colK, rowK = index_to_xy(idx) + colK, rowK = colK + 1, rowK + 1 + rowK = rowK + rowDirsKnight[dir] + colK = colK + colDirsKnight[dir] + + if rowK >= 1 and rowK <= 8 and colK >= 1 and colK <= 8 then + local square = get_square(rowK, colK) + local square_name = board_t[square] + local piece = realchess.get_piece_letter_type(square_name) + local pieceColor = realchess.get_piece_letter_color(square_name) + + if piece and pieceColor ~= color and piece == "knight" then + threatDetected = true + end + end + end + end + + return threatDetected +end + +local function get_current_halfmove(meta) + local moves_raw = meta:get_string("moves_raw") + local mrsplit = string.split(moves_raw, ";") + return #mrsplit +end +local function get_current_fullmove(meta) + local moves_raw = meta:get_string("moves_raw") + local mrsplit = string.split(moves_raw, ";") + return math.floor(#mrsplit / 2) +end + +-- Returns a FEN-style string to represent castling rights +-- Will return a sequence of K, Q, k and q, with each letter +-- representing castling rights: +-- * K: white kingside +-- * Q: white queenside +-- * k: black kingside +-- * q: black queenside +-- If all castling rights are gone, will return "-" instead. +-- The 4 arguments are booleans for each possible castling, +-- true means the castling is possible. +local function castling_to_string(white_kingside, white_queenside, black_kingside, black_queenside) + local s_castling = "" + if white_kingside then + s_castling = s_castling .. "K" + end + if white_queenside then + s_castling = s_castling .. "Q" + end + if black_kingside then + s_castling = s_castling .. "k" + end + if black_queenside then + s_castling = s_castling .. "q" + end + if s_castling == "" then + s_castling = "-" + end + return s_castling +end + +-- Returns a FEN-style string to represent the state of a theoretically +-- possible en passant capture on the board (even if no pawn can actually +-- capture). If an en passant capture is possible, returns the square +-- coordinates in algebraic notation of the square the vulnerable pawn +-- has just crossed. If no en passant capture is possible, returns "-". +-- double_step is the board index of the square the vulnerable +-- pawn has just double-stepped to or 0 if there is no such pawn. +local function en_passant_to_string(double_step) + local s_en_passant = "-" + if double_step ~= 0 and double_step ~= nil then + -- write the square crossed by the pawn who made + -- the double step + local dsx, dsy = index_to_xy(double_step) + if dsy == 3 then + dsy = dsy - 1 + else + dsy = dsy + 1 + end + s_en_passant = realchess.index_to_notation(xy_to_index(dsx, dsy)) + end + return s_en_passant +end + +local function can_castle(board_t, from_idx, to_idx, castlingRights) + local from_x, from_y = index_to_xy(from_idx) + local to_x, to_y = index_to_xy(to_idx) + local kingPiece = letter_to_piece(board_t[from_idx]) + local kingColor + if realchess.get_piece_color(kingPiece) == "black" then + kingColor = "black" + else + kingColor = "white" + end + local possible_castles = { + -- white queenside + { y = 7, to_x = 2, rook_idx = 57, rook_goal = 60, acheck_dir = -1, color = "white", rightName = "castlingWhiteL" }, + -- white kingside + { y = 7, to_x = 6, rook_idx = 64, rook_goal = 62, acheck_dir = 1, color = "white", rightName = "castlingWhiteR" }, + -- black queenside + { y = 0, to_x = 2, rook_idx = 1, rook_goal = 4, acheck_dir = -1, color = "black", rightName = "castlingBlackL" }, + -- black kingside + { y = 0, to_x = 6, rook_idx = 8, rook_goal = 6, acheck_dir = 1, color = "black", rightName = "castlingBlackR" }, + } + + for p=1, #possible_castles do + local pc = possible_castles[p] + if pc.color == kingColor and pc.to_x == to_x and to_y == pc.y and from_y == pc.y then + local castlingRightVal = castlingRights[pc.rightName] + local rookPieceLetter = board_t[pc.rook_idx] + local rookPiece = letter_to_piece(rookPieceLetter) + if castlingRightVal == 1 and realchess.get_piece_type(rookPiece) == "rook" and realchess.get_piece_color(rookPiece) == kingColor then + -- Check if all squares between king and rook are empty + local empty_start, empty_end + if pc.acheck_dir == -1 then + -- queenside + empty_start = pc.rook_idx + 1 + empty_end = from_idx - 1 + else + -- kingside + empty_start = from_idx + 1 + empty_end = pc.rook_idx - 1 + end + for i = empty_start, empty_end do + if board_t[i] ~= "." then + return false + end + end + -- Check if square of king as well the squares that king must cross and reach + -- are NOT attacked + for i = from_idx, from_idx + 2 * pc.acheck_dir, pc.acheck_dir do + if realchess.attacked(kingColor, i, board_t) then + return false + end + end + return true, pc.rook_idx, pc.rook_goal, rookPiece + end + end + end + return false + +end + +-- Checks if a square to check if there is a piece that can be captured en passant. Returns true if this +-- is the case, false otherwise. +-- Parameters: +-- * board_t: chessboard table +-- * victim_color: color of the opponent to capture a piece from. "white" or "black". (so in White's turn, pass "black" here) +-- * victim_index: board index of the square where you expect the victim to be +-- * prevDoublePawnStepTo: if a pawn did a double-step in the previous halfmove, this is the board index of the destination. +-- if no pawn made a double-step in the previous halfmove, this is nil or 0. +local function can_capture_en_passant(board_t, victim_color, victim_index, prevDoublePawnStepTo) + local victimPiece = board_t[victim_index] + local double_step_index = prevDoublePawnStepTo or 0 + if double_step_index ~= 0 and double_step_index == victim_index and realchess.get_piece_letter_color(victimPiece) == victim_color and realchess.get_piece_letter_type(victimPiece) == "pawn" then + return true + end + return false +end + +-- Returns all theoretically possible moves from a given +-- square, according to the piece it occupies. Ignores restrictions like check, etc. +-- If the square is empty, no moves are returned. +-- Parameters: +-- * board_t: chessboard table +-- * from_idx: board index of square from which to start +-- returns: table of moves from that square, where each move is +-- a "move" table of this form: +-- { destination_idx, promote_to } +-- with: +-- * destination_idx: board index of the destination square +-- * promote_to: if this move promotes a pawn, this indicates +-- to which piece to promote to: "rook", "bishop", "knight" or "queen" +-- otherwise, this is nil +-- +-- Example: { { 4, nil }, { 9, nil } } -- can move to sqaures 4 and 9, no pawn promotion +local function get_theoretical_moves_from(board_t, from_idx, prevDoublePawnStepTo, castlingRights) + local piece_item = letter_to_piece(board_t[from_idx]) + local piece = realchess.get_piece_type(piece_item) + local color = realchess.get_piece_color(piece_item) + if not piece then + return {} + end + local moves = {} + local from_x, from_y = index_to_xy(from_idx) + + for i = 1, 64 do + local letter = board_t[i] + local stack_name = letter_to_piece(letter) + if stack_name == "" or (color == "black" and realchess.get_piece_color(stack_name) == "white") or (color == "white" and realchess.get_piece_color(stack_name) == "black") then + moves[i] = 0 + end + end + local promotions = {} + + for to_idx in pairs(moves) do + local pieceTo = letter_to_piece(board_t[to_idx]) + local to_x, to_y = index_to_xy(to_idx) + + -- PAWN + if piece == "pawn" then + if color == "white" then + local pawnWhiteMove = letter_to_piece(board_t[xy_to_index(from_x, from_y - 1)]) + local en_passant = false + -- white pawns can go up only + if from_y - 1 == to_y then + if from_x == to_x then + if pieceTo ~= "" then + moves[to_idx] = nil + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + local can_capture = false + if realchess.get_piece_color(pieceTo) == "black" then + can_capture = true + else + -- en passant + if can_capture_en_passant(board_t, "black", xy_to_index(to_x, from_y), prevDoublePawnStepTo) then + can_capture = true + en_passant = true + end + end + if not can_capture then + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + elseif from_y - 2 == to_y then + if pieceTo ~= "" or from_y < 6 or pawnWhiteMove ~= "" or from_x ~= to_x then + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + + --[[ + if x not changed + ensure that destination cell is empty + elseif x changed one unit left or right + ensure the pawn is killing opponent piece + else + move is not legal - abort + ]] + + if from_x == to_x then + if pieceTo ~= "" then + moves[to_idx] = nil + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + if not realchess.get_piece_color(pieceTo) == "black" and not en_passant then + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + + -- Promotion + if moves[to_idx] and to_y == 0 then + promotions[to_idx] = true + end + + elseif color == "black" then + local pawnBlackMove = letter_to_piece(board_t[xy_to_index(from_x, from_y + 1)]) + local en_passant = false + -- black pawns can go down only + if from_y + 1 == to_y then + if from_x == to_x then + if pieceTo ~= "" then + moves[to_idx] = nil + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + local can_capture = false + if realchess.get_piece_color(pieceTo) == "white" then + can_capture = true + else + -- en passant + if can_capture_en_passant(board_t, "white", xy_to_index(to_x, from_y), prevDoublePawnStepTo) then + can_capture = true + en_passant = true + end + end + if not can_capture then + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + elseif from_y + 2 == to_y then + if pieceTo ~= "" or from_y > 1 or pawnBlackMove ~= "" or from_x ~= to_x then + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + + --[[ + if x not changed + ensure that destination cell is empty + elseif x changed one unit left or right + ensure the pawn is killing opponent piece + else + move is not legal - abort + ]] + + if from_x == to_x then + if pieceTo ~= "" then + moves[to_idx] = nil + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + if not (realchess.get_piece_color(pieceTo) == "white") and not en_passant then + moves[to_idx] = nil + end + else + moves[to_idx] = nil + end + + -- Promotion + if moves[to_idx] and to_y == 7 then + promotions[to_idx] = true + end + + else + moves[to_idx] = nil + end + + -- ROOK + elseif piece == "rook" then + if from_x == to_x then + -- Moving vertically + if from_y < to_y then + -- Moving down + -- Ensure that no piece disturbs the way + for i = from_y + 1, to_y - 1 do + if board_t[xy_to_index(from_x, i)] ~= "." then + moves[to_idx] = nil + end + end + else + -- Moving up + -- Ensure that no piece disturbs the way + for i = to_y + 1, from_y - 1 do + if board_t[xy_to_index(from_x, i)] ~= "." then + moves[to_idx] = nil + end + end + end + elseif from_y == to_y then + -- Moving horizontally + if from_x < to_x then + -- moving right + -- ensure that no piece disturbs the way + for i = from_x + 1, to_x - 1 do + if board_t[xy_to_index(i, from_y)] ~= "." then + moves[to_idx] = nil + end + end + else + -- Moving left + -- Ensure that no piece disturbs the way + for i = to_x + 1, from_x - 1 do + if board_t[xy_to_index(i, from_y)] ~= "." then + moves[to_idx] = nil + end + end + end + else + -- Attempt to move arbitrarily -> abort + moves[to_idx] = nil + end + + -- KNIGHT + elseif piece == "knight" then + -- Get relative pos + local dx = from_x - to_x + local dy = from_y - to_y + + -- Get absolute values + if dx < 0 then + dx = -dx + end + + if dy < 0 then + dy = -dy + end + + -- Sort x and y + if dx > dy then + dx, dy = dy, dx + end + + -- Ensure that dx == 1 and dy == 2 + if dx ~= 1 or dy ~= 2 then + moves[to_idx] = nil + end + -- Just ensure that destination cell does not contain friend piece + -- ^ It was done already thus everything ok + + -- BISHOP + elseif piece == "bishop" then + -- Get relative pos + local dx = from_x - to_x + local dy = from_y - to_y + + -- Get absolute values + if dx < 0 then + dx = -dx + end + + if dy < 0 then + dy = -dy + end + + -- Ensure dx and dy are equal + if dx ~= dy then + moves[to_idx] = nil + end + + if from_x < to_x then + if from_y < to_y then + -- Moving right-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board_t[xy_to_index(from_x + i, from_y + i)] ~= "." then + moves[to_idx] = nil + end + end + else + -- Moving right-up + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board_t[xy_to_index(from_x + i, from_y - i)] ~= "." then + moves[to_idx] = nil + end + end + end + else + if from_y < to_y then + -- Moving left-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board_t[xy_to_index(from_x - i, from_y + i)] ~= "." then + moves[to_idx] = nil + end + end + else + -- Moving left-up + -- ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board_t[xy_to_index(from_x - i, from_y - i)] ~= "." then + moves[to_idx] = nil + end + end + end + end + + -- QUEEN + elseif piece == "queen" then + local dx = from_x - to_x + local dy = from_y - to_y + + -- Get absolute values + if dx < 0 then + dx = -dx + end + + if dy < 0 then + dy = -dy + end + + -- Ensure valid relative move + if dx ~= 0 and dy ~= 0 and dx ~= dy then + moves[to_idx] = nil + end + + if from_x == to_x then + -- Moving vertically + if from_y < to_y then + -- Moving down + -- Ensure that no piece disturbs the way + for i = from_y + 1, to_y - 1 do + if board_t[xy_to_index(from_x, i)] ~= "." then + moves[to_idx] = nil + end + end + else + -- Moving up + -- Ensure that no piece disturbs the way + for i = to_y + 1, from_y - 1 do + if board_t[xy_to_index(from_x, i)] ~= "." then + moves[to_idx] = nil + end + end + end + elseif from_x < to_x then + if from_y == to_y then + -- Goes right + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board_t[xy_to_index(from_x + i, from_y)] ~= "." then + moves[to_idx] = nil + end + end + elseif from_y < to_y then + -- Goes right-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board_t[xy_to_index(from_x + i, from_y + i)] ~= "." then + moves[to_idx] = nil + end + end + else + -- Goes right-up + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board_t[xy_to_index(from_x + i, from_y - i)] ~= "." then + moves[to_idx] = nil + end + end + end + else + if from_y == to_y then + -- Moving horizontally + if from_x < to_x then + -- moving right + -- ensure that no piece disturbs the way + for i = from_x + 1, to_x - 1 do + if board_t[xy_to_index(i, from_y)] ~= "." then + moves[to_idx] = nil + end + end + else + -- Moving left + -- Ensure that no piece disturbs the way + for i = to_x + 1, from_x - 1 do + if board_t[xy_to_index(i, from_y)] ~= "." then + moves[to_idx] = nil + end + end + end + elseif from_y < to_y then + -- Goes left-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board_t[xy_to_index(from_x - i, from_y + i)] ~= "." then + moves[to_idx] = nil + end + end + else + -- Goes left-up + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if board_t[xy_to_index(from_x - i, from_y - i)] ~= "." then + moves[to_idx] = nil + end + end + end + end + + -- KING + elseif piece == "king" then + -- King can't move to any attacked square + -- king_board simulates the board with the king moved already. + -- Required for the attacked() check to work + local king_board = table.copy(board_t) + king_board[to_idx] = king_board[from_idx] + king_board[from_idx] = "." + if realchess.attacked(color, to_idx, king_board) then + moves[to_idx] = nil + else + local dx = from_x - to_x + local dy = from_y - to_y + + if dx < 0 then + dx = -dx + end + + if dy < 0 then + dy = -dy + end + + if dx > 1 or dy > 1 then + local cc = can_castle(board_t, from_idx, to_idx, castlingRights) + if not cc then + moves[to_idx] = nil + end + end + end + end + end + + if not next(moves) then + return {} + end + + local moves_output = {} + for destination_idx, _ in pairs(moves) do + if promotions[destination_idx] then + table.insert(moves_output, { destination_idx, PIECE_ROOK }) + table.insert(moves_output, { destination_idx, PIECE_QUEEN }) + table.insert(moves_output, { destination_idx, PIECE_BISHOP }) + table.insert(moves_output, { destination_idx, PIECE_KNIGHT }) + else + table.insert(moves_output, { destination_idx }) + end + end + + return moves_output +end + +-- returns theoretically all possible moves on the board for a player +-- Parameters: +-- * board_t: chessboard table +-- * player: "black" or "white" +-- returns: table of this format: +-- { +-- [origin_index_1] = { move1, move2, move3, ... } +-- [origin_index_2] = { move1, move2, move3, ... } +-- ... +-- } +-- origin_index is the board index for the square to start the piece from (as string). +-- a move has the same format as for get_theoretical_moves_from. +function realchess.get_theoretical_moves_for(board_t, player, prevDoublePawnStepTo, castlingRights) + local player_moves = {} + for i = 1, 64 do + local square_moves = get_theoretical_moves_from(board_t, i, prevDoublePawnStepTo, castlingRights) + for m=1, #square_moves do + local stack_name = letter_to_piece(board_t[i]) + if realchess.get_piece_color(stack_name) == player then + player_moves[i] = square_moves + end + end + end + return player_moves +end + +function realchess.locate_kings(board_t) + local Bidx, Widx + for i = 1, 64 do + -- black king + if board_t[i] == "k" then + Bidx = i + -- white king + elseif board_t[i] == "K" then + Widx = i + end + end + + return Bidx, Widx +end + +-- Given a table of theoretical moves, returns a table +-- of moves that are safe for the king, i.e. moves +-- that neither put or leave the king at risk. +-- 2nd return value is the number of said safe moves. +-- * theoretical_moves: moves table returned by realchess.get_theoretical_moves_for() +-- * board_t: board table +-- * player: player color ("white" or "black") +function realchess.get_king_safe_moves(theoretical_moves, board_t, player) + local safe_moves = {} + local safe_moves_count = 0 + -- create a virtual board + local v_board = table.copy(board_t) + + for from_idx, destmoves in pairs(theoretical_moves) do + for d=1, #destmoves do + local destmove = destmoves[d] + local to_idx = destmove[1] + from_idx = tonumber(from_idx) + + -- save the old board values before manipulating them + local bak_to = v_board[to_idx] + local bak_from = v_board[from_idx] + + -- move the piece on the virtual board + if destmove[2] then + -- Promote the pawn, if applicable + if destmove[2] == PIECE_KNIGHT then + v_board[to_idx] = "n" + elseif destmove[2] == PIECE_ROOK then + v_board[to_idx] = "r" + elseif destmove[2] == PIECE_BISHOP then + v_board[to_idx] = "b" + elseif destmove[2] == PIECE_QUEEN then + v_board[to_idx] = "q" + end + if player == "white" then + v_board[to_idx] = string.upper(v_board[to_idx]) + end + else + v_board[to_idx] = v_board[from_idx] + end + v_board[from_idx] = "." + local black_king_idx, white_king_idx = realchess.locate_kings(v_board) + if not black_king_idx or not white_king_idx then + minetest.log("error", "[xdecor] Chess: Insufficient kings on chessboard!") + return {}, 0 + end + local king_idx + if player == "black" then + king_idx = black_king_idx + else + king_idx = white_king_idx + end + local playerAttacked = realchess.attacked(player, king_idx, v_board) + if not playerAttacked then + safe_moves[from_idx] = safe_moves[from_idx] or {} + table.insert(safe_moves[from_idx], destmove) + safe_moves_count = safe_moves_count + 1 + end + + -- restore the old state of the virtual board + v_board[to_idx] = bak_to + v_board[from_idx] = bak_from + end + end + + return safe_moves, safe_moves_count +end + +-- Given a chessboard, checks whether it is in a "dead position", +-- i.e. a position in which neither player would be able to checkmate. +-- This function does not cover all dead positions, but only +-- the most common ones. +-- NOT checked are dead posisions in which both sides can still move, +-- but cannot capture pieces or checkmate the king +-- Parameters +-- * board_t: Chessboard table +-- Returns true if the board is in a dead position, false otherwise. +local function is_dead_position(board_t) + -- Dead position by lack of material + local mat = {} -- material table to count pieces + -- white material + mat.w = { + -- piece counters + pawn = 0, + bishop = 0, + knight = 0, + rook = 0, + queen = 0, + -- for bishops, also record their square color + bishop_square_light = 0, + bishop_square_dark = 0, + } + -- black material + mat.b = table.copy(mat.w) + -- Count material for both players + for b=1, #board_t do + local piece = letter_to_piece(board_t[b]) + if piece ~= "" then + local color + if realchess.get_piece_color(piece) == "white" then + color = "w" + else + color = "b" + end + -- Count all pieces except kings because we can assume + -- the board always has 1 white and 1 black king + if realchess.get_piece_type(piece) == "pawn" then + mat[color].pawn = mat[color].pawn + 1 + elseif realchess.get_piece_type(piece) == "bishop" then + mat[color].bishop = mat[color].bishop + 1 + local sqcolor = get_square_index_color(b) + mat[color]["bishop_square_"..sqcolor] = mat[color]["bishop_square_"..sqcolor] + 1 + elseif realchess.get_piece_type(piece) == "knight" then + mat[color].knight = mat[color].knight + 1 + elseif realchess.get_piece_type(piece) == "rook" then + mat[color].rook = mat[color].rook + 1 + elseif realchess.get_piece_type(piece) == "queen" then + mat[color].queen = mat[color].queen + 1 + end + end + end + -- Check well-known dead positions based on insufficient material. + -- If there is any rook, queen or pawn on the board, the material is sufficient. + if mat.w.rook == 0 and mat.w.queen == 0 and mat.w.pawn == 0 and + mat.b.rook == 0 and mat.b.queen == 0 and mat.b.pawn == 0 then + -- King against king + if mat.w.knight == 0 and mat.w.bishop == 0 and mat.b.knight == 0 and mat.b.bishop == 0 then + return true + -- King against king and bishop + elseif mat.w.knight == 0 and mat.b.knight == 0 and + ((mat.w.bishop == 1 and mat.b.bishop == 0) or + (mat.w.bishop == 0 and mat.b.bishop == 1)) then + return true + -- King against king and knight + elseif mat.w.bishop == 0 and mat.b.bishop == 0 and + ((mat.w.knight == 1 and mat.b.knight == 0) or + (mat.w.knight == 0 and mat.b.knight == 1)) then + return true + -- King and bishop against king and bishop, + -- and both bishops are on squares of the same color + elseif mat.w.knight == 0 and mat.b.knight == 0 and + (mat.w.bishop == 1 and mat.b.bishop == 1) and + (mat.w.bishop_square_color_light == mat.b.bishop_square_color_light) and + (mat.w.bishop_square_color_dark == mat.b.bishop_square_color_dark) then + return true + end + end + + return false +end + +-- Base names of all Chess pieces (with color) +local pieces_basenames = { + "pawn_white", + "rook_white", + "knight_white", + "bishop_white", + "queen_white", + "king_white", + "pawn_black", + "rook_black", + "knight_black", + "bishop_black", + "queen_black", + "king_black", +} + +-- Initial positions of the pieces on the chessboard. +-- The pieces are specified as item names. +-- It starts a8, continues with b8, c8, etc. then continues with a7, b7, etc. etc. +local starting_grid = { + -- rank '8' + "realchess:rook_black_1", -- a8 + "realchess:knight_black_1", -- b8 + "realchess:bishop_black_1", -- c8 + "realchess:queen_black", -- ... + "realchess:king_black", + "realchess:bishop_black_2", + "realchess:knight_black_2", + "realchess:rook_black_2", + -- rank '8' + -- rank '7' + "realchess:pawn_black_1", + "realchess:pawn_black_2", + "realchess:pawn_black_3", + "realchess:pawn_black_4", + "realchess:pawn_black_5", + "realchess:pawn_black_6", + "realchess:pawn_black_7", + "realchess:pawn_black_8", + -- ranks '6' thru '3' + '','','','','','','','', + '','','','','','','','', + '','','','','','','','', + '','','','','','','','', + -- rank '2' + "realchess:pawn_white_1", + "realchess:pawn_white_2", + "realchess:pawn_white_3", + "realchess:pawn_white_4", + "realchess:pawn_white_5", + "realchess:pawn_white_6", + "realchess:pawn_white_7", + "realchess:pawn_white_8", + -- rank '1' + "realchess:rook_white_1", + "realchess:knight_white_1", + "realchess:bishop_white_1", + "realchess:queen_white", + "realchess:king_white", + "realchess:bishop_white_2", + "realchess:knight_white_2", + "realchess:rook_white_2" +} + +-- Figurine image IDs and file names for the chess notation table. +-- Note: "figurine" refers to the chess notation icon, NOT the chess piece for playing. +local figurines_str = "", 0 +local figurines_str_cnt = 0 +local MOVES_LIST_SYMBOL_EMPTY = figurines_str_cnt +figurines_str = figurines_str .. MOVES_LIST_SYMBOL_EMPTY .. "=mailbox_blank16.png" +for i = 1, #pieces_basenames do + figurines_str_cnt = figurines_str_cnt + 1 + local p = pieces_basenames[i] + figurines_str = figurines_str .. "," .. figurines_str_cnt .. "=chess_figurine_" .. p .. ".png" +end + +local function get_figurine_id(piece_itemname) + local piece = realchess.get_piece_type(piece_itemname) + local color = realchess.get_piece_color(piece_itemname) + if not piece or not color then + return MOVES_LIST_SYMBOL_EMPTY + else + return figurines_str:match("(%d+)=chess_figurine_" .. piece .. "_" .. color) + end +end + + +local fs_gamemode_x +if CHESS_DEBUG then + fs_gamemode_x = 10.2 +else + fs_gamemode_x = 11.5 +end + +local fs_init = [[ + formspec_version[2] + size[16,10.7563;] + no_prepend[] + ]] + .."bgcolor[#00000000;false]" + .."background[0,0;16,10.7563;chess_bg.png;true]" + .."style_type[button,image_button,item_image_button;bgcolor=#8f3000]" + --~ Chess: Game mode selection prompt + .."label[2.2,0.652;"..minetest.colorize("#404040", FS("Select a game mode")).."]" + .."label[2.2,10.21;"..minetest.colorize("#404040", FS("Select a game mode")).."]" + --~ Chess: Game mode selection prompt + .."label[11.2,1.8;"..FS("Select a mode:").."]" + --~ Chess game mode (player vs bot) + .."button[11,2.1;3,0.8;single;"..FS("Singleplayer").."]" + --~ Chess game mode (player vs player) + .."button[11,3.1;3,0.8;multi;"..FS("Multiplayer").."]" + if CHESS_DEBUG then + --~ Chess game mode + fs_init = fs_init .."button[11,4.1;3,0.8;bot_vs_bot;"..FS("Bot vs Bot").."]" + end + +local fs = [[ + formspec_version[2] + size[16,10.7563;] + no_prepend[] + bgcolor[#00000000;false] + background[0,0;16,10.7563;chess_bg.png;true] + style_type[button,image_button,item_image_button;bgcolor=#8f3000] + style_type[list;spacing=0.1;size=0.975] + listcolors[#00000000;#00000000;#00000000;#30434C;#FFF] + list[context;board;0.47,1.155;8,8;] + tableoptions[background=#00000000;highlight=#00000000;border=false] + ]] + -- table columns for Chess notation. + -- Columns: move no.; white piece; white halfmove; white promotion; black piece; black halfmove; black promotion + .."tablecolumns[" .. + "text,align=right;".. + "image," .. figurines_str .. ";text;image," .. figurines_str .. ";" .. + --"image,0=mailbox_blank16.png;" .. + "image," .. figurines_str .. ";text;image," .. figurines_str .. "]" + +local function add_move_to_moves_list(meta, pieceFrom, pieceTo, from_idx, to_idx, special) + local moves_raw = meta:get_string("moves_raw") + if moves_raw ~= "" then + moves_raw = moves_raw .. ";" + end + if not special then + special = "" + end + moves_raw = moves_raw .. pieceFrom .. "," .. pieceTo .. "," .. from_idx .. "," .. to_idx .. "," .. special + meta:set_string("moves_raw", moves_raw) +end + +local function add_special_to_moves_list(meta, special) + add_move_to_moves_list(meta, "", "", "", "", special) +end + + +-- Returns a list of all positions so far, for the purposes +-- of determining position equality under the +-- "3-/5-fold repetition" draw rules. +-- Each possible position is uniquely identified by a string +-- so equal positions have the same string and unequal positons +-- have a different string. +-- A position string containts the following data: +-- * position of pieces on the board +-- * current player +-- * castling rights +-- * target coords of the square crossed by the pawn who +-- made a double step in the prvious turn (if any) +-- +-- Patemeter: meta is the node metadata of the chessboard +-- +-- NOTE: The FIDE Laws of Chess (Jan 2023, article 9.2.3.1) +-- are somewhat unclear about en passant here ... Is it important +-- the pawn was only theoretically vulnerable to being +-- captured en passant without being actually threatened +-- that way, or does it only count if the pawn was actually +-- threatened by another pawn to be captured that way? +-- This mod currently interprets the rule in the former way, +-- i.e. a double step by a pawn +local function get_positions_history(meta) + -- Turns a board table to a string. + -- The syntax is inspired by FEN but not identical. + -- It iterates through the table from start + -- to finish and turns every square to a character, + -- representing a piece or an empty square. + local function board_to_string(board) + local str = "" + for b=1, #board do + local piece = board[b] + local append + str = str .. piece_to_letter(piece) + end + return str + end + + -- Record the position no. of the position from which + -- all positions before that can be ignored + -- when counting same positions. + -- This number is updated each time an irreversible + -- move is made: + -- * pawn move + -- * capturing move + -- * loss of castling rights + -- * loss of (theoretical) en passant availability + -- This works cuz when an irreversible move is made, + -- it is impossible for this and all positions before + -- that to occur again so the "repetition counter" + -- for each of these position never increases again. + local no_repetitions_before = 1 + + local moves_raw = meta:get_string("moves_raw") + local moves_split = string.split(moves_raw, ";") + local positions_list = "" + local board = table.copy(starting_grid) + local castling_state = { true, true, true, true } + local castling_str = castling_to_string(unpack(castling_state)) + local pawn_double_step_index + positions_list = {} + + local current_player = "w" + local position_string = board_to_string(board) .. " " .. + current_player .. " " .. + castling_str .. " " .. + en_passant_to_string(nil) + table.insert(positions_list, position_string) + for m=1, #moves_split do + local move_split = string.split(moves_split[m], ",", true) + local pieceFrom = move_split[1] + local pieceTo = move_split[2] + local from_idx = tonumber(move_split[3]) + local to_idx = tonumber(move_split[4]) + local special = move_split[5] + if special == "" or special:sub(1,7) == "promo__" then + + if current_player == "w" then + current_player = "b" + else + current_player = "w" + end + -- Reset repetition counter on piece capture + if pieceTo ~= "" then + no_repetitions_before = m + end + + -- Piece movement + board[to_idx] = board[from_idx] + board[from_idx] = "" + + -- Pawn promotion + if special:sub(1, 7) == "promo__" then + local promoSym = special:sub(8) + board[to_idx] = promoSym + end + + local from_x, from_y = index_to_xy(from_idx) + local to_x, to_y = index_to_xy(to_idx) + if pieceFrom:sub(11,14) == "king" then + -- Castling (move rook) + if (from_y == 7 and to_y == 7) then + if (from_x == 4 and to_x == 2) then + board[60] = board[57] + board[57] = "" + no_repetitions_before = m + elseif (from_x == 4 and to_x == 6) then + board[62] = board[64] + board[64] = "" + no_repetitions_before = m + end + elseif (from_y == 0 and to_y == 0) then + if (from_x == 4 and to_x == 2) then + board[4] = board[1] + board[1] = "" + no_repetitions_before = m + elseif (from_x == 4 and to_x == 6) then + board[6] = board[8] + board[8] = "" + no_repetitions_before = m + end + end + -- Lose castling rights on any king move + if realchess.get_piece_color(pieceFrom) == "white" then + if castling_state[1] or castling_state[2] then + no_repetitions_before = m + end + castling_state[1] = false + castling_state[2] = false + else + if castling_state[3] or castling_state[4] then + no_repetitions_before = m + end + castling_state[3] = false + castling_state[4] = false + end + + -- Lose castling rights on lone rook move + elseif pieceFrom:sub(11,14) == "rook" then + if from_idx == 57 then + -- white queenside + if castling_state[2] then + castling_state[2] = false + no_repetitions_before = m + end + elseif from_idx == 64 then + -- white kingside + if castling_state[1] then + castling_state[1] = false + no_repetitions_before = m + end + elseif from_idx == 1 then + -- black queenside + if castling_state[4] then + castling_state[4] = false + no_repetitions_before = m + end + elseif from_idx == 8 then + -- black kingside + if castling_state[3] then + castling_state[3] = false + no_repetitions_before = m + end + end + end + + -- Pawn movement resets repetition counter + if pieceFrom:sub(11,14) == "pawn" then + no_repetitions_before = m + end + + -- Loss of (theoretical) en passant capture availability + -- resets repetition counter + if pawn_double_step_index then + no_repetitions_before = m + pawn_double_step_index = nil + end + + if pieceTo == "" and pieceFrom:sub(11,14) == "pawn" then + -- En passant (remove captured pawn) + if from_x ~= to_x then + local epp_y + if realchess.get_piece_color(pieceFrom) == "white" then + epp_y = to_y + 1 + else + epp_y = to_y - 1 + end + board[xy_to_index(to_x, epp_y)] = "" + -- Double pawn step (record pos) + elseif math.abs(from_y-to_y) == 2 then + pawn_double_step_index = to_idx + end + end + + castling_str = castling_to_string(unpack(castling_state)) + local position_string = board_to_string(board) .. " " .. + current_player .. " " .. + castling_str .. " " .. + en_passant_to_string(pawn_double_step_index) + table.insert(positions_list, position_string) + end + end + local p=#positions_list + return positions_list, no_repetitions_before +end + +-- Returns the highest number of positions that are repeated +-- in the given positions history list as well as the number +-- of occurrances of the last position. +-- +-- Arguments: +-- * positions: positions history list returned by get_position_history() +-- * first_position_no: index of first position to check (default: 1) +-- +-- Returns , +local function count_repeated_positions(positions, first_position_no) + -- Count how often each position occurred + local positions_counter = {} + local maxRepeatedPositions = 0 + first_position_no = first_position_no or 1 + for p = first_position_no, #positions do + local position = positions[p] + if positions_counter[position] == nil then + positions_counter[position] = 1 + else + positions_counter[position] = positions_counter[position] + 1 + end + if positions_counter[position] > maxRepeatedPositions then + maxRepeatedPositions = positions_counter[position] + end + end + local lastPosition = positions[#positions] + local lastPositionOccurredTimes = positions_counter[lastPosition] or 0 + return maxRepeatedPositions, lastPositionOccurredTimes +end + +-- Create the full formspec string for the sequence of moves. +-- Uses Figurine Algebraic Notation. +local function get_moves_formstring(meta) + local moves_raw = meta:get_string("moves_raw") + if moves_raw == "" then + return "", 0 + end + + local moves_split = string.split(moves_raw, ";") + local moves_out = "" + local move_no = 0 + for m=1, #moves_split do + local move_split = string.split(moves_split[m], ",", true) + local pieceFrom = move_split[1] + local pieceTo = move_split[2] + local from_idx = tonumber(move_split[3]) + local to_idx = tonumber(move_split[4]) + local special = move_split[5] + + -- true if White plays, false if Black plays + local curPlayerIsWhite = m % 2 == 1 + + if special == "whiteWon" or special == "blackWon" or special == "draw" then + if not curPlayerIsWhite then + moves_out = moves_out .. ""..MOVES_LIST_SYMBOL_EMPTY..",," .. MOVES_LIST_SYMBOL_EMPTY .. "," + end + end + if special == "whiteWon" then + moves_out = moves_out .. ","..MOVES_LIST_SYMBOL_EMPTY..",1–0,"..MOVES_LIST_SYMBOL_EMPTY + move_no = move_no + 1 + elseif special == "blackWon" then + moves_out = moves_out .. ","..MOVES_LIST_SYMBOL_EMPTY..",0–1,"..MOVES_LIST_SYMBOL_EMPTY + move_no = move_no + 1 + elseif special == "draw" then + moves_out = moves_out .. ","..MOVES_LIST_SYMBOL_EMPTY..",½–½,"..MOVES_LIST_SYMBOL_EMPTY + move_no = move_no + 1 + else + local from_x, from_y = index_to_xy(from_idx) + local to_x, to_y = index_to_xy(to_idx) + local pieceFrom_si_id + -- Show no piece icon for pawn + if pieceFrom:sub(11,14) == "pawn" then + pieceFrom_si_id = MOVES_LIST_SYMBOL_EMPTY + else + pieceFrom_si_id = get_figurine_id(pieceFrom) + end + local pieceTo_si_id = pieceTo ~= "" and get_figurine_id(pieceTo) + + local coordFrom = realchess.index_to_notation(from_idx) + local coordTo = realchess.index_to_notation(to_idx) + + if curPlayerIsWhite then + move_no = move_no + 1 + -- Add move number (e.g. "3.") + moves_out = moves_out .. string.format("%d.", move_no) .. "," + end + local betweenCoordsSymbol = "–" -- to be inserted between source and destination coords + -- dash for normal moves, × for capturing moves + local enPassantSymbol = "" -- symbol for en passant captures + if pieceTo ~= "" then + -- normal capture + betweenCoordsSymbol = "×" + elseif pieceTo == "" and pieceFrom:sub(11,14) == "pawn" and from_x ~= to_x then + -- 'en passant' capture + betweenCoordsSymbol = "×" + enPassantSymbol = " e.p." + end + + ---- Add halfmove of current player + -- Castling + local castling = false + if pieceFrom:sub(11,14) == "king" and ((curPlayerIsWhite and from_y == 7 and to_y == 7) or (not curPlayerIsWhite and from_y == 0 and to_y == 0)) then + -- queenside castling + if from_x == 4 and to_x == 2 then + -- write "0–0–0" + moves_out = moves_out .. MOVES_LIST_SYMBOL_EMPTY .. ",0–0–0," .. MOVES_LIST_SYMBOL_EMPTY + castling = true + -- kingside castling + elseif from_x == 4 and to_x == 6 then + -- write "0–0" + moves_out = moves_out .. MOVES_LIST_SYMBOL_EMPTY .. ",0–0," .. MOVES_LIST_SYMBOL_EMPTY + castling = true + end + end + -- Normal halfmove + if not castling then + moves_out = moves_out .. + pieceFrom_si_id .. "," .. -- piece image ID + coordFrom .. betweenCoordsSymbol .. coordTo .. -- coords in long algebraic notation, e.g. "e2e3" + enPassantSymbol .. "," -- written in case of an 'en passant' capture + + -- Promotion? + if special:sub(1, 7) == "promo__" then + local promoSym = special:sub(8) + moves_out = moves_out .. get_figurine_id(promoSym) + else + moves_out = moves_out .. MOVES_LIST_SYMBOL_EMPTY + end + end + + -- If White moved, fill up the rest of the row with empty space. + -- Required for validity of the table + if curPlayerIsWhite and m == #moves_split then + moves_out = moves_out .. "," .. MOVES_LIST_SYMBOL_EMPTY .. ",," .. MOVES_LIST_SYMBOL_EMPTY + end + end + + if m ~= #moves_split then + moves_out = moves_out .. "," + end + end + return moves_out, move_no +end + +-- Verify eaten list +local verify_eaten_list +if CHESS_DEBUG then + verify_eaten_list = function(meta) + local inv = meta:get_inventory() + local board_t = realchess.board_inv_to_table(inv) + local whitePiecesLeft = 0 + local whitePiecesEaten = 0 + local blackPiecesLeft = 0 + local blackPiecesEaten = 0 + for b=1, 64 do + local letter = board_t[b] + local lcolor = realchess.get_piece_letter_color(letter) + if lcolor == "white" then + whitePiecesLeft = whitePiecesLeft + 1 + elseif lcolor == "black" then + blackPiecesLeft = blackPiecesLeft + 1 + end + end + -- The eaten list is a comma-separated list of eaten pieces + local eaten = meta:get_string("eaten") + local eaten_split = string.split(eaten, ",") + for e=1, #eaten_split do + -- The elements in the 'eaten' list use format "_" + local eaten_piece_split = string.split(eaten_split[e], "_") + local eaten_piece_color = eaten_piece_split[2] + if eaten_piece_color == "white" then + whitePiecesEaten = whitePiecesEaten + 1 + elseif eaten_piece_color == "black" then + blackPiecesEaten = blackPiecesEaten + 1 + else + minetest.log("error", "[xdecor] eaten_piece_color is neither 'white' nor 'black'") + end + end + local eatenError = false + if whitePiecesLeft + whitePiecesEaten ~= 16 then + minetest.log("error", "[xdecor] Chess: Incorrect number of white pieces in eaten list! pieces="..whitePiecesLeft.."; eaten="..whitePiecesEaten) + eatenError = true + elseif blackPiecesLeft + blackPiecesEaten ~= 16 then + minetest.log("error", "[xdecor] Chess: Incorrect number of black pieces in eaten list! pieces="..blackPiecesLeft.."; eaten="..blackPiecesEaten) + eatenError = true + end + if eatenError then + -- halt bots + local mode = meta:get_string("mode") + if mode == "bot_vs_bot" then + meta:set_string("botColor", "") + end + end + end +end + +-- Reports that a piece was "eaten" (=captured). +-- Must be called right after the board inventory was updated +-- on which the piece is already removed +-- * meta: Chessboard node metadata +-- * piece: The itemname of the piece that was captured +local function add_to_eaten_list(meta, piece) + if piece ~= "" then + local eaten = meta:get_string("eaten") + if eaten ~= "" then + eaten = eaten .. "," + end + local piece_type = realchess.get_piece_type(piece) + local piece_color = realchess.get_piece_color(piece) + local piece_s = "" + if piece_type and piece_color then + piece_s = piece_type .. "_" .. piece_color + end + eaten = eaten .. piece_s + meta:set_string("eaten", eaten) + if CHESS_DEBUG then + verify_eaten_list(meta) + end + end +end + +local function get_eaten_formstring(meta) + local eaten = meta:get_string("eaten") + local eaten_t = string.split(eaten, ",") + local eaten_img = "" + local a, b = 0, 0 + for i = 1, #eaten_t do + local is_white = eaten_t[i]:sub(-5,-1) == "white" + local X = (is_white and a or b) % 4 + local Y = ((is_white and a or b) % 16 - X) / 4 + + if is_white then + a = a + 1 + else + b = b + 1 + end + + eaten_img = eaten_img .. + "image[" .. ((X + (is_white and 12.82 or 9.72)) - (X * 0.44)) .. "," .. + ((Y + 6) - (Y * 0.12)) .. ";1,1;" .. eaten_t[i] .. ".png]" + end + return eaten_img +end + +local function update_formspec(meta) + local black_king_attacked = meta:get_string("blackAttacked") == "true" + local white_king_attacked = meta:get_string("whiteAttacked") == "true" + local botColor = meta:get_string("botColor") + + local playerWhite = meta:get_string("playerWhite") + local playerBlack = meta:get_string("playerBlack") + + -- Translate the bot names for the display + -- (internally, the bot names are still English-only) + local playerWhiteDisplay = get_display_player_name(meta, "white") + local playerBlackDisplay = get_display_player_name(meta, "black") + + local moves_raw = meta:get_string("moves_raw") + local moves, mlistlen = get_moves_formstring(meta) + local eaten_img = get_eaten_formstring(meta) + local lastMove = meta:get_string("lastMove") + local gameResult = meta:get_string("gameResult") + local grReason = meta:get_string("gameResultReason") + local mode = meta:get_string("mode") + + -- arrow to show whose turn it is + local blackArr = (gameResult == "" and lastMove == "white" and "image[1.2,0.252;0.7,0.7;chess_turn_black.png]") or "" + local whiteArr = (gameResult == "" and (lastMove == "" or lastMove == "black") and "image[1.2,9.81;0.7,0.7;chess_turn_white.png]") or "" + local turnBlack = minetest.colorize("#000001", playerBlackDisplay) + local turnWhite = minetest.colorize("#000001", playerWhiteDisplay) + + -- several status words for the player + --~ Chess: player is in check + local check_s = minetest.colorize("#FF8000", "["..S("check").."]") + --~ Chess: player has been checkmated + local mate_s = minetest.colorize("#FF0000", "["..S("checkmate").."]") + --~ Chess: player has resigned + local resign_s = minetest.colorize("#FF0000", "["..S("resigned").."]") + --~ Chess: player has won + local win_s = minetest.colorize("#26AB2B", "["..S("winner").."]") + --~ Chess: player has lost + local lose_s = minetest.colorize("#FF0000", "["..S("loser").."]") + --~ Chess: player has a draw + local draw_s = minetest.colorize("#FF00FF", "["..S("draw").."]") + + local status_black = "" + local status_white = "" + if gameResult == "blackWon" then + if grReason == "resign" then + status_white = " " .. resign_s + elseif grReason == "checkmate" then + status_white = " " .. mate_s + else + status_white = " " .. lose_s + end + status_black = " " .. win_s + elseif gameResult == "draw" then + status_black = " " .. draw_s + status_white = " " .. draw_s + elseif gameResult == "whiteWon" then + if grReason == "resign" then + status_black = " " .. resign_s + elseif grReason == "checkmate" then + status_black = " " .. mate_s + else + status_black = " " .. lose_s + end + status_white = " " .. win_s + else + if black_king_attacked then + status_black = " " .. check_s + end + if white_king_attacked then + status_white = " " .. check_s + end + end + + local promotion = "" + if gameResult == "" then + promotion = meta:get_string("promotionActive") + end + local promotion_formstring = "" + + -- Show promotion prompt to ask player to choose to which piece to promote a pawn to + if promotion == "black" then + eaten_img = "" + promotion_formstring = + --~ Chess: Shown when black player can promote a pawn. Space for text is limited. + "label[10.1,6.35;"..FS("PROMOTION\nFOR BLACK!").."]" .. + "animated_image[10.05,7.2;2,2;p_img_white;pawn_black_promo_anim.png;5;100]" + if botColor ~= "black" and botColor ~= "both" then + -- Hide buttons if computer player promotes + promotion_formstring = promotion_formstring .. + --~ Chess: Prompt for player who must select to which piece to promote their pawn. Space for text is limited. + "label[13.15,6.35;"..FS("Promote pawn to:").."]" .. + "item_image_button[13.15,7.2;1,1;realchess:queen_black;p_queen_black;]" .. + "item_image_button[14.15,7.2;1,1;realchess:rook_black_1;p_rook_black;]" .. + "item_image_button[13.15,8.2;1,1;realchess:bishop_black_1;p_bishop_black;]" .. + "item_image_button[14.15,8.2;1,1;realchess:knight_black_1;p_knight_black;]" + end + + elseif promotion == "white" then + eaten_img = "" + promotion_formstring = + --~ Chess: Shown when white player can promote a pawn. Space for text is limited. + "label[10.1,6.35;"..FS("PROMOTION\nFOR WHITE!").."]" .. + "animated_image[10.05,7.2;2,2;p_img_white;pawn_white_promo_anim.png;5;100]" + if botColor ~= "white" and botColor ~= "both" then + -- Hide buttons if computer player promotes + promotion_formstring = promotion_formstring .. + "label[13.15,6.35;"..FS("Promote pawn to:").."]" .. + "item_image_button[13.15,7.2;1,1;realchess:queen_white;p_queen_white;]" .. + "item_image_button[14.15,7.2;1,1;realchess:rook_white_1;p_rook_white;]" .. + "item_image_button[13.15,8.2;1,1;realchess:bishop_white_1;p_bishop_white;]" .. + "item_image_button[14.15,8.2;1,1;realchess:knight_white_1;p_knight_white;]" + end + end + + local drawClaim = meta:get_string("drawClaim") + local draw_claim_formstring = "" + if drawClaim ~= "" and gameResult == "" then + if lastMove == "black" or lastMove == "" then + --~ Chess: Shown when white player wants to use the 50-move rule or threefold-repetition rule to claim a draw. Space for text is limited. + draw_claim_formstring = "label[10.1,6.35;"..FS("DRAW CLAIM\nBY WHITE!").."]" + else + --~ Chess: Shown when black player wants to use the 50-move rule or threefold-repetition rule to claim a draw. Space for text is limited. + draw_claim_formstring = "label[10.1,6.35;"..FS("DRAW CLAIM\nBY BLACK!").."]" + end + if drawClaim == "50_move_rule" then + eaten_img = "" + draw_claim_formstring = draw_claim_formstring .. + "image[10.05,7.2;2,2;chess_draw_50move_next.png]".. + --~ Chess message + "textarea[13,6.35;2.2,3.2;;;"..FS("The player has invoked the 50-move rule for the next move. The next move might draw the game.").."]" + elseif drawClaim == "same_position_3" then + eaten_img = "" + draw_claim_formstring = draw_claim_formstring .. + "image[10.05,7.2;2,2;chess_draw_repeat3_next.png]".. + --~ Chess message + "textarea[13,6.35;2.2,3.2;;;"..FS("The player has invoked the threefold-repetition rule for the next move. The next move might draw the game.").."]" + end + end + + -- Resign / Start new game + local game_buttons = "" + --~ Chess button + game_buttons = game_buttons .. "button[13.36,0.26;2,0.8;new;"..FS("New game").."]" + + local playerActionsAvailable = mode ~= "bot_vs_bot" and gameResult == "" + + if playerActionsAvailable and (playerWhite ~= "" and playerBlack ~= "") then + game_buttons = game_buttons .. "image_button[14.56,9.7;0.8,0.8;chess_resign.png;resign;]" .. + --~ Resign (give up) in Chess + "tooltip[resign;"..FS("Resign").."]" + end + + -- Let player choose with which to play singleplayer + if lastMove == "" and gameResult == "" and mode == "single" and playerWhite == "" then + --~ Chess: Prompt to select a player color + game_buttons = game_buttons .. "label[11.2,1.8;"..FS("Select a color:").."]" + .."style[single_black;bgcolor=#000000FF;textcolor=#FFFFFFFF]" + .."style[single_white;bgcolor=#FFFFFFFF;textcolor=#000000FF]" + --~ White Chess player + .."button[11,2.1;3,0.8;single_white;"..FS("White").."]" + --~ Black Chess player + .."button[11,3.1;3,0.8;single_black;"..FS("Black").."]" + end + + if playerActionsAvailable and drawClaim == "" then + -- 50-move rule + local halfmoveClock = meta:get_int("halfmoveClock") + if halfmoveClock == DRAWCLAIM_LONGGAME_PLAYER - 1 then + -- When the 50 moves without capture / pawn move is about to occur. + -- Will trigger "draw claim" mode in which player must do the final move that triggers the draw + game_buttons = game_buttons .. "image_button[13.36,9.7;0.8,0.8;chess_draw_50move_next.png;draw_50_moves;]".. + "tooltip[draw_50_moves;".. + --~ Chess message + FS("Invoke the 50-move rule for your next move").."]" + elseif halfmoveClock >= DRAWCLAIM_LONGGAME_PLAYER then + -- When the 50 moves without capture / pawn move have occured occur. + -- Will insta-draw. + game_buttons = game_buttons .. "image_button[13.36,9.7;0.8,0.8;chess_draw_50move.png;draw_50_moves;]".. + "tooltip[draw_50_moves;".. + --~ Chess message + FS("Invoke the 50-move rule and draw the game").."]" + end + + -- Threefold repetition rule + -- Count how often each position occurred + local positions, first_p = get_positions_history(meta) + local maxRepeatedPositions, lastOccurred = count_repeated_positions(positions, first_p) + if lastOccurred >= 3 then + -- If the same position has already occured 3 times + -- Will insta-draw. + game_buttons = game_buttons .. "image_button[12.36,9.7;0.8,0.8;chess_draw_repeat3.png;draw_repeat_3;]".. + "tooltip[draw_repeat_3;".. + --~ Chess message + FS("Invoke the threefold repetition rule and draw the game").."]" + elseif maxRepeatedPositions >= 2 then + -- If the same position may be about to occur 3 times. + -- Will trigger "draw claim" mode in which player must do the final move that triggers the draw. + game_buttons = game_buttons .. "image_button[12.36,9.7;0.8,0.8;chess_draw_repeat3_next.png;draw_repeat_3;]".. + "tooltip[draw_repeat_3;".. + --~ Chess message + FS("Invoke the threefold repetition rule for your next move").."]" + end + end + + local debug_formstring = "" + if CHESS_DEBUG then + -- Write a debug string in the formspec based on FEN + -- to show some hidden state. + -- It uses FEN syntax but without the piece positions + + -- current player: b or w + local d_turn = "-" + if lastMove == "white" then + d_turn = "b" + elseif lastMove == "black" or lastMove == "" then + d_turn = "w" + end + -- castling rights + local d_castling = castling_to_string( + meta:get_int("castlingWhiteR") == 1, + meta:get_int("castlingWhiteL") == 1, + meta:get_int("castlingBlackR") == 1, + meta:get_int("castlingBlackL") == 1) + -- en passant possible? + local double_step = meta:get_int("prevDoublePawnStepTo") + local d_en_passant = en_passant_to_string(double_step) + + -- The halfmove clock counts for how many consecutive halfmoves + -- have been made with no pawn advancing and no piece being captured + local d_halfmove_clock = meta:get_int("halfmoveClock") + + -- fullmove starts at 1 and should count up every time black moves + local d_fullmove = tostring(get_current_fullmove(meta) + 1) + + local debug_str = d_turn .. " " .. d_castling .. " " .. d_en_passant .. " " .. d_halfmove_clock .. " " .. d_fullmove + debug_formstring = "label[7.9,10.2;DEBUG: "..debug_str.."]" + end + + local moves_list = "" + if mlistlen > 0 then + -- Moves list (show only if not empty) + moves_list = "table[9.9,1.25;5.45,4;moves;" .. moves .. ";"..mlistlen.."]" + end + + local formspec = fs .. + "label[2.2,0.652;" .. turnBlack .. minetest.formspec_escape(status_black) .. "]" .. + blackArr .. + "label[2.2,10.21;" .. turnWhite .. minetest.formspec_escape(status_white) .. "]" .. + whiteArr .. + moves_list .. + promotion_formstring .. + draw_claim_formstring .. + eaten_img .. + game_buttons .. + debug_formstring + + meta:set_string("formspec", formspec) +end + +local function update_game_result(pos, meta, lastMove) + local inv = meta:get_inventory() + local board_t = realchess.board_inv_to_table(inv) + + local playerWhite = meta:get_string("playerWhite") + local playerBlack = meta:get_string("playerBlack") + local prevDoublePawnStepTo = meta:get_int("prevDoublePawnStepTo") + local castlingRights = { + castlingWhiteR = meta:get_int("castlingWhiteR"), + castlingWhiteL = meta:get_int("castlingWhiteL"), + castlingBlackR = meta:get_int("castlingBlackR"), + castlingBlackL = meta:get_int("castlingBlackL"), + } + + update_formspec(meta) + local blackCanMove = false + local whiteCanMove = false + + local blackMoves = realchess.get_theoretical_moves_for(board_t, "black", prevDoublePawnStepTo, castlingRights) + local whiteMoves = realchess.get_theoretical_moves_for(board_t, "white", prevDoublePawnStepTo, castlingRights) + if next(blackMoves) then + blackCanMove = true + end + if next(whiteMoves) then + whiteCanMove = true + end + + local black_king_idx, white_king_idx = realchess.locate_kings(board_t) + if not black_king_idx or not white_king_idx then + minetest.log("error", "[xdecor] Chess: Insufficient kings on chessboard!") + return + end + + local checkPlayer, king_idx, checkMoves + if lastMove == "black" or lastMove == "" then + checkPlayer = "white" + checkMoves = whiteMoves + king_idx = white_king_idx + else + checkPlayer = "black" + checkMoves = blackMoves + king_idx = black_king_idx + end + + -- King attacked? + local isKingAttacked = realchess.attacked(checkPlayer, king_idx, board_t) + if isKingAttacked then + meta:set_string(checkPlayer.."Attacked", "true") + end + + -- If not safe moves left, player can't move + local safe_moves, safe_moves_count = realchess.get_king_safe_moves(checkMoves, board_t, checkPlayer) + if safe_moves_count == 0 then + if checkPlayer == "black" then + blackCanMove = false + else + whiteCanMove = false + end + end + + local playerWhiteDisplay = get_display_player_name(meta, "white") + local playerBlackDisplay = get_display_player_name(meta, "black") + local botColor = meta:get_string("botColor") + + if lastMove == "white" and not blackCanMove then + if meta:get_string("blackAttacked") == "true" then + -- black was checkmated + meta:set_string("gameResult", "whiteWon") + meta:set_string("gameResultReason", "checkmate") + chessbot.cancel_job(pos) + add_special_to_moves_list(meta, "whiteWon") + --~ Chess message. @1 = opponent name + send_message(playerWhite, S("You have checkmated @1. You win!", playerBlackDisplay), "white", botColor) + --~ Chess message. @1 = opponent name + send_message(playerBlack, S("You were checkmated by @1. You lose!", playerWhiteDisplay), "black", botColor) + minetest.log("action", "[xdecor] Chess: "..playerWhite.." won against "..playerBlack.." by checkmate") + return + else + -- stalemate + meta:set_string("gameResult", "draw") + meta:set_string("gameResultReason", "stalemate") + chessbot.cancel_job(pos) + add_special_to_moves_list(meta, "draw") + --~ Chess message + send_message_2(playerWhite, playerBlack, S("The game ended up in a stalemate! It's a draw!"), botColor) + minetest.log("action", "[xdecor] Chess: A game between "..playerWhite.." and "..playerBlack.." ended in a draw by stalemate") + return + end + end + if lastMove == "black" and not whiteCanMove then + if meta:get_string("whiteAttacked") == "true" then + -- white was checkmated + meta:set_string("gameResult", "blackWon") + meta:set_string("gameResultReason", "checkmate") + chessbot.cancel_job(pos) + add_special_to_moves_list(meta, "blackWon") + --~ Chess message. @1 = opponent name + send_message(playerBlack, S("You have checkmated @1. You win!", playerWhiteDisplay), "white", botColor) + --~ Chess message. @1 = opponent name + send_message(playerWhite, S("You were checkmated by @1. You lose!", playerBlackDisplay), "white", botColor) + minetest.log("action", "[xdecor] Chess: "..playerBlack .." won against "..playerWhite.." by checkmate") + return + else + -- stalemate + meta:set_string("gameResult", "draw") + meta:set_string("gameResultReason", "stalemate") + chessbot.cancel_job(pos) + add_special_to_moves_list(meta, "draw") + --~ Chess message + send_message_2(playerWhite, playerBlack, S("The game ended up in a stalemate! It's a draw!"), botColor) + minetest.log("action", "[xdecor] Chess: A game between "..playerWhite.." and "..playerBlack.." ended in a draw by stalemate") + return + end + end + + -- Is this a dead position? + if is_dead_position(board_t) then + meta:set_string("gameResult", "draw") + meta:set_string("gameResultReason", "dead_position") + chessbot.cancel_job(pos) + add_special_to_moves_list(meta, "draw") + --~ Chess message + send_message_2(playerWhite, playerBlack, S("The game ended up in a dead position! It's a draw!"), botColor) + minetest.log("action", "[xdecor] Chess: A game between "..playerWhite.." and "..playerBlack.." ended in a draw by dead position") + end + + local drawClaim = meta:get_string("drawClaim") + -- 75-move rule. Automatically draw game if the last 75 moves of EACH player (thus 150 halfmoves) + -- neither moved a pawn or captured a piece. + -- Important: This rule MUST be checked AFTER checkmate because checkmate takes precedence. + if meta:get_int("halfmoveClock") >= DRAWCLAIM_LONGGAME_FORCE then + meta:set_string("gameResult", "draw") + meta:set_string("gameResultReason", "75_move_rule") + chessbot.cancel_job(pos) + add_special_to_moves_list(meta, "draw") + --~ Chess message + local msg = S("No piece was captured and no pawn was moved for 75 consecutive moves of each player. It's a draw!") + send_message_2(playerWhite, playerBlack, msg, botColor) + minetest.log("action", "[xdecor] Chess: A game between "..playerWhite.." and "..playerBlack.." ended in a draw via the 75-move rule") + -- 50-move rule, after a player issued a draw claim for their next move. + -- If no pawn moved nor a piece was captured for >= 100 halfmoves, the game is drawn. + elseif meta:get_int("halfmoveClock") >= DRAWCLAIM_LONGGAME_PLAYER and drawClaim == "50_move_rule" then + meta:set_string("drawClaim", "") + meta:set_string("gameResult", "draw") + meta:set_string("gameResultReason", "50_move_rule") + chessbot.cancel_job(pos) + add_special_to_moves_list(meta, "draw") + update_formspec(meta) + local claimer, other + if lastMove == "black" or lastMove == "" then + claimer = playerBlack + claimerDisplay = playerBlackDisplay + other = playerWhite + else + claimer = playerWhite + claimerDisplay = playerWhiteDisplay + other = playerBlack + end + --~ Chess message + send_message(claimer, S("You have drawn the game by invoking the 50-move rule."), botColor) + if claimer ~= other then + --~ Chess message. @1 = player name + send_message(other, S("@1 has drawn the game by invoking the 50-move rule.", claimerDisplay), botColor) + end + minetest.log("action", "[xdecor] Chess: A game between "..playerWhite.." and "..playerBlack.." ended in a draw because "..claimer.." has invoked the 50-move rule") + elseif drawClaim == "50_move_rule" then + local claimer, other + if lastMove == "black" or lastMove == "" then + claimer = playerBlack + claimerDisplay = playerBlackDisplay + other = playerWhite + else + claimer = playerWhite + claimerDisplay = playerWhiteDisplay + other = playerBlack + end + --~ Chess message shown when player has invoked a rule to claim a draw and had to make a game-drawing move but instead made a different move + send_message(claimer, S("You have failed to make a game-drawing move. The game continues."), botColor) + if claimer ~= other then + --~ Chess message shown when player (name = @1) has invoked the 50-move rule to claim a draw and had to make a game-drawing move but instead made a different move + send_message(other, S("@1 made a draw claim using the 50-move rule but it was false. The game continues.", claimerDisplay), botColor) + end + end + + -- Draw if same position appeared >= 5 times + -- or if it appeared >= 3 times and the player claimed the draw previously + -- First, generate the position history + local forceRepetitionDraw = false + local chosenRepetitionDraw = false + local positions, first_p = get_positions_history(meta) + -- Then count the repeated positions + local _, lastOccurred = count_repeated_positions(positions, first_p) + if lastOccurred >= 3 then + chosenRepetitionDraw = true + end + if lastOccurred >= 5 then + forceRepetitionDraw = true + end + if CHESS_DEBUG then + -- Show last position + local last_position = positions[#positions] + local msg = "Current position: \"" .. last_position .. "\"" + send_message_2(playerWhite, playerBlack, msg, botColor) + + -- Compare the last position with the actual chessboard + -- to automatically test if the position history is still valid + local pos_split = last_position:split(" ") + local p_board = pos_split[1] + local p_player = pos_split[2] + local p_castling = pos_split[3] + local p_en_passant = pos_split[4] + local errors = 0 + for b=1, #board_t do + local letter_real = board_t[b] + local piece = letter_to_piece(letter_real) + local letter_pos = string.sub(p_board, b, b) + if letter_real ~= letter_pos then + minetest.log("error", "[xdecor] Chess: Position history inconsistency on board index "..b..": '"..letter_pos.."' seen but '"..letter_real.."' expected") + end + end + -- Compare current player + if (lastMove == "black" or lastMove == "") and p_player ~= "w" then + minetest.log("error", "[xdecor] Chess: Position history inconsistency: Wrong player! '"..p_player.."' seen but 'w' expected") + elseif (lastMove == "white") and p_player ~= "b" then + minetest.log("error", "[xdecor] Chess: Position history inconsistency: Wrong player! '"..p_player.."' seen but 'b' expected") + end + -- Compare castling rights + local d_castling = castling_to_string( + meta:get_int("castlingWhiteR") == 1, + meta:get_int("castlingWhiteL") == 1, + meta:get_int("castlingBlackR") == 1, + meta:get_int("castlingBlackL") == 1) + if d_castling ~= p_castling then + minetest.log("error", "[xdecor] Chess: Position history inconsistency: Castling rights mismatch! '"..p_castling.."' seen but '"..d_castling.."' expected") + end + -- Compare en passant status + local double_step = meta:get_int("prevDoublePawnStepTo") + local d_en_passant = en_passant_to_string(double_step) + if d_en_passant ~= p_en_passant then + minetest.log("error", "[xdecor] Chess: Position history inconsistency: En passant status mismatch! '"..p_en_passant.."' seen but '"..d_en_passant.."' expected") + end + end + + -- fivefold repetition + if forceRepetitionDraw then + meta:set_string("gameResult", "draw") + meta:set_string("gameResultReason", "same_position_5") + chessbot.cancel_job(pos) + add_special_to_moves_list(meta, "draw") + --~ Chess message when a fivefold repetition has happened + local msg = S("The exact same position has occured 5 times. It's a draw!") + send_message_2(playerWhite, playerBlack, msg, botColor) + minetest.log("action", "[xdecor] Chess: A game between "..playerWhite.." and "..playerBlack.." ended in a draw because the same position has appeared 5 times") + + -- threefold repetition + elseif chosenRepetitionDraw and drawClaim == "same_position_3" then + meta:set_string("drawClaim", "") + meta:set_string("gameResult", "draw") + chessbot.cancel_job(pos) + meta:set_string("gameResultReason", "same_position_3") + add_special_to_moves_list(meta, "draw") + update_formspec(meta) + local claimer, claimerDisplay, other + if lastMove == "black" or lastMove == "" then + claimer = playerBlack + claimerDisplay = playerBlackDisplay + other = playerWhite + else + claimer = playerWhite + claimerDisplay = playerWhiteDisplay + other = playerBlack + end + --~ Chess message + send_message(claimer, S("You have drawn the game by invoking the threefold repetition rule."), botColor) + if claimer ~= other then + --~ Chess message. @1 = player name + send_message(other, S("@1 has drawn the game by invoking the threefold repetition rule.", claimerDisplay), botColor) + end + minetest.log("action", "[xdecor] Chess: A game between "..playerWhite.." and "..playerBlack.." ended in a draw because "..claimer.." has invoked the threefold repetition rule") + elseif drawClaim == "same_position_3" then + local claimer, other + if lastMove == "black" or lastMove == "" then + claimer = playerBlack + claimerDisplay = playerBlackDisplay + other = playerWhite + else + claimer = playerWhite + claimerDisplay = playerWhiteDisplay + other = playerBlack + end + send_message(claimer, S("You have failed to make a game-drawing move. The game continues."), botColor) + if claimer ~= other then + --~ Chess message shown when player (name = @1) has invoked the threefold repetition rule to claim a draw and had to make a game-drawing move but instead made a different move + send_message(other, S("@1 made a draw claim using the threefold repetition rule but it was false. The game continues.", claimerDisplay), botColor) + end + end + + meta:set_string("drawClaim", "") +end + + +function realchess.init(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + meta:set_string("formspec", fs_init) + meta:set_string("infotext", S("Chess Board")) + meta:set_string("playerBlack", "") + meta:set_string("playerWhite", "") + meta:set_string("botColor", "") + meta:set_string("lastMove", "") + meta:set_string("gameResult", "") + meta:set_string("gameResultReason", "") + meta:set_string("drawClaim", "") + meta:set_string("blackAttacked", "") + meta:set_string("whiteAttacked", "") + meta:set_string("promotionActive", "") + + -- Records the world gametime (in seconds) at which the last move + -- was made, or, if none was made, the gametime of the start of the game. + -- If no game is ongoing, this is 0. + meta:set_int("lastMoveTime", 0) + meta:set_int("castlingBlackL", 1) + meta:set_int("castlingBlackR", 1) + meta:set_int("castlingWhiteL", 1) + meta:set_int("castlingWhiteR", 1) + meta:set_int("promotionPawnFromIdx", 0) + meta:set_int("promotionPawnToIdx", 0) + meta:set_int("prevDoublePawnStepTo", 0) + meta:set_int("halfmoveClock", 0) + + meta:set_string("moves_raw", "") + meta:set_string("eaten", "") + meta:set_string("mode", "") + + inv:set_list("board", starting_grid) + inv:set_size("board", 64) + + -- Clear legacy metadata + meta:set_string("moves", "") + meta:set_string("eaten_img", "") + + -- Cancel all chessbot jobs for this pos + -- that might still be active from a previous chessboard + -- or board state + chessbot.cancel_job(pos) +end + +-- The move logic of Chess. +-- This is meant to be called when a player *ATTEMPTS* to move a piece +-- from one slot of the inventory to another one and reacts accordingly. +-- If the move is valid, the inventory is changed to reflect the new +-- situation, and the game state and UI is upated as well and true +-- is returned. +-- If the move is invalid, nothing happens and false is returned. +-- Note: The move can also be done by a computer player. +-- +-- * pos: Chessboard position +-- * meta: Chessboard node metadata +-- * from_list: Inventory list of source square +-- * from_index: Inventory index of source square +-- * to_list: Inventory list of destination square +-- * to_index: Inventory list of destination square +-- * playerName: Name of player to move +function realchess.move(pos, meta, from_list, from_index, to_list, to_index, playerName) + if from_list ~= "board" or to_list ~= "board" then + return false + end + + local promo = meta:get_string("promotionActive") + if promo ~= "" then + -- Can't move when waiting for selecting a pawn promotion + return false + end + local gameResult = meta:get_string("gameResult") + if gameResult ~= "" then + -- No moves if game is over + return false + end + + local inv = meta:get_inventory() + local pieceFrom = inv:get_stack(from_list, from_index):get_name() + local pieceTo = inv:get_stack(to_list, to_index):get_name() + local lastMove = meta:get_string("lastMove") + local playerWhite = meta:get_string("playerWhite") + local playerBlack = meta:get_string("playerBlack") + local prevDoublePawnStepTo = meta:get_int("prevDoublePawnStepTo") + local kingMoved = false + local thisMove -- Will replace lastMove when move is legal + + -- Forbid to move non-Chess pieces on the board + if minetest.get_item_group(pieceFrom, "chess_piece") == 0 then + return false + elseif pieceTo ~= "" and minetest.get_item_group(pieceTo, "chess_piece") == 0 then + return false + end + + if realchess.get_piece_color(pieceFrom) == "white" then + if playerWhite ~= "" and playerWhite ~= playerName then + --~ Chess message when player tries to move with someone else's pieces + send_message(playerName, S("Someone else plays white pieces!")) + return false + end + + if realchess.get_piece_color(pieceTo) == "white" then + -- Don't replace pieces of same color + return false + end + + if lastMove == "white" then + --~ Chess message + send_message(playerName, S("It's not your turn!")) + return + end + + playerWhite = playerName + thisMove = "white" + + elseif realchess.get_piece_color(pieceFrom) == "black" then + if playerBlack ~= "" and playerBlack ~= playerName then + --~ Chess message when player tries to move with someone else's pieces + send_message(playerName, S("Someone else plays black pieces!")) + return false + end + + if realchess.get_piece_color(pieceTo) == "black" then + -- Don't replace pieces of same color + return false + end + + if lastMove == "black" then + send_message(playerName, S("It's not your turn!")) + return false + end + + if lastMove == "" then + -- Nobody has moved yet, and Black cannot move first + --~ Chess message + send_message(playerName, S("Black cannot move first!")) + return false + end + + playerBlack = playerName + thisMove = "black" + end + + -- MOVE LOGIC + + local from_x, from_y = index_to_xy(from_index) + local to_x, to_y = index_to_xy(to_index) + + local promotion = false + local doublePawnStep = nil + local en_passant_target = nil + local lostCastlingRightRook = nil + local resetHalfmoveClock = false + + -- PAWN + if pieceFrom:sub(11,14) == "pawn" then + if thisMove == "white" then + local pawnWhiteMove = inv:get_stack(from_list, xy_to_index(from_x, from_y - 1)):get_name() + -- white pawns can go up only + if from_y - 1 == to_y then + -- single step + if from_x == to_x then + if pieceTo ~= "" then + return false + elseif to_index >= 1 and to_index <= 8 then + -- activate promotion + promotion = true + end + resetHalfmoveClock = true + elseif from_x - 1 == to_x or from_x + 1 == to_x then + if to_index >= 1 and to_index <= 8 and realchess.get_piece_color(pieceTo) == "black" then + -- activate promotion + promotion = true + end + resetHalfmoveClock = true + else + return false + end + elseif from_y - 2 == to_y then + -- double step + if pieceTo ~= "" or from_y < 6 or pawnWhiteMove ~= "" then + return false + end + -- store the destination of this double step in meta (needed for en passant check) + doublePawnStep = to_index + resetHalfmoveClock = true + else + return false + end + + --[[ + if x not changed + ensure that destination cell is empty + elseif x changed one unit left or right + ensure the pawn is killing opponent piece + else + move is not legal - abort + ]] + + if from_x == to_x then + if pieceTo ~= "" then + return false + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + -- capture + local can_capture = false + if realchess.get_piece_color(pieceTo) == "black" then + -- normal capture + can_capture = true + else + -- en passant + local board_t = realchess.board_inv_to_table(inv) + if can_capture_en_passant(board_t, "black", xy_to_index(to_x, from_y), prevDoublePawnStepTo) then + can_capture = true + en_passant_target = xy_to_index(to_x, from_y) + end + end + if not can_capture then + return false + end + resetHalfmoveClock = true + else + return false + end + + elseif thisMove == "black" then + local pawnBlackMove = inv:get_stack(from_list, xy_to_index(from_x, from_y + 1)):get_name() + -- black pawns can go down only + if from_y + 1 == to_y then + -- single step + if from_x == to_x then + if pieceTo ~= "" then + return false + elseif to_index >= 57 and to_index <= 64 then + -- activate promotion + promotion = true + end + resetHalfmoveClock = true + elseif from_x - 1 == to_x or from_x + 1 == to_x then + if to_index >= 57 and to_index <= 64 and realchess.get_piece_color(pieceTo) == "white" then + -- activate promotion + promotion = true + end + resetHalfmoveClock = true + else + return false + end + elseif from_y + 2 == to_y then + -- double step + if pieceTo ~= "" or from_y > 1 or pawnBlackMove ~= "" then + return false + end + -- store the destination of this double step in meta (needed for en passant check) + doublePawnStep = to_index + resetHalfmoveClock = true + else + return false + end + + --[[ + if x not changed + ensure that destination cell is empty + elseif x changed one unit left or right + ensure the pawn is killing opponent piece + else + move is not legal - abort + ]] + + if from_x == to_x then + if pieceTo ~= "" then + return false + end + elseif from_x - 1 == to_x or from_x + 1 == to_x then + -- capture + local can_capture = false + if realchess.get_piece_color(pieceTo) == "white" then + -- normal capture + can_capture = true + else + -- en passant + local board_t = realchess.board_inv_to_table(inv) + if can_capture_en_passant(board_t, "white", xy_to_index(to_x, from_y), prevDoublePawnStepTo) then + can_capture = true + en_passant_target = xy_to_index(to_x, from_y) + end + end + if not can_capture then + return false + end + resetHalfmoveClock = true + else + return false + end + else + return false + end + + -- ROOK + elseif pieceFrom:sub(11,14) == "rook" then + if from_x == to_x then + -- Moving vertically + if from_y < to_y then + -- Moving down + -- Ensure that no piece disturbs the way + for i = from_y + 1, to_y - 1 do + if inv:get_stack(from_list, xy_to_index(from_x, i)):get_name() ~= "" then + return false + end + end + else + -- Moving up + -- Ensure that no piece disturbs the way + for i = to_y + 1, from_y - 1 do + if inv:get_stack(from_list, xy_to_index(from_x, i)):get_name() ~= "" then + return false + end + end + end + elseif from_y == to_y then + -- Moving horizontally + if from_x < to_x then + -- moving right + -- ensure that no piece disturbs the way + for i = from_x + 1, to_x - 1 do + if inv:get_stack(from_list, xy_to_index(i, from_y)):get_name() ~= "" then + return false + end + end + else + -- Moving left + -- Ensure that no piece disturbs the way + for i = to_x + 1, from_x - 1 do + if inv:get_stack(from_list, xy_to_index(i, from_y)):get_name() ~= "" then + return false + end + end + end + else + -- Attempt to move arbitrarily -> abort + return false + end + + -- Lose castling right when moving rook + if thisMove == "white" then + if from_index == 57 then + -- queenside white rook + lostCastlingRightRook = "castlingWhiteL" + elseif from_index == 64 then + -- kingside white rook + lostCastlingRightRook = "castlingWhiteR" + end + elseif thisMove == "black" then + if from_index == 1 then + -- queenside black rook + lostCastlingRightRook = "castlingBlackL" + elseif from_index == 8 then + -- kingside black rook + lostCastlingRightRook = "castlingBlackR" + end + end + + -- KNIGHT + elseif pieceFrom:sub(11,16) == "knight" then + -- Get relative pos + local dx = from_x - to_x + local dy = from_y - to_y + + -- Get absolute values + if dx < 0 then dx = -dx end + if dy < 0 then dy = -dy end + + -- Sort x and y + if dx > dy then dx, dy = dy, dx end + + -- Ensure that dx == 1 and dy == 2 + if dx ~= 1 or dy ~= 2 then + return false + end + -- Just ensure that destination cell does not contain friend piece + -- ^ It was done already thus everything ok + + -- BISHOP + elseif pieceFrom:sub(11,16) == "bishop" then + -- Get relative pos + local dx = from_x - to_x + local dy = from_y - to_y + + -- Get absolute values + if dx < 0 then dx = -dx end + if dy < 0 then dy = -dy end + + -- Ensure dx and dy are equal + if dx ~= dy then return false end + + if from_x < to_x then + if from_y < to_y then + -- Moving right-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x + i, from_y + i)):get_name() ~= "" then + return false + end + end + else + -- Moving right-up + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x + i, from_y - i)):get_name() ~= "" then + return false + end + end + end + else + if from_y < to_y then + -- Moving left-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x - i, from_y + i)):get_name() ~= "" then + return false + end + end + else + -- Moving left-up + -- ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x - i, from_y - i)):get_name() ~= "" then + return false + end + end + end + end + + -- QUEEN + elseif pieceFrom:sub(11,15) == "queen" then + local dx = from_x - to_x + local dy = from_y - to_y + + -- Get absolute values + if dx < 0 then dx = -dx end + if dy < 0 then dy = -dy end + + -- Ensure valid relative move + if dx ~= 0 and dy ~= 0 and dx ~= dy then + return false + end + + if from_x == to_x then + if from_y < to_y then + -- Goes down + -- Ensure that no piece disturbs the way + for i = from_y + 1, to_y - 1 do + if inv:get_stack(from_list, xy_to_index(from_x, i)):get_name() ~= "" then + return false + end + end + else + -- Goes up + -- Ensure that no piece disturbs the way + for i = to_y + 1, from_y - 1 do + if inv:get_stack(from_list, xy_to_index(from_x, i)):get_name() ~= "" then + return false + end + end + end + elseif from_x < to_x then + if from_y == to_y then + -- Goes right + -- Ensure that no piece disturbs the way + for i = from_x + 1, to_x - 1 do + if inv:get_stack(from_list, xy_to_index(i, from_y)):get_name() ~= "" then + return false + end + end + elseif from_y < to_y then + -- Goes right-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x + i, from_y + i)):get_name() ~= "" then + return false + end + end + else + -- Goes right-up + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x + i, from_y - i)):get_name() ~= "" then + return false + end + end + end + else + if from_y == to_y then + -- Goes left + -- Ensure that no piece disturbs the way and destination cell does + for i = to_x + 1, from_x - 1 do + if inv:get_stack(from_list, xy_to_index(i, from_y)):get_name() ~= "" then + return false + end + end + elseif from_y < to_y then + -- Goes left-down + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x - i, from_y + i)):get_name() ~= "" then + return false + end + end + else + -- Goes left-up + -- Ensure that no piece disturbs the way + for i = 1, dx - 1 do + if inv:get_stack( + from_list, xy_to_index(from_x - i, from_y - i)):get_name() ~= "" then + return false + end + end + end + end + + -- KING + elseif pieceFrom:sub(11,14) == "king" then + local dx = from_x - to_x + local dy = from_y - to_y + local check = true + local inv = meta:get_inventory() + local board_t = realchess.board_inv_to_table(inv) + local castlingRights = { + castlingWhiteR = meta:get_int("castlingWhiteR"), + castlingWhiteL = meta:get_int("castlingWhiteL"), + castlingBlackR = meta:get_int("castlingBlackR"), + castlingBlackL = meta:get_int("castlingBlackL"), + } + + -- Castling + local cc, rook_start, rook_goal, rook_name = can_castle(board_t, from_index, to_index, castlingRights) + if cc then + inv:set_stack(from_list, rook_goal, rook_name) + inv:set_stack(from_list, rook_start, "") + check = false + kingMoved = true + end + + if check then + if dx < 0 then + dx = -dx + end + + if dy < 0 then + dy = -dy + end + + if dx > 1 or dy > 1 then + return false + end + end + kingMoved = true + + end + + local board_t = realchess.board_inv_to_table(inv) + board_t[to_index] = board_t[from_index] + board_t[from_index] = "." + + local black_king_idx, white_king_idx = realchess.locate_kings(board_t) + if not black_king_idx or not white_king_idx then + minetest.log("error", "[xdecor] Chess: Insufficient kings on chessboard!") + return false + end + local blackAttacked = realchess.attacked("black", black_king_idx, board_t) + local whiteAttacked = realchess.attacked("white", white_king_idx, board_t) + + -- Refuse to move if it would put or leave the own king + -- under attack + if blackAttacked and thisMove == "black" then + return false + end + if whiteAttacked and thisMove == "white" then + return false + end + + if pieceTo ~= "" then + resetHalfmoveClock = true + end + + -- The halfmove clock counts the number of consecutive halfmoves + -- in which neither a pawn was moved nor a piece was captured. + if resetHalfmoveClock then + meta:set_int("halfmoveClock", 0) + else + meta:set_int("halfmoveClock", meta:get_int("halfmoveClock") + 1) + end + + if en_passant_target then + -- Capture pawn en passant + local capturedPiece = inv:get_stack(to_list, en_passant_target):get_name() + inv:set_stack(to_list, en_passant_target, "") + add_to_eaten_list(meta, capturedPiece) + end + + if kingMoved and thisMove == "white" then + meta:set_int("castlingWhiteL", 0) + meta:set_int("castlingWhiteR", 0) + elseif kingMoved and thisMove == "black" then + meta:set_int("castlingBlackL", 0) + meta:set_int("castlingBlackR", 0) + elseif lostCastlingRightRook then + meta:set_int(lostCastlingRightRook, 0) + end + + if promotion then + meta:set_string("promotionActive", thisMove) + meta:set_int("promotionPawnFromIdx", from_index) + meta:set_int("promotionPawnToIdx", to_index) + else + realchess.update_state(meta, from_index, to_index, thisMove) + end + + if doublePawnStep then + meta:set_int("prevDoublePawnStepTo", doublePawnStep) + else + meta:set_int("prevDoublePawnStepTo", 0) + end + + if meta:get_string("playerWhite") == "" then + meta:set_string("playerWhite", playerWhite) + -- If in singleplayer, the player moved a white piece first without + -- explicitly selecting a color, interpret this as the player wanting + -- to play as white + if meta:get_string("mode") == "single" and lastMove == "" and meta:get_string("gameResult") == "" then + meta:set_string("playerBlack", "*"..chessbot.name.."*") + meta:set_string("botColor", "black") + end + elseif meta:get_string("playerBlack") == "" then + meta:set_string("playerBlack", playerBlack) + end + + realchess.move_piece(pos, meta, pieceFrom, from_list, from_index, to_list, to_index) + + return true +end + +-- Causes the player ("white" or "blue") to resign +function realchess.resign(pos, meta, playerColor) + if playerColor == "black" then + meta:set_string("gameResult", "whiteWon") + meta:set_string("gameResultReason", "resign") + chessbot.cancel_job(pos) + add_special_to_moves_list(meta, "whiteWon") + update_formspec(meta) + elseif playerColor == "white" then + meta:set_string("gameResult", "blackWon") + meta:set_string("gameResultReason", "resign") + chessbot.cancel_job(pos) + add_special_to_moves_list(meta, "blackWon") + update_formspec(meta) + end +end + +local function timeout_format(timeout_limit) + local time_remaining = timeout_limit - minetest.get_gametime() + local minutes = math.floor(time_remaining / 60) + local seconds = time_remaining % 60 + + if minutes == 0 then + --~ number of seconds + return S("@1 s", seconds) + end + + --~ number of minutes and seconds + return S("@1 min @2 s", minutes, seconds) +end + +function realchess.fields(pos, _, fields, sender) + local playerName = sender:get_player_name() + local meta = minetest.get_meta(pos) + local timeout_limit = meta:get_int("lastMoveTime") + TIMEOUT + local playerWhite = meta:get_string("playerWhite") + local playerBlack = meta:get_string("playerBlack") + local lastMoveTime = meta:get_int("lastMoveTime") + local gameResult = meta:get_int("gameResult") + if fields.quit then return end + + if fields.single or fields.multi or fields.bot_vs_bot then + if fields.bot_vs_bot then + meta:set_string("lastMoveTime", minetest.get_gametime()) + if not CHESS_DEBUG then + -- Bot vs Bot only allowed in Chess Debug Mode + return + end + meta:set_string("mode", "bot_vs_bot") + meta:set_string("botColor", "both") + -- Add asterisk to bot names so it can't collide with a player name + -- (asterisk is forbidden in player names) + meta:set_string("playerWhite", "*"..S(chessbot.name).."*") + meta:set_string("playerBlack", "*"..S(chessbot.name).."*") + local inv = meta:get_inventory() + chessbot.move(pos, inv, meta) + elseif fields.single then + meta:set_string("mode", "single") + elseif fields.multi then + meta:set_string("lastMoveTime", minetest.get_gametime()) + meta:set_string("mode", "multi") + end + update_formspec(meta) + return + end + + local mode = meta:get_string("mode") + -- "Play as White/Black" button in Singleplayer when nobody has moved yet + if (fields.single_black or fields.single_white) and mode == "single" and meta:get_string("gameResult") == "" and meta:get_string("lastMove") == "" then + meta:set_string("lastMoveTime", minetest.get_gametime()) + if fields.single_white then + meta:set_string("botColor", "black") + meta:set_string("playerWhite", playerName) + meta:set_string("playerBlack", "*"..chessbot.name.."*") + update_formspec(meta) + else + meta:set_string("botColor", "white") + meta:set_string("playerWhite", "*"..chessbot.name.."*") + meta:set_string("playerBlack", playerName) + update_formspec(meta) + local inv = meta:get_inventory() + chessbot.move(pos, inv, meta) + end + return + end + + -- If the game is ongoing and no move was made for TIMEOUT seconds, + -- the game can be aborted by everyone. + -- Also allow instant reset before White and Black moved, + -- as well as in Bot vs Bot mode, as well + -- when the game ended. + if fields.new then + if mode == "bot_vs_bot" or (playerWhite == playerName or playerBlack == playerName or playerWhite == "" or playerBlack == "") or meta:get_string("gameResult") ~= "" then + realchess.init(pos) + + elseif lastMoveTime > 0 then + if minetest.get_gametime() >= timeout_limit and + (playerWhite ~= playerName or playerBlack ~= playerName) then + realchess.init(pos) + else + send_message(playerName, + S("You can't reset the chessboard, a game has been started. Try again in @1.", + timeout_format(timeout_limit))) + end + end + return + end + + if fields.resign and mode ~= "bot_vs_bot" then + local lastMove = meta:get_string("lastMove") + if (playerName == playerWhite and playerWhite == "") or (playerName == playerBlack and playerBlack == "") then + -- Can't resign before the player name has been recorded + --~ Chess message when player tried to resign too early + send_message(playerName, S("Resigning is not possible yet.")) + return + end + local winner, loser, whiteWon + if playerWhite == playerBlack and playerWhite == playerName and playerWhite ~= "" then + if lastMove == "black" then + winner = playerBlack + loser = playerWhite + whiteWon = false + else + winner = playerWhite + loser = playerBlack + whiteWon = true + end + elseif playerName == playerWhite and playerWhite ~= "" then + winner = playerBlack + loser = playerWhite + whiteWon = false + elseif playerName == playerBlack and playerBlack ~= "" then + winner = playerWhite + loser = playerBlack + whiteWon = true + end + if winner and loser then + if whiteWon then + realchess.resign(pos, meta, "black") + else + realchess.resign(pos, meta, "white") + end + + --~ Chess message when player resigned (gave up) + send_message(loser, S("You have resigned.")) + if playerWhite ~= playerBlack then + --~ Chess message when player resigned (gave up). @1 = opponent name + send_message(winner, S("@1 has resigned. You win!", loser)) + end + minetest.log("action", "[xdecor] Chess: "..loser.." has resigned from the game against "..winner) + update_formspec(meta) + else + --~ Chess message + send_message(playerName, S("You can't resign, you're not playing in this game.")) + end + return + end + + -- Claim or declare draw via the 50-move rule + if fields.draw_50_moves then + local botColor = meta:get_string("botColor") + local lastMove = meta:get_string("lastMove") + if playerWhite == "" and playerBlack == "" or lastMove == "" then + return + end + local currentPlayer + if lastMove == "black" or lastMove == "" then + currentPlayer = "white" + else + currentPlayer = "black" + end + + local claimer, other + if (currentPlayer == "white" and playerWhite == playerName) then + claimer = playerWhite + other = playerBlack + elseif (currentPlayer == "black" and playerBlack == playerName) then + claimer = playerBlack + other = playerWhite + else + --~ Chess message + send_message(playerName, S("You can't claim a draw, it's not your turn!")) + return + end + + local halfmoveClock = meta:get_int("halfmoveClock") + if halfmoveClock >= DRAWCLAIM_LONGGAME_PLAYER then + meta:set_string("gameResult", "draw") + meta:set_string("gameResultReason", "50_move_rule") + add_special_to_moves_list(meta, "draw") + update_formspec(meta) + --~ Chess message + send_message(claimer, S("You have drawn the game by invoking the 50-move rule."), botColor) + if claimer ~= other then + --~ Chess message. @1 = player name + send_message(other, S("@1 has drawn the game by invoking the 50-move rule.", claimer), botColor) + end + minetest.log("action", "[xdecor] Chess: A game between "..playerWhite.." and "..playerBlack.." ended in a draw because "..claimer.." has invoked the 50-move rule") + else + meta:set_string("drawClaim", "50_move_rule") + update_formspec(meta) + end + + return + end + + -- Claim or declare draw via the threefold repetition rule (same position occured >= 3 times) + if fields.draw_repeat_3 then + local botColor = meta:get_string("botColor") + local lastMove = meta:get_string("lastMove") + if playerWhite == "" and playerBlack == "" or lastMove == "" then + return + end + local currentPlayer + if lastMove == "black" or lastMove == "" then + currentPlayer = "white" + else + currentPlayer = "black" + end + + local claimer, other + if (currentPlayer == "white" and playerWhite == playerName) then + claimer = playerWhite + other = playerBlack + elseif (currentPlayer == "black" and playerBlack == playerName) then + claimer = playerBlack + other = playerWhite + else + send_message(playerName, S("You can't claim a draw, it's not your turn!")) + return + end + + local positions, first_p = get_positions_history(meta) + local _, lastOccurred = count_repeated_positions(positions, first_p) + if lastOccurred >= 3 then + meta:set_string("gameResult", "draw") + meta:set_string("gameResultReason", "same_position_3") + add_special_to_moves_list(meta, "draw") + update_formspec(meta) + --~ Chess message + send_message(claimer, S("You have drawn the game by invoking the threefold repetition rule."), botColor) + if claimer ~= other then + --~ Chess message. @1 = player name + send_message(other, S("@1 has drawn the game by invoking the threefold repetition rule.", claimer), botColor) + end + minetest.log("action", "[xdecor] Chess: A game between "..playerWhite.." and "..playerBlack.." ended in a draw because "..claimer.." has invoked the threefold repetition rule") + else + meta:set_string("drawClaim", "same_position_3") + update_formspec(meta) + end + return + end + + local promotions = { + "queen_white", "rook_white", "bishop_white", "knight_white", + "queen_black", "rook_black", "bishop_black", "knight_black", + } + for p=1, #promotions do + local gameResult = meta:get_string("gameResult") + if gameResult ~= "" then + return + end + local promo = promotions[p] + if fields["p_"..promo] then + if not (playerName == playerWhite or playerName == playerBlack) then + send_message(playerName, S("You're only a spectator in this game of Chess.")) + return + end + local pcolor = promo:sub(-5) + local activePromo = meta:get_string("promotionActive") + if activePromo == "" then + --~ Chess message when player tried to promote a pawn when it's not legal + send_message(playerName, S("This isn't the time for promotion.")) + return + elseif activePromo ~= pcolor then + --~ Chess message when player tried to promote a pawn when it's not their turn + send_message(playerName, S("It's not your turn! This promotion is meant for the other player.")) + return + end + if pcolor == "white" and playerName == playerWhite or pcolor == "black" and playerName == playerBlack then + realchess.promote_pawn(pos, meta, pcolor, promo:sub(1, -7)) + return + else + send_message(playerName, S("It's not your turn! This promotion is meant for the other player.")) + return + end + end + end +end + +function realchess.after_destruct(pos) + -- When board was destroyed, cancel any chessbot + -- job that might still be active from a running + -- game + chessbot.cancel_job(pos) +end + +function realchess.can_dig(pos, player) + if not player or not player:is_player() then + return false + end + -- Protection_bypass priv guarantees digging rights + if minetest.check_player_privs(player, "protection_bypass") then + return true + end + + local meta = minetest.get_meta(pos) + local playerName = player:get_player_name() + local timeout_limit = meta:get_int("lastMoveTime") + TIMEOUT + local lastMoveTime = meta:get_int("lastMoveTime") + local playerWhite = meta:get_string("playerWhite") + local playerBlack = meta:get_string("playerBlack") + local botColor = meta:get_string("botColor") + + -- Bot matches always allow dig + if (meta:get_string("mode") == "bot_vs_bot") then + return true + elseif (meta:get_string("gameResult") ~= "") then + -- If the game was completed, the board is free to be dug + return true + -- If no game is ongoing, board is free to be dug + elseif (lastMoveTime == 0) then + return true + -- If the game is ongoing and no move was made for TIMEOUT seconds, + -- the board is free to be dug + elseif minetest.get_gametime() >= timeout_limit then + return true + else + if playerName == playerWhite or playerName == playerBlack or botColor == "both" then + send_message(playerName, + --~ Shown when player tried to dig a chessboard but is not allowed to. @1 = time + S("You can't dig the chessboard, a game has been started. " .. + "Reset it first or dig it again in @1.", + timeout_format(timeout_limit))) + else + send_message(playerName, + --~ Shown when player tried to dig a chessboard but is not allowed to. @1 = time + S("You can't dig the chessboard, a game has been started. " .. + "Try it again in @1.", + timeout_format(timeout_limit))) + end + return false + end +end + +-- Helper function for realchess.move. +-- To be called when a valid normal move should be taken. +-- Will also update the state for the Chessboard. +function realchess.move_piece(pos, meta, pieceFrom, from_list, from_index, to_list, to_index) + local inv = meta:get_inventory() + local pieceTo = inv:get_stack(to_list, to_index):get_name() + + -- Update inventory slots + inv:set_stack(from_list, from_index, "") + inv:set_stack(to_list, to_index, pieceFrom) + + -- Report the eaten piece + if pieceTo ~= "" then + add_to_eaten_list(meta, pieceTo) + end + + local lastMove = meta:get_string("lastMove") + if lastMove == "" then lastMove = "black" end + + local promo = meta:get_string("promotionActive") ~= "" + if not promo then + update_game_result(pos, meta, lastMove) + lastMove = meta:get_string("lastMove") + if lastMove == "" then lastMove = "black" end + end + update_formspec(meta) + + local botColor = meta:get_string("botColor") + if botColor == "" then botColor = "black" end + local mode = meta:get_string("mode") + local gameResult = meta:get_string("gameResult") + -- Let the bot play when it its turn + if (mode == "bot_vs_bot" or (mode == "single" and lastMove ~= botColor)) and gameResult == "" then + if not promo then + chessbot.move(pos, inv, meta) + else + chessbot.promote(pos, inv, meta, to_index) + end + end +end + +function realchess.update_state(meta, from_index, to_index, thisMove, promoteFrom, promoteTo) + local inv = meta:get_inventory() + local board_t = realchess.board_inv_to_table(inv) + local pieceTo = letter_to_piece(board_t[to_index]) + local pieceFrom = promoteFrom or letter_to_piece(board_t[from_index]) + + if not promoteFrom then + board_t[to_index] = board_t[from_index] + board_t[from_index] = "." + end + + local black_king_idx, white_king_idx = realchess.locate_kings(board_t) + if not black_king_idx or not white_king_idx then + minetest.log("error", "[xdecor] Chess: Insufficient kings on chessboard!") + return + end + local blackAttacked = realchess.attacked("black", black_king_idx, board_t) + local whiteAttacked = realchess.attacked("white", white_king_idx, board_t) + + if blackAttacked then + meta:set_string("blackAttacked", "true") + else + meta:set_string("blackAttacked", "") + end + + if whiteAttacked then + meta:set_string("whiteAttacked", "true") + else + meta:set_string("whiteAttacked", "") + end + + local lastMove = thisMove + meta:set_string("lastMove", lastMove) + meta:set_int("lastMoveTime", minetest.get_gametime()) + + local special + if promoteTo then + special = "promo__"..promoteTo + end + add_move_to_moves_list(meta, pieceFrom, pieceTo, from_index, to_index, special) +end + +function realchess.promote_pawn(pos, meta, color, promoteTo) + local inv = meta:get_inventory() + local pstr = promoteTo .. "_" .. color + local promoted = false + local to_idx = meta:get_int("promotionPawnToIdx") + local from_idx = meta:get_int("promotionPawnFromIdx") + if to_idx < 1 or from_idx < 1 then + return + end + if promoteTo ~= "queen" then + pstr = pstr .. "_1" + end + pstr = "realchess:" .. pstr + + local promoteFrom + if color == "white" then + promoteFrom = inv:get_stack("board", to_idx) + if promoteFrom:get_name():sub(11,14) == "pawn" then + inv:set_stack("board", to_idx, pstr) + promoted = true + end + elseif color == "black" then + promoteFrom = inv:get_stack("board", to_idx) + if promoteFrom:get_name():sub(11,14) == "pawn" then + inv:set_stack("board", to_idx, pstr) + promoted = true + end + end + if promoted then + meta:set_string("promotionActive", "") + meta:set_int("promotionPawnFromIdx", 0) + meta:set_int("promotionPawnToIdx", 0) + realchess.update_state(meta, from_idx, to_idx, color, promoteFrom:get_name(), pstr) + update_game_result(pos, meta, color) + update_formspec(meta) + + local botColor = meta:get_string("botColor") + if botColor == "" then botColor = "black" end + local lastMove = meta:get_string("lastMove") + if lastMove == "" then lastMove = "black" end + + local mode = meta:get_string("mode") + local gameResult = meta:get_string("gameResult") + if (mode == "bot_vs_bot" or (mode == "single" and lastMove ~= botColor)) and gameResult == "" then + chessbot.move(pos, inv, meta) + end + else + minetest.log("error", "[xdecor] Chess: Could not find pawn to promote!") + end +end + +function realchess.blast(pos) + minetest.remove_node(pos) +end + +local chessboarddef = { + description = S("Chess Board"), + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + inventory_image = "chessboard_top.png", + wield_image = "chessboard_top.png", + tiles = {"chessboard_top.png", "chessboard_top.png", "chessboard_sides.png"}, + use_texture_alpha = ALPHA_OPAQUE, + groups = {choppy=3, oddly_breakable_by_hand=2, flammable=3}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + node_box = {type = "fixed", fixed = {-.375, -.5, -.375, .375, -.4375, .375}}, + sunlight_propagates = true, + on_rotate = screwdriver.rotate_simple, +} +if ENABLE_CHESS_GAMES then + -- Extend chess board node definition if chess games are enabled + --~ Chess board tooltip + chessboarddef._tt_help = S("Play a game of Chess against another player or the computer") + chessboarddef.on_blast = realchess.blast + chessboarddef.can_dig = realchess.can_dig + chessboarddef.after_destruct = realchess.after_destruct + chessboarddef.on_construct = realchess.init + chessboarddef.on_receive_fields = realchess.fields + -- The move logic of Chess is here (at least for players) + chessboarddef.allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, _, player) + -- Normally, the allow function is meant to just check if an inventory move + -- is allowed but instead we abuse it to detect where the player is *attempting* + -- to move pieces to. + -- This function may manipulate the inventory. This is a bit dirty + -- because this is not really what the allow function is meant to do. + local meta = minetest.get_meta(pos) + local playerName + if player and player:is_player() then + playerName = player:get_player_name() + else + playerName = "" + minetest.log("error", "[xdecor] Chess: An unknown player tried to move a piece in the chessboard inventory") + end + realchess.move(pos, meta, from_list, from_index, to_list, to_index, playerName) + -- We always return 0 to disable all *builtin* inventory moves, since + -- we do it ourselves. This should be fine because there shouldn't be a + -- conflict between this mod and Luanti then. + return 0 + end + chessboarddef.allow_metadata_inventory_take = function() return 0 end + chessboarddef.allow_metadata_inventory_put = function() return 0 end + -- Note: There is no on_move function because we put the entire move handling + -- into the allow function above. The reason for this is of Luanti's + -- awkward behavior when swapping items. + + minetest.register_lbm({ + label = "Re-initialize chessboard (enable Chess games)", + name = "xdecor:chessboard_reinit", + nodenames = {"realchess:chessboard"}, + run_at_every_load = true, + action = function(pos, node) + -- Init chessboard only if neccessary + local meta = minetest.get_meta(pos) + if meta:get_string("formspec", "") then + realchess.init(pos) + end + end, + }) +else + minetest.register_lbm({ + label = "Clear chessboard formspec+infotext+inventory (disable Chess games)", + name = "xdecor:chessboard_clear", + nodenames = {"realchess:chessboard"}, + run_at_every_load = true, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "") + meta:set_string("infotext", "") + local inv = meta:get_inventory() + inv:set_size("board", 0) + end, + }) +end +minetest.register_node(":realchess:chessboard", chessboarddef) + +local function register_piece(name, idnum, white_letter, black_letter, white_desc, black_desc, count) + for _, color in pairs({"black", "white"}) do + + -- for chess_piece group rating + local g = idnum + if color == "black" then + g = -g + end + if not count then + minetest.register_craftitem(":realchess:" .. name .. "_" .. color, { + description = (color == "black") and black_desc or white_desc, + inventory_image = name .. "_" .. color .. ".png", + stack_max = 1, + -- chess_piece group declares this item to be a chess piece. + -- positive rating: white, negative rating: black + -- numeric absolute value declares piece type (pawn, rook, etc.) + groups = {chess_piece=g, not_in_creative_inventory=1} + }) + + local letter = (color == "black") and black_letter or white_letter + letters_to_pieces[letter] = "realchess:"..name.."_"..color + pieces_to_letters["realchess:"..name.."_"..color] = letter + else + -- For historic reasons, some pieces redundantly get registered multiple times, + -- one for each piece in the starting position. This was used in old + -- poorly programmed versions to check for the "identity" of pieces for + -- castling rights. The code has since been changed so that the identity of pieces + -- is irrelevant to gameplay, but the redundant pieces still exist for + -- compatibility reasons. + local letter = (color == "black") and black_letter or white_letter + for i = 1, count do + minetest.register_craftitem(":realchess:" .. name .. "_" .. color .. "_" .. i, { + description = (color == "black") and black_desc or white_desc, + inventory_image = name .. "_" .. color .. ".png", + stack_max = 1, + groups = {chess_piece=g, not_in_creative_inventory=1} + }) + pieces_to_letters["realchess:"..name.."_"..color.."_"..i] = letter + end + letters_to_pieces[letter] = "realchess:"..name.."_"..color.."_1" + end + end +end + +register_piece("pawn", PIECE_PAWN, "P", "p", + --~ chess piece + S("White Pawn"), + --~ chess piece + S("Black Pawn"), 8) +register_piece("rook", PIECE_ROOK, "R", "r", + --~ chess piece + S("White Rook"), + --~ chess piece + S("Black Rook"), 2) +register_piece("knight", PIECE_KNIGHT, "N", "n", + --~ chess piece + S("White Knight"), + --~ chess piece + S("Black Knight"), 2) +register_piece("bishop", PIECE_BISHOP, "B", "b", + --~ chess piece + S("White Bishop"), + --~ chess piece + S("Black Bishop"), 2) +register_piece("queen", PIECE_QUEEN, "Q", "q", + --~ chess piece + S("White Queen"), + --~ chess piece + S("Black Queen")) +register_piece("king", PIECE_KING, "K", "k", + --~ chess piece + S("White King"), + --~ chess piece + S("Black King")) + +-- Recipes + +minetest.register_craft({ + output = "realchess:chessboard", + recipe = { + {"dye:black", "dye:white", "dye:black"}, + {"stairs:slab_wood", "stairs:slab_wood", "stairs:slab_wood"} + } +}) + +--[[ Parse a chess position in Forsyth–Edwards Notation (FEN) +and return a table, or nil in case of a syntax error. +The table contains these fields: +* board_t: Board table (defined elsewhere) +* player: Player to move ("white" or "black") +* castlingRights: { + castlingWhiteL: 1 if White can castle queenside, 0 otherwise + castlingWhiteR: 1 if White can castle kingside, 0 otherwise + castlingBlackL: 1 if Black can castle queenside, 0 otherwise + castlingBlackR: 1 if Black can castle kingside, 0 otherwise +} +* halfmove: number of halfmoves since the last capture or pawn advance +* prevDoublePawnStepTo: if a pawn did a double-step in the previous move, + this is the numeric board index of the destination. If no pawn made a + double-step in the previous halfmove, this is 0 +* fullmove: counter that starts at one and is incremented by 1 each time Black has moved +]] +local function parse_fen(fen) + local fen_parts = string.split(fen, " ") + if not fen_parts or #fen_parts < 6 then + return nil + end + local fen_board = fen_parts[1] + local fen_player = fen_parts[2] + local fen_castling = fen_parts[3] + local fen_en_passant = fen_parts[4] + local fen_halfmove = tonumber(fen_parts[5]) + local fen_fullmove = tonumber(fen_parts[6]) + if not fen_halfmove or not fen_fullmove then + return nil + end + local board_t = {} + for b=1, string.len(fen_board) do + local p = string.sub(fen_board, b, b) + local pn = tonumber(p) + if type(pn) == "number" then + for i=1, pn do + table.insert(board_t, ".") + end + elseif p ~= "/" then + table.insert(board_t, p) + end + end + local player_to_move + if fen_player == "w" then + player_to_move = "white" + elseif fen_player == "b" then + player_to_move = "black" + else + return nil + end + local castlingRights = { + castlingWhiteL = 0, + castlingWhiteR = 0, + castlingBlackL = 0, + castlingBlackR = 0, + } + if fen_castling ~= "-" then + for c=1, string.len(fen_castling) do + local ca = string.sub(fen_castling, c, c) + if ca == "Q" then + castlingRights.castlingWhiteL = 1 + elseif ca == "K" then + castlingRights.castlingWhiteR = 1 + elseif ca == "q" then + castlingRights.castlingBlackL = 1 + elseif ca == "k" then + castlingRights.castlingBlackR = 1 + end + end + end + local prevDoublePawnStepTo = 0 + if fen_en_passant ~= "-" then + local rank = string.sub(fen_en_passant, 1,1) + local file = string.sub(fen_en_passant, 2,2) + local x, y + if rank == "a" then + x = 0 + elseif rank == "b" then + x = 1 + elseif rank == "c" then + x = 2 + elseif rank == "d" then + x = 3 + elseif rank == "e" then + x = 4 + elseif rank == "f" then + x = 5 + elseif rank == "g" then + x = 6 + elseif rank == "h" then + x = 7 + end + y = (tonumber(file) or 1) - 1 + if y == 3 then + y = 2 + elseif y == 4 then + y = 5 + end + local idx = xy_to_index(x, y) + prevDoublePawnStepTo = idx + end + + return { + board_t = board_t, + player = player_to_move, + castlingRights = castlingRights, + prevDoublePawnStepTo = prevDoublePawnStepTo, + halfmove = fen_halfmove, + fullmove = fen_fullmove, + } +end + +-- Count the number of legal moves from a given position given +-- in FEN. +local function get_moves_from_fen_position(fen) + local parsed_fen = parse_fen(fen) + + -- Count moves + local theoretical_moves = realchess.get_theoretical_moves_for(parsed_fen.board_t, parsed_fen.player, parsed_fen.prevDoublePawnStepTo, parsed_fen.castlingRights) + local safe_moves, safe_moves_count = realchess.get_king_safe_moves(theoretical_moves, parsed_fen.board_t, parsed_fen.player) + + return safe_moves, safe_moves_count +end + +do +local function perft_testing_suite() + -- Data from and converted to CSV. + -- CSV file uses the following roes: + -- Column 1: Chess position in FEN + -- Column 2: Number of moves this position (perft depth 1) + -- Column 3: Number of moves at perft depth 2 + -- Column 4: Number of moves at perft depth 3 + -- ... + local filepath = minetest.get_modpath("xdecor").."/testing/perftsuite.csv" + local iter = io.lines(filepath) + if not iter then + minetest.log("error", "[xdecor] Chess: Could not load perft testing suite") + end + local testnum = 0 + local errors = 0 + for line in io.lines(filepath) do + testnum = testnum + 1 + local spl = string.split(line, ",") + if not spl or #spl == 0 then + minetest.log("error", "[xdecor] Chess: Could not split string from perft testing suite at line "..testnum) + return + end + local fen = spl[1] + local ply = {} + for i=2, #spl do + local depth = i-1 + ply[depth] = tonumber(spl[i]) + if not ply[depth] then + minetest.log("error", "[xdecor] Chess: perft depth in perftsuite.csv is not a number (line="..testnum..")") + return + end + end + + -- Only test at ply 1 + local moves, counted_moves = get_moves_from_fen_position(fen) + local expected_moves = ply[1] + if counted_moves ~= expected_moves then + minetest.log("error", "[xdecor] Chess: perft test #"..testnum.." FAILED! "..expected_moves.." move(s) expected, got "..counted_moves.." move(s)") + minetest.log("error", "[xdecor] Chess: Gotten moves: "..dump(moves)) + errors = errors + 1 + end + end + return errors == 0 +end + +if CHESS_DEBUG then + perft_testing_suite() +end +end + + +--[[ EXPERIMENTAL API FUNCTION +Use at your own risk! +]] + +--[[ Set a custom chessbot to play as the computer in Chess. +This will replace any previously set chessbot, as only one chessbot +is supported at a time. +A chessbot is just a set of functions that this mod will call +once it queries the chessbot to make a decision. +The functions will be called in a blocking manner, so should +return quickly! + +Params: +* choose_move: function(board_t, game_state) + Is called when the bot is asked to pick a move, given a + chessboard, its pieces and the game state. + Params: + * board_t: Table containing every square on the board + * game_state: Table containing more info about the current state of the game + Must return: Two numbers, the first one is the square to + move from, the second one is the square to move towards + To make a castling move, move the king according to + castling rules, the tower will be moved automatically. + If nil is returned or the move is illegal, the bot resigns +* choose_promote = function(board_t, game_state, pawn_index) + Is called when one of the bot's pawns managed to reach the + other end of the board and gains a promotion. + Params: + * board_t: See `choose_move` + * game_state: See `choose_move` + * pawn_index: Board table index of the pawn to promote + + Must return: What piece to promote the pawn to: + "queen", "rook", "bishop" or "knight" + If anything else is returned, the bot resigns +* name: Human readable chessbot name, + untranslated (but you can mark it with a no-op translation + symbol like `NS = function return(s) end`) +* id: Unique identifier of the chessbot + +`board_t` table format: +This is a table with 64 entries, starting at index 1 representing +the square a8, followed by 2=b8, 3=c8, 4=d8, ... 9=a7, 10=b7, ... 64=h1. +Each field has a 1-character string as a value for whatever the square +contains, according to this list: + + . empty space + p black pawn + b black bishop + q black queen + k black king + r black rook + n black knight + P white pawn + B white bishop + Q white queen + K white king + R white rook + N white knight + +`game_state` table contains these fields: +* lastMove: Which player made the last move: "black" or "white". empty string if nobody moved yet +* botColor: Color of the bot to play: "black" or "white" +* castlingWhiteL: equals the number 1 if White has the right to castle queenside +* castlingWhiteR: equals the number 1 if White has the right to castle kingside +* castlingBlackL: equals the number 1 if Black has the right to castle queenside +* castlingBlackR: equals the number 1 if Black has the right to castle kingside +* prevDoublePawnStepTo: if a pawn did a double-step in the previous move, + this is the board index of the destination. if no pawn made a double-step in the + previous halfmove, this is 0 +* halfmoveClock: A number that counts how many consecutive halfmoves + have been made with no pawn advancing and no piece being captured + (relevant for 50-move or 75-move rule) +]] +function realchess.set_chessbot(def) + chessbot.choose_move = def.choose_move + chessbot.choose_promote = def.choose_promote + chessbot.name = def.name or S("Computer") + chessbot.id = def.id + if not chessbot.choose_move or not chessbot.choose_promote or not chessbot.id then + minetest.log("error", "[xdecor] Chess: set_chessbot called with incomplete parameters!") + return + end + minetest.log("action", "[xdecor] Chess: Chessbot set to: "..chessbot.id) +end + +--[[ END OF API FUNCTIONS ]] + +-- Initially set the built-in weak chessbot (can be overwritten later by mods) +dofile(minetest.get_modpath(minetest.get_current_modname()).."/src/chessbot_weak.lua") diff --git a/mods/xdecor/src/chessbot.lua b/mods/xdecor/src/chessbot.lua new file mode 100644 index 0000000..8fde60a --- /dev/null +++ b/mods/xdecor/src/chessbot.lua @@ -0,0 +1,154 @@ +local chessbot = {} + +local active_jobs = {} + +chessbot.cancel_job = function(pos) + local hash = minetest.hash_node_position(pos) + if active_jobs[hash] then + active_jobs[hash]:cancel() + active_jobs[hash] = nil + end +end + +local realchess = xdecor.chess + +local get_game_state = function(meta) + local lastMove = meta:get_string("lastMove") + local color + if lastMove == "black" or lastMove == "" then + color = "white" + else + color = "black" + end + return { + botColor = color, + prevDoublePawnStepTo = meta:get_int("prevDoublePawnStepTo"), + castlingWhiteL = meta:get_int("castlingWhiteL"), + castlingWhiteR = meta:get_int("castlingWhiteR"), + castlingBlackL = meta:get_int("castlingBlackL"), + castlingBlackR = meta:get_int("castlingBlackR"), + halfmoveClock = meta:get_int("halfmoveClock"), + } +end + + + +-- Delay in seconds for a bot moving a piece (excluding choosing a promotion) +local BOT_DELAY_MOVE = 1.0 +-- Delay in seconds for a bot promoting a piece +local BOT_DELAY_PROMOTE = 1.0 + +chessbot.perform_move = function(pos, choice_from, choice_to, meta) + local game_state = get_game_state(meta) + local currentBotColor = game_state.botColor + + -- Bot resigns if no move chosen + if not choice_from or not choice_to then + realchess.resign(pos, meta, currentBotColor) + return + end + + local botName + if currentBotColor == "white" then + botName = meta:get_string("playerWhite") + else + botName = meta:get_string("playerBlack") + end + + local gameResult = meta:get_string("gameResult") + if gameResult ~= "" then + return + end + local botColor = meta:get_string("botColor") + if botColor == "" then + minetest.log("error", "[xdecor] Chess: chessbot.perform_move: botColor in meta string was empty!") + return + end + local lastMove = meta:get_string("lastMove") + local lastMoveTime = meta:get_int("lastMoveTime") + if lastMoveTime > 0 or lastMove == "" then + -- Set the bot name if not set already + if currentBotColor == "black" and meta:get_string("playerBlack") == "" then + meta:set_string("playerBlack", botName) + elseif currentBotColor == "white" and meta:get_string("playerWhite") == "" then + meta:set_string("playerWhite", botName) + end + + -- Make a move + local moveOK = realchess.move(pos, meta, "board", choice_from, "board", choice_to, botName) + if not moveOK then + minetest.log("error", "[xdecor] Chess: Bot tried to make an invalid move from ".. + realchess.index_to_notation(choice_from).." to "..realchess.index_to_notation(choice_to)) + end + -- Bot resigns if it tried to make an invalid move + if not moveOK then + realchess.resign(pos, meta, currentBotColor) + end + else + minetest.log("error", "[xdecor] Chess: chessbot.perform_move: No last move!") + end +end + +function chessbot.perform_promote(pos, meta, promoteTo) + local lastMove = meta:get_string("lastMove") + local color + if lastMove == "black" or lastMove == "" then + color = "white" + else + color = "black" + end + if not promoteTo then + minetest.log("error", "[xdecor] Chess: Bot failed to pick a pawn promotion") + realchess.resign(pos, meta, color) + return + elseif promoteTo ~= "queen" and promoteTo ~= "rook" and promoteTo ~= "knight" and promoteTo ~= "bishop" then + minetest.log("error", "[xdecor] Chess: Bot picked an invalid pawn promotion: "..tostring(promoteTo)) + realchess.resign(pos, meta, color) + return + end + realchess.promote_pawn(pos, meta, color, promoteTo) +end + +function chessbot.move(pos, inv, meta) + local board_t = realchess.board_inv_to_table(inv) + local game_state = get_game_state(meta) + + local t1 = minetest.get_us_time() + local choice_from, choice_to = chessbot.choose_move(board_t, game_state) + local t2 = minetest.get_us_time() + minetest.log("verbose", "[xdecor] Chessbot at "..minetest.pos_to_string(pos).." took "..(t2-t1).. " µs to pick a move") + + local hash = minetest.hash_node_position(pos) + if active_jobs[hash] then + chessbot.cancel_job(pos) + minetest.log("error", "[xdecor] chessbot.move called although the chessbot already had an active job for "..minetest.pos_to_string(pos).."!") + end + local job = minetest.after(BOT_DELAY_MOVE, function() + active_jobs[hash] = nil + chessbot.perform_move(pos, choice_from, choice_to, meta) + end) + active_jobs[hash] = job +end + +function chessbot.promote(pos, inv, meta, pawnIndex) + local board_t = realchess.board_inv_to_table(inv) + local game_state = get_game_state(meta) + + local t1 = minetest.get_us_time() + local promoteTo = chessbot.choose_promote(board_t, game_state, pawnIndex) + local t2 = minetest.get_us_time() + minetest.log("verbose", "[xdecor] Chessbot at "..minetest.pos_to_string(pos).." took "..(t2-t1).. " µs to pick a pawn promotion") + + local hash = minetest.hash_node_position(pos) + if active_jobs[hash] then + chessbot.cancel_job(pos) + minetest.log("error", "[xdecor] chessbot.move called although the chessbot already had an active job for "..minetest.pos_to_string(pos).."!") + end + local job = minetest.after(BOT_DELAY_PROMOTE, function() + active_jobs[hash] = nil + chessbot.perform_promote(pos, meta, promoteTo) + end) + active_jobs[hash] = job +end + +return chessbot diff --git a/mods/xdecor/src/chessbot_random.lua b/mods/xdecor/src/chessbot_random.lua new file mode 100644 index 0000000..83c572f --- /dev/null +++ b/mods/xdecor/src/chessbot_random.lua @@ -0,0 +1,54 @@ +-- This is the random chessbot, it picks moves completely at random. +-- Not used by this mod by default; can be used for debugging +-- by manually adjusting the code. + +local NS = function(s) return s end + +local realchess = xdecor.chess + +local function choose_move(board_t, game_state) + local currentBotColor = game_state["botColor"] + local prevDoublePawnStepTo = game_state["prevDoublePawnStepTo"] + local castlingRights = { + castlingWhiteR = game_state["castlingWhiteR"], + castlingWhiteL = game_state["castlingWhiteL"], + castlingBlackR = game_state["castlingBlackR"], + castlingBlackL = game_state["castlingBlackL"], + } + + local moves = realchess.get_theoretical_moves_for(board_t, currentBotColor, prevDoublePawnStepTo, castlingRights) + local safe_moves, safe_moves_count = realchess.get_king_safe_moves(moves, board_t, currentBotColor) + if safe_moves_count == 0 then + return nil + end + local flat_moves = {} + for from, tos in pairs(safe_moves) do + for to, _ in pairs(tos) do + table.insert(flat_moves, { from = from, to = to }) + end + end + local r = math.random(1, #flat_moves) + local move = flat_moves[r] + return move.from, move.to +end + +local function choose_promote(board_t, game_state, pawnIndex) + local r = math.random(1,4) + if r == 1 then + return "queen" + elseif r == 2 then + return "rook" + elseif r == 3 then + return "bishop" + else + return "knight" + end +end + +-- Set the weak chessbot +realchess.set_chessbot({ + id = "xdecor:random", + name = NS("Random Computer"), + choose_move = choose_move, + choose_promote = choose_promote, +}) diff --git a/mods/xdecor/src/chessbot_weak.lua b/mods/xdecor/src/chessbot_weak.lua new file mode 100644 index 0000000..0ec8301 --- /dev/null +++ b/mods/xdecor/src/chessbot_weak.lua @@ -0,0 +1,128 @@ +-- This is the weak chessbot, the built-in chessbot for +-- this mod. It is really bad at playing Chess but at +-- least it can play at all! + +local NS = function(s) return s end + +local realchess = xdecor.chess + +-- How valuable the chessbot thinks each piece is +-- (higher = more valuable) +local piece_values = { + p = 10, -- pawn + n = 30, -- knight + b = 30, -- bishop + r = 50, -- rook + q = 90, -- queen + k = 900, -- king +} +for k,v in pairs(piece_values) do + local upper = string.upper(k) + piece_values[upper] = v +end + +-- Pick a move from the list of all possible moves +-- on this chessboard +local function best_move(moves, board_t) + --[[ This is a VERY simple algorithm that will greedily + capture pieces as soon the opprtunity arises + and otherwise takes random moves. + This makes the bot very weak, as it lacks any kind of + foresight, but the algorithm is blazingly fast. ]] + + --[[ The algorithm: + Look at all moves and rate each of them with a number + (higher = better). Pick the move with the highest rating. + If it's a tie, pick randomly from the tied moves. + Non-capturing moves are rated 0. + Capturing moves are rated by which piece is captured + (in piece_values) ]] + + local max_value, choices = 0, {} + + for from, move in pairs(moves) do + for m=1, #move do + local to = move[m][1] + local promote_to = move[m][2] + + -- No promotion or promotion to queen + if promote_to == nil or promote_to == 5 then + -- Move rating. rating 0 is for non-capturing moves. + -- higher ratings are for capturing moves. + local val = 0 + local to_piece_name = board_t[to] + + -- If destination is a piece that we capture, rate this move + -- according to a table. + if to_piece_name ~= "." then + for piece_type, piece_value in pairs(piece_values) do + if to_piece_name == piece_type then + val = piece_value + break + end + end + end + + -- Update the list of best moves (choices). + if val > max_value then + max_value = val + choices = {{ + from = from, + to = to + }} + elseif val == max_value then + choices[#choices + 1] = { + from = from, + to = to + } + end + end + end + end + + if #choices == 0 then + return nil + end + local random = math.random(1, #choices) + local choice_from, choice_to = choices[random].from, choices[random].to + + return tonumber(choice_from), choice_to +end + +local function choose_move(board_t, game_state) + local currentBotColor = game_state["botColor"] + local prevDoublePawnStepTo = game_state["prevDoublePawnStepTo"] + local castlingRights = { + castlingWhiteR = game_state["castlingWhiteR"], + castlingWhiteL = game_state["castlingWhiteL"], + castlingBlackR = game_state["castlingBlackR"], + castlingBlackL = game_state["castlingBlackL"], + } + + local moves = realchess.get_theoretical_moves_for(board_t, currentBotColor, prevDoublePawnStepTo, castlingRights) + local safe_moves, safe_moves_count = realchess.get_king_safe_moves(moves, board_t, currentBotColor) + if safe_moves_count == 0 then + -- No safe move: stalemate or checkmate + return + end + local choice_from, choice_to = best_move(safe_moves, board_t) + if choice_from == nil then + -- No best move: stalemate or checkmate + return + end + + return choice_from, choice_to +end + +local function choose_promote(board_t, game_state, pawnIndex) + -- Bot always promotes to queen + return "queen" +end + +-- Set the weak chessbot +realchess.set_chessbot({ + id = "xdecor:weak", + name = NS("Weak Computer"), + choose_move = choose_move, + choose_promote = choose_promote, +}) diff --git a/mods/xdecor/src/cooking.lua b/mods/xdecor/src/cooking.lua new file mode 100644 index 0000000..fc56e42 --- /dev/null +++ b/mods/xdecor/src/cooking.lua @@ -0,0 +1,590 @@ +local cauldron, sounds = {}, {} +local S = minetest.get_translator("xdecor") + +-- Set to true to print soup ingredients, heater nodes and bowls to console +local DEBUG_RECOGNIZED_ITEMS = false + +--~ cauldron hint +local hint_fire = S("Light a fire below to heat it up") +--~ cauldron hint +local hint_eat = S("Use a bowl to eat the soup") +--~ cauldron hint +local hint_recipe = S("Drop foods inside to make a soup") + +local infotexts = { + ["xdecor:cauldron_empty"] = S("Cauldron (empty)"), + ["xdecor:cauldron_idle"] = S("Cauldron (cold water)").."\n"..hint_fire, + ["xdecor:cauldron_idle_river_water"] = S("Cauldron (cold river water)").."\n"..hint_fire, + ["xdecor:cauldron_idle_soup"] = S("Cauldron (cold soup)").."\n"..hint_eat, + ["xdecor:cauldron_boiling"] = S("Cauldron (boiling water)").."\n"..hint_recipe, + ["xdecor:cauldron_boiling_river_water"] = S("Cauldron (boiling river water)").."\n"..hint_recipe, + ["xdecor:cauldron_soup"] = S("Cauldron (boiling soup)").."\n"..hint_eat, +} + +local function set_infotext(meta, node) + if infotexts[node.name] then + meta:set_string("infotext", infotexts[node.name]) + end +end + +-- HACKY list of soup ingredients. +-- For items without a valid 'xdecor_soup_ingredient' group present, the cauldron +-- will check part of the itemname after the ':' contains any of those words. +-- If it does, the item counts as an ingredient, UNLESS the item is in the +-- non_ingredients blacklist below. +local ingredients_list = { + "apple", "mushroom", "honey", "pumpkin", "egg", "bread", "meat", + "chicken", "carrot", "potato", "melon", "rhubarb", "cucumber", + "corn", "beans", "berries", "grapes", "tomato", "wheat" +} + +-- Blacklist of items that cannot be soup ingredients, in case they +-- would otherwise match the ingredients_list above. +-- Note the group 'xdecor_soup_ingredient' still takes precedence. +local non_ingredients = { + -- Minetest Game: default + "default:apple_mark", "default:blueberry_bush_leaves_with_berries", + -- Minetest Game: farming + "farming:seed_wheat", + "farming:wheat_1", "farming:wheat_2", "farming:wheat_3", "farming:wheat_4", + "farming:wheat_5", "farming:wheat_6", "farming:wheat_7", "farming:wheat_8", +} +local non_ingredients_keyed = table.key_value_swap(non_ingredients) + +cauldron.cbox = { + {0, 0, 0, 16, 16, 0}, + {0, 0, 16, 16, 16, 0}, + {0, 0, 0, 0, 16, 16}, + {16, 0, 0, 0, 16, 16}, + {0, 0, 0, 16, 8, 16} +} + +-- Returns true is given item is a node that can heat fire and can heat up the cauldron +local function is_heater(itemstring) + -- Dedicated group to add custom cauldron-heating nodes + return minetest.get_item_group(itemstring, "xdecor_cauldron_heater") == 1 or + -- Also, all fire nodes count as heaters + minetest.get_item_group(itemstring, "fire") ~= 0 +end + +-- Returns true if given item is a bowl that is compatible with taking soup from +-- the cauldron +local function is_bowl(itemstring) + -- Recommended: The item has this group + return minetest.get_item_group(itemstring, "xdecor_soup_bowl") == 1 + -- Two items are hardcoded + or itemstring == "farming:bowl" or itemstring == "x_farming:bowl" +end + +-- Returns true if the node at pos is above heater +local function is_heated(pos) + local below_node = {x = pos.x, y = pos.y - 1, z = pos.z} + local nn = minetest.get_node(below_node).name + -- Check heater status + if is_heater(nn) then + return true + else + return false + end +end + +function cauldron.stop_sound(pos) + local spos = minetest.hash_node_position(pos) + if sounds[spos] then + minetest.sound_stop(sounds[spos]) + sounds[spos] = nil + end +end + +function cauldron.start_sound(pos) + local spos = minetest.hash_node_position(pos) + -- Stop sound if one already exists. + -- Only 1 sound per position at maximum allowed. + if sounds[spos] then + cauldron.stop_sound(pos) + end + sounds[spos] = minetest.sound_play("xdecor_boiling_water", { + pos = pos, + max_hear_distance = 5, + gain = 0.8, + loop = true + }) +end + +function cauldron.idle_construct(pos) + local timer = minetest.get_node_timer(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + set_infotext(meta, node) + timer:start(10.0) + cauldron.stop_sound(pos) +end + +function cauldron.boiling_construct(pos) + cauldron.start_sound(pos) + + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + set_infotext(meta, node) + + local timer = minetest.get_node_timer(pos) + timer:start(5.0) +end + + +function cauldron.filling(pos, node, clicker, itemstack) + local inv = clicker:get_inventory() + local wield_item = clicker:get_wielded_item():get_name() + + do + if wield_item == "bucket:bucket_empty" and node.name:sub(-6) ~= "_empty" then + local bucket_item + if node.name:sub(-11) == "river_water" then + bucket_item = "bucket:bucket_river_water 1" + else + bucket_item = "bucket:bucket_water 1" + end + if itemstack:get_count() > 1 then + if inv:room_for_item("main", bucket_item) then + itemstack:take_item() + inv:add_item("main", bucket_item) + else + -- No space: Drop bucket on ground + itemstack:take_item() + minetest.add_item(clicker:get_pos(), bucket_item) + end + else + itemstack:replace(bucket_item) + end + minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2}) + + elseif minetest.get_item_group(wield_item, "water_bucket") == 1 and node.name:sub(-6) == "_empty" then + local newnode + if wield_item == "bucket:bucket_river_water" then + newnode = "xdecor:cauldron_idle_river_water" + else + newnode = "xdecor:cauldron_idle" + end + minetest.set_node(pos, {name = newnode, param2 = node.param2}) + itemstack:replace("bucket:bucket_empty") + end + + return itemstack + end +end + +function cauldron.idle_timer(pos) + if not is_heated(pos) then + return true + end + + local node = minetest.get_node(pos) + if node.name:sub(-4) == "soup" then + node.name = "xdecor:cauldron_soup" + elseif node.name:sub(-11) == "river_water" then + node.name = "xdecor:cauldron_boiling_river_water" + else + node.name = "xdecor:cauldron_boiling" + end + minetest.set_node(pos, node) + return true +end + +-- Ugly hack to determine if an item has the function `minetest.item_eat` in its definition. +local function eatable(itemstring) + local item = itemstring:match("[%w_:]+") + local on_use_def = minetest.registered_items[item].on_use + if not on_use_def then return end + + return string.format("%q", string.dump(on_use_def)):find("item_eat") +end + +-- Checks if the given item can be used as ingredient for the soup +local function is_ingredient(itemstring) + -- This group takes precedence over everything else, allowing + -- mods to explicitly mark items as soup ingredient or not. + local gval = minetest.get_item_group(itemstring, "xdecor_soup_ingredient") + -- 1: This item is a soup ingredient + if gval == 1 then + return true + -- -1: This item is NOT a soup ingredient + -- This should be used in case the heuristic below fails. + elseif gval == -1 then + return false + end + + -- Otherwise, we determine on whether this item is a soup ingredient + -- based on its itemstring (admittedly kinda hacky ...) + + -- But first check if our item is in the blacklist + if non_ingredients_keyed[itemstring] then + return false + end + + -- Eatable items count as ingredient by default + if eatable(itemstring) then + return true + end + -- We check if the part of the itemstring after the colon + -- contains one of the words in ingredients_list. + -- If yes, this is an ingredient. Otherwise it isn't. + local basename = itemstring:match(":([%w_]+)") + if not basename then + return false + end + for _, ingredient in ipairs(ingredients_list) do + if basename:find(ingredient) then + return true + end + end + return false +end + +function cauldron.boiling_timer(pos) + -- Cool down cauldron if there is no fire + local node = minetest.get_node(pos) + if not is_heated(pos) then + local newnode + if node.name:sub(-4) == "soup" then + newnode = "xdecor:cauldron_idle_soup" + elseif node.name:sub(-11) == "river_water" then + newnode = "xdecor:cauldron_idle_river_water" + else + newnode = "xdecor:cauldron_idle" + end + minetest.set_node(pos, {name = newnode, param2 = node.param2}) + return true + end + + if node.name:sub(-4) == "soup" then + return true + end + + -- Cooking: + + -- Count the ingredients in the cauldron + local objs = minetest.get_objects_inside_radius(pos, 0.5) + + if not next(objs) then + return true + end + + local ingredients = {} + for _, obj in pairs(objs) do + if obj and not obj:is_player() and obj:get_luaentity().itemstring then + local itemstring = obj:get_luaentity().itemstring + local item = ItemStack(itemstring) + local itemname = item:get_name() + + if is_ingredient(itemname) then + local basename = itemstring:match(":([%w_]+)") + table.insert(ingredients, basename) + end + end + end + + -- Remove ingredients and turn liquid into soup + if #ingredients >= 2 then + for _, obj in pairs(objs) do + obj:remove() + end + + minetest.set_node(pos, {name = "xdecor:cauldron_soup", param2 = node.param2}) + end + + + return true +end + +function cauldron.take_soup(pos, node, clicker, itemstack) + local inv = clicker:get_inventory() + local wield_item = clicker:get_wielded_item() + local item_name = wield_item:get_name() + + if is_bowl(item_name) then + local soup_bowl = ItemStack("xdecor:bowl_soup 1") + -- For bowls from other mods, remember the original bowl name + -- to restore it after eating the soup. + if item_name ~= "xdecor:bowl" then + local imeta = soup_bowl:get_meta() + imeta:set_string("original_bowl", item_name) + end + -- Add item to inventory, if possible + if wield_item:get_count() > 1 then + if inv:room_for_item("main", soup_bowl) then + itemstack:take_item() + inv:add_item("main", soup_bowl) + else + -- No space: Drop soup bowl on ground + itemstack:take_item() + minetest.add_item(clicker:get_pos(), soup_bowl) + end + else + itemstack:replace(soup_bowl) + end + + minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2}) + + minetest.log("action", "[xdecor] "..clicker:get_player_name().." fills their bowl ("..item_name..") with soup from the cauldron at "..minetest.pos_to_string(pos)) + end + + return itemstack +end + +xdecor.register("cauldron_empty", { + description = S("Cauldron"), + --~ Cauldron tooltip + _tt_help = S("For storing water and cooking soup"), + groups = {cracky=2, oddly_breakable_by_hand=1,cauldron=1}, + is_ground_content = false, + on_rotate = screwdriver.rotate_simple, + tiles = {"xdecor_cauldron_top_empty.png", "xdecor_cauldron_bottom.png", "xdecor_cauldron_sides.png"}, + sounds = default.node_sound_metal_defaults(), + collision_box = xdecor.pixelbox(16, cauldron.cbox), + on_rightclick = cauldron.filling, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + set_infotext(meta, node) + cauldron.stop_sound(pos) + end, +}) + +xdecor.register("cauldron_idle", { + description = S("Cauldron with Water (cold)"), + groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1,cauldron=2}, + is_ground_content = false, + on_rotate = screwdriver.rotate_simple, + tiles = {"xdecor_cauldron_top_idle.png", "xdecor_cauldron_bottom.png", "xdecor_cauldron_sides.png"}, + sounds = default.node_sound_metal_defaults(), + drop = "xdecor:cauldron_empty", + collision_box = xdecor.pixelbox(16, cauldron.cbox), + on_rightclick = cauldron.filling, + on_construct = cauldron.idle_construct, + on_timer = cauldron.idle_timer, +}) + +xdecor.register("cauldron_idle_river_water", { + description = S("Cauldron with River Water (cold)"), + groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1,cauldron=2}, + is_ground_content = false, + on_rotate = screwdriver.rotate_simple, + tiles = {"xdecor_cauldron_top_idle_river_water.png", "xdecor_cauldron_bottom.png", "xdecor_cauldron_sides.png"}, + sounds = default.node_sound_metal_defaults(), + drop = "xdecor:cauldron_empty", + collision_box = xdecor.pixelbox(16, cauldron.cbox), + on_rightclick = cauldron.filling, + on_construct = cauldron.idle_construct, + on_timer = cauldron.idle_timer, +}) + +xdecor.register("cauldron_idle_soup", { + description = S("Cauldron with Soup (cold)"), + groups = {cracky = 2, oddly_breakable_by_hand = 1, not_in_creative_inventory = 1,cauldron=2}, + is_ground_content = false, + on_rotate = screwdriver.rotate_simple, + drop = "xdecor:cauldron_empty", + tiles = {"xdecor_cauldron_top_idle_soup.png", "xdecor_cauldron_bottom.png", "xdecor_cauldron_sides.png"}, + sounds = default.node_sound_metal_defaults(), + collision_box = xdecor.pixelbox(16, cauldron.cbox), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + set_infotext(meta, node) + local timer = minetest.get_node_timer(pos) + timer:start(10.0) + cauldron.stop_sound(pos) + end, + on_timer = cauldron.idle_timer, + on_rightclick = cauldron.take_soup, +}) + +xdecor.register("cauldron_boiling", { + description = S("Cauldron with Water (boiling)"), + groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1,cauldron=3}, + is_ground_content = false, + on_rotate = screwdriver.rotate_simple, + drop = "xdecor:cauldron_empty", + damage_per_second = 2, + tiles = { + { + name = "xdecor_cauldron_top_anim_boiling_water.png", + animation = {type = "vertical_frames", length = 3.0} + }, + "xdecor_cauldron_bottom.png", + "xdecor_cauldron_sides.png" + }, + sounds = default.node_sound_metal_defaults(), + collision_box = xdecor.pixelbox(16, cauldron.cbox), + on_rightclick = cauldron.filling, + on_construct = cauldron.boiling_construct, + on_timer = cauldron.boiling_timer, + on_destruct = function(pos) + cauldron.stop_sound(pos) + end, +}) + +xdecor.register("cauldron_boiling_river_water", { + description = S("Cauldron with River Water (boiling)"), + groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1,cauldron=3}, + is_ground_content = false, + on_rotate = screwdriver.rotate_simple, + drop = "xdecor:cauldron_empty", + damage_per_second = 2, + tiles = { + { + name = "xdecor_cauldron_top_anim_boiling_river_water.png", + animation = {type = "vertical_frames", length = 3.0} + }, + "xdecor_cauldron_bottom.png", + "xdecor_cauldron_sides.png" + }, + sounds = default.node_sound_metal_defaults(), + collision_box = xdecor.pixelbox(16, cauldron.cbox), + on_rightclick = cauldron.filling, + on_construct = cauldron.boiling_construct, + on_timer = cauldron.boiling_timer, + on_destruct = function(pos) + cauldron.stop_sound(pos) + end, +}) + + + +xdecor.register("cauldron_soup", { + description = S("Cauldron with Soup (boiling)"), + groups = {cracky = 2, oddly_breakable_by_hand = 1, not_in_creative_inventory = 1,cauldron=3}, + is_ground_content = false, + on_rotate = screwdriver.rotate_simple, + drop = "xdecor:cauldron_empty", + damage_per_second = 2, + tiles = { + { + name = "xdecor_cauldron_top_anim_soup.png", + animation = {type = "vertical_frames", length = 3.0} + }, + "xdecor_cauldron_bottom.png", + "xdecor_cauldron_sides.png" + }, + sounds = default.node_sound_metal_defaults(), + collision_box = xdecor.pixelbox(16, cauldron.cbox), + on_construct = function(pos) + cauldron.start_sound(pos) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + set_infotext(meta, node) + + local timer = minetest.get_node_timer(pos) + timer:start(5.0) + end, + on_timer = cauldron.boiling_timer, + on_rightclick = cauldron.take_soup, + on_destruct = function(pos) + cauldron.stop_sound(pos) + end, +}) + +-- Craft items + +minetest.register_craftitem("xdecor:bowl", { + --~ Item that can hold soup + description = S("Bowl"), + inventory_image = "xdecor_bowl.png", + wield_image = "xdecor_bowl.png", + groups = {food_bowl = 1, xdecor_soup_bowl = 1, flammable = 2}, +}) + +minetest.register_craftitem("xdecor:bowl_soup", { + description = S("Bowl of soup"), + inventory_image = "xdecor_bowl_soup.png", + wield_image = "xdecor_bowl_soup.png", + groups = { + -- The soup itself is NOT an ingredient for the soup + xdecor_soup_ingredient = -1, + }, + stack_max = 1, + on_use = function(itemstack, user, pointed_thing) + -- Eat the soup and replace item with the original bowl item + -- (`xdecor:bowl` by default) + local imeta = itemstack:get_meta() + local empty_bowl = imeta:get_string("original_bowl") + if empty_bowl == "" then + empty_bowl = "xdecor:bowl" + end + if not minetest.registered_items[empty_bowl] then + minetest.log("warning", "[xdecor] original_bowl of xdecor:bowl_soup was '"..empty_bowl.."', an unknown item. Falling back to xdecor:bowl") + empty_bowl = "xdecor:bowl" + end + return minetest.do_item_eat(30, empty_bowl, itemstack, user, pointed_thing) + end, +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:bowl 3", + recipe = { + {"group:wood", "", "group:wood"}, + {"", "group:wood", ""} + } +}) + +minetest.register_craft({ + output = "xdecor:cauldron_empty", + recipe = { + {"default:iron_lump", "", "default:iron_lump"}, + {"default:iron_lump", "", "default:iron_lump"}, + {"default:iron_lump", "default:iron_lump", "default:iron_lump"} + } +}) + +minetest.register_lbm({ + label = "Restart boiling cauldron sounds", + name = "xdecor:restart_boiling_cauldron_sounds", + nodenames = {"xdecor:cauldron_boiling", "xdecor:cauldron_boiling_river_water", "xdecor:cauldron_soup"}, + run_at_every_load = true, + action = function(pos, node) + cauldron.start_sound(pos) + end, +}) + +minetest.register_lbm({ + label = "Update cauldron infotexts", + name = "xdecor:update_cauldron_infotexts", + nodenames = {"group:cauldron"}, + run_at_every_load = false, + action = function(pos, node) + local meta = minetest.get_meta(pos) + set_infotext(meta, node) + end, +}) + +if DEBUG_RECOGNIZED_ITEMS then + -- Print all soup ingredients, heater nodes and bowls + -- in console + minetest.register_on_mods_loaded(function() + local ingredients = {} + local heaters = {} + local bowls = {} + for k,v in pairs(minetest.registered_items) do + if is_ingredient(k) then + table.insert(ingredients, k) + end + if is_heater(k) then + table.insert(heaters, k) + end + if is_bowl(k) then + table.insert(bowls, k) + end + end + table.sort(ingredients) + table.sort(heaters) + table.sort(bowls) + local str_i = table.concat(ingredients, ", ") + local str_h = table.concat(heaters, ", ") + local str_b = table.concat(bowls, ", ") + minetest.log("action", "[xdecor] List of ingredients for soup: "..str_i) + minetest.log("action", "[xdecor] List of nodes that can heat cauldron: "..str_h) + minetest.log("action", "[xdecor] List of bowls able to take soup from cauldron: "..str_b) + end) +end diff --git a/mods/xdecor/src/cuttable_node_list.lua b/mods/xdecor/src/cuttable_node_list.lua new file mode 100644 index 0000000..ac12510 --- /dev/null +++ b/mods/xdecor/src/cuttable_node_list.lua @@ -0,0 +1,124 @@ +--[[ +List of nodes that can be cut in the workbench. +In previous version, this used to be automatically +generated at runtime but it has been decided to turn +this to a hardcoded list for higher predictability +and to prevent future game/mod updates to accidentally +add more unintentional node cuts. + +Many of the "weird" cuts in the list (like the barrel) +are needed for compatibility reasons with older versions. + +This list was originally generated with this code: +``` + +-- Nodes allowed to be cut: +-- Only the regular, solid blocks without metas or explosivity +-- from the xdecor or default mods. + +for nodename, def in pairs(minetest.registered_nodes) do + local nodenamesplit = string.split(nodename, ":") + local modname = nodenamesplit[1] + if (modname == "xdecor" or modname == "default") and xdecor.stairs_valid_def(def) then + cuttable_nodes[#cuttable_nodes + 1] = nodename + end +end + +table.sort(cuttable_nodes) +for i = 1, #cuttable_nodes do + print(" \""..cuttable_nodes[i].."\",") +end +``` +]] + +local cuttable_nodes = { +-- xdecor + "xdecor:barrel", + "xdecor:cactusbrick", + "xdecor:coalstone_tile", + "xdecor:desertstone_tile", + "xdecor:hard_clay", + "xdecor:moonbrick", + "xdecor:packed_ice", + "xdecor:stone_rune", + "xdecor:stone_tile_x", + "xdecor:wood_tile_x", + "xdecor:woodframed_glass", + +-- 'default' from Minetest Game (as of Minetest Game commit ac2bc0f52118230eb4dd50567c30a47e9bd3a31e) + "default:acacia_tree", + "default:acacia_wood", + "default:aspen_tree", + "default:aspen_wood", + "default:brick", + "default:bronzeblock", + "default:cactus", + "default:coalblock", + "default:cobble", + "default:copperblock", + "default:coral_brown", + "default:coral_orange", + "default:coral_skeleton", + "default:desert_cobble", + "default:desert_sandstone", + "default:desert_sandstone_block", + "default:desert_sandstone_brick", + "default:desert_stone", + "default:desert_stone_block", + "default:desert_stonebrick", + "default:diamondblock", + "default:glass", + "default:goldblock", + "default:ice", + "default:jungletree", + "default:junglewood", + "default:mossycobble", + "default:obsidian", + "default:obsidian_block", + "default:obsidian_glass", + "default:obsidianbrick", + "default:permafrost", + "default:permafrost_with_moss", + "default:permafrost_with_stones", + "default:pine_tree", + "default:pine_wood", + "default:sandstone", + "default:sandstone_block", + "default:sandstonebrick", + "default:silver_sandstone", + "default:silver_sandstone_block", + "default:silver_sandstone_brick", + "default:steelblock", + "default:stone", + "default:stone_block", + "default:stonebrick", + "default:tinblock", + "default:tree", + "default:wood", +} + +-- 'farming' from Minetest Game (as of Minetest Game commit ac2bc0f52118230eb4dd50567c30a47e9bd3a31e) +if minetest.get_modpath("farming") ~= nil then + table.insert(cuttable_nodes, "farming:straw") +end + +if minetest.get_modpath("wool") ~= nil then +-- 'wool' from Minetest Game (as of Minetest Game commit ac2bc0f52118230eb4dd50567c30a47e9bd3a31e) + table.insert(cuttable_nodes, "wool:black") + table.insert(cuttable_nodes, "wool:blue") + table.insert(cuttable_nodes, "wool:brown") + table.insert(cuttable_nodes, "wool:cyan") + table.insert(cuttable_nodes, "wool:dark_green") + table.insert(cuttable_nodes, "wool:dark_grey") + table.insert(cuttable_nodes, "wool:green") + table.insert(cuttable_nodes, "wool:grey") + table.insert(cuttable_nodes, "wool:magenta") + table.insert(cuttable_nodes, "wool:orange") + table.insert(cuttable_nodes, "wool:pink") + table.insert(cuttable_nodes, "wool:red") + table.insert(cuttable_nodes, "wool:violet") + table.insert(cuttable_nodes, "wool:white") + table.insert(cuttable_nodes, "wool:yellow") +end + +return cuttable_nodes diff --git a/mods/xdecor/src/enchanted_tools.lua b/mods/xdecor/src/enchanted_tools.lua new file mode 100644 index 0000000..dc7df6a --- /dev/null +++ b/mods/xdecor/src/enchanted_tools.lua @@ -0,0 +1,115 @@ +-- Register enchanted tools. + +local S = minetest.get_translator("xdecor") + +-- Number of uses for the (normal) steel hoe from Minetest Game (as of 01/12/20224) +-- This is technically redundant because we cannot access that number +-- directly, but it's unlikely to change in future because Minetest Game is +-- unlikely to change. +local STEEL_HOE_USES = 500 + +-- Modifier of the steel hoe uses for the enchanted steel hoe +local STEEL_HOE_USES_MODIFIER = 2.2 + +-- Modifier of the bug net uses for the enchanted bug net +local BUG_NET_USES_MODIFIER = 4 + +-- Multiplies by much faster the fast hammer repairs +local HAMMER_FAST_MODIFIER = 1.3 + +-- Reduces the wear taken by the hammer for a single repair step +-- (absolute value) +local HAMMER_DURABLE_MODIFIER = 100 + +-- Register enchantments for default tools from Minetest Game +local materials = {"steel", "bronze", "mese", "diamond"} +local tooltypes = { + { "axe", { "durable", "fast" }, "choppy" }, + { "pick", { "durable", "fast" }, "cracky" }, + { "shovel", { "durable", "fast" }, "crumbly" }, + { "sword", { "sharp" }, nil }, +} +for t=1, #tooltypes do +for m=1, #materials do + local tooltype = tooltypes[t][1] + local enchants = tooltypes[t][2] + local dig_group = tooltypes[t][3] + local material = materials[m] + xdecor.register_enchantable_tool("default:"..tooltype.."_"..material, { + enchants = enchants, + dig_group = dig_group, + }) +end +end + +-- Register enchantment for bug net +xdecor.register_enchantable_tool("fireflies:bug_net", { + enchants = { "durable" }, + dig_group = "catchable", + bonuses = { + uses = BUG_NET_USES_MODIFIER, + } +}) + +-- Register enchanted steel hoe (more durability) +if farming.register_hoe then + local percent = math.round((STEEL_HOE_USES_MODIFIER - 1) * 100) + local hitem = ItemStack("farming:hoe_steel") + local hdesc = hitem:get_short_description() or "farming:hoe_steel" + local ehdesc, ehsdesc = xdecor.enchant_description(hdesc, "durable", percent) + farming.register_hoe(":farming:enchanted_hoe_steel_durable", { + description = ehdesc, + short_description = ehsdesc, + inventory_image = xdecor.enchant_texture("farming_tool_steelhoe.png"), + max_uses = STEEL_HOE_USES * STEEL_HOE_USES_MODIFIER, + groups = {hoe = 1, not_in_creative_inventory = 1} + }) + + xdecor.register_custom_enchantable_tool("farming:hoe_steel", { + durable = "farming:enchanted_hoe_steel_durable", + }) +end + +-- Register enchanted hammer (more durbility and efficiency) +local hammerdef = minetest.registered_items["xdecor:hammer"] +if hammerdef then + local hitem = ItemStack("xdecor:hammer") + local hdesc = hitem:get_short_description() or "xdecor:hammer" + local repair = hammerdef._xdecor_hammer_repair + local repair_cost = hammerdef._xdecor_hammer_repair_cost + + -- Durable hammer (reduces wear taken by each repair step) + local d_repair_cost_modified = repair_cost - HAMMER_DURABLE_MODIFIER + local d_percent = math.round(100 - d_repair_cost_modified/repair_cost * 100) + local d_ehdesc, d_ehsdesc = xdecor.enchant_description(hdesc, "durable", d_percent) + + xdecor.register_hammer("xdecor:enchanted_hammer_durable", { + description = d_ehdesc, + short_description = d_ehsdesc, + image = xdecor.enchant_texture("xdecor_hammer.png"), + repair_cost = d_repair_cost_modified, + groups = {repair_hammer = 1, not_in_creative_inventory = 1} + }) + + -- Fast hammer (increases both repair amount and repair cost per + -- repair step by an equal amount) + local f_repair_modified = math.round(repair * HAMMER_FAST_MODIFIER) + local repair_diff = f_repair_modified - repair + local f_repair_cost_modified = repair_cost + repair_diff + local f_percent = math.round(HAMMER_FAST_MODIFIER * 100 - 100) + local f_ehdesc, f_ehsdesc = xdecor.enchant_description(hdesc, "fast", f_percent) + + xdecor.register_hammer("xdecor:enchanted_hammer_fast", { + description = f_ehdesc, + short_description = f_ehsdesc, + image = xdecor.enchant_texture("xdecor_hammer.png"), + repair = f_repair_modified, + repair_cost = f_repair_cost_modified, + groups = {repair_hammer = 1, not_in_creative_inventory = 1} + }) + + xdecor.register_custom_enchantable_tool("xdecor:hammer", { + durable = "xdecor:enchanted_hammer_durable", + fast = "xdecor:enchanted_hammer_fast", + }) +end diff --git a/mods/xdecor/src/enchanting.lua b/mods/xdecor/src/enchanting.lua new file mode 100644 index 0000000..5394887 --- /dev/null +++ b/mods/xdecor/src/enchanting.lua @@ -0,0 +1,520 @@ +local enchanting = {} + +screwdriver = screwdriver or {} +local S = minetest.get_translator("xdecor") +local NS = function(s) return s end +local FS = function(...) return minetest.formspec_escape(S(...)) end +local ceil, abs, random = math.ceil, math.abs, math.random +local reg_tools = minetest.registered_tools +local reg_enchantable_tools = {} +local available_tool_enchants = {} + +-- Cost in Mese crystal(s) for enchanting. +local MESE_COST = 1 + +-- Default strenth of the enchantments +local DEFAULT_ENCHANTING_USES = 1.2 -- Durability +local DEFAULT_ENCHANTING_TIMES = 0.1 -- Efficiency +local DEFAULT_ENCHANTING_DAMAGES = 1 -- Sharpness + +local function to_percent(orig_value, final_value) + return abs(ceil(((final_value - orig_value) / orig_value) * 100)) +end + +function enchanting:get_tooltip_raw(enchant, percent) + local specs = { + durable = "#00baff", + fast = "#74ff49", + sharp = "#ffff00", + } + local enchant_loc = { + --~ Enchantment + fast = S("Efficiency"), + --~ Enchantment + durable = S("Durability"), + --~ Enchantment + sharp = S("Sharpness"), + } + + if minetest.colorize then + --~ Tooltip for enchantment, in format " (+%)", e.g. "Efficiency (+5%)" + return minetest.colorize(specs[enchant], S("@1 (+@2%)", enchant_loc[enchant], percent)) + else + return S("@1 (+@2%)", enchant_loc[enchant], percent) + end + +end + +function enchanting:get_tooltip(enchant, orig_caps, fleshy, bonus_defs) + local bonus = {durable = 0, efficiency = 0, damages = 0} + + if orig_caps then + bonus.durable = to_percent(orig_caps.uses, orig_caps.uses * bonus_defs.uses) + local sum_caps_times = 0 + for i=1, #orig_caps.times do + sum_caps_times = sum_caps_times + orig_caps.times[i] + end + local average_caps_time = sum_caps_times / #orig_caps.times + bonus.efficiency = to_percent(average_caps_time, average_caps_time - + bonus_defs.times) + end + + if fleshy then + bonus.damages = to_percent(fleshy, fleshy + bonus_defs.damages) + end + + local specs = { + durable = bonus.durable, + fast = bonus.efficiency, + sharp = bonus.damages, + } + local percent = specs[enchant] + return enchanting:get_tooltip_raw(enchant, percent) +end + +local enchant_buttons = { + fast = "image_button[3.6,0.67;4.75,0.85;bg_btn.png;fast;"..FS("Efficiency").."]", + durable = "image_button[3.6,1.65;4.75,1.05;bg_btn.png;durable;"..FS("Durability").."]", + sharp = "image_button[3.6,2.8;4.75,0.85;bg_btn.png;sharp;"..FS("Sharpness").."]", +} + +function enchanting.formspec(pos, enchants) + local meta = minetest.get_meta(pos) + local formspec = [[ + size[9,8.6;] + no_prepend[] + bgcolor[#080808BB;true] + listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] + background9[0,0;9,9;ench_ui.png;6] + list[context;tool;0.9,2.9;1,1;] + list[context;mese;2,2.9;1,1;] + list[current_player;main;0.55,4.5;8,4;] + listring[current_player;main] + listring[context;tool] + listring[current_player;main] + listring[context;mese] + image[2,2.9;1,1;mese_layout.png] + ]] + --~ Sharpness enchantment + .."tooltip[sharp;"..FS("Your weapon inflicts more damage").."]" + --~ Durability enchantment + .."tooltip[durable;"..FS("Your tool lasts longer").."]" + --~ Efficiency enchantment + .."tooltip[fast;"..FS("Your tool digs faster").."]" + ..default.gui_slots .. default.get_hotbar_bg(0.55, 4.5) + + if enchants then + for e=1, #enchants do + formspec = formspec .. enchant_buttons[enchants[e]] + end + end + meta:set_string("formspec", formspec) +end + +function enchanting.on_put(pos, listname, _, stack) + if listname == "tool" then + local stackname = stack:get_name() + local enchants = available_tool_enchants[stackname] + if enchants then + enchanting.formspec(pos, enchants) + end + end +end + +function enchanting.fields(pos, _, fields, sender) + if not next(fields) or fields.quit then return end + local inv = minetest.get_meta(pos):get_inventory() + local tool = inv:get_stack("tool", 1) + local mese = inv:get_stack("mese", 1) + local orig_wear = tool:get_wear() + local mod, name = tool:get_name():match("(.*):(.*)") + local enchanted_tool = (mod or "") .. ":enchanted_" .. (name or "") .. "_" .. next(fields) + + if mese:get_count() >= MESE_COST and reg_tools[enchanted_tool] then + minetest.sound_play("xdecor_enchanting", { + to_player = sender:get_player_name(), + gain = 0.8 + }) + + tool:replace(enchanted_tool) + tool:add_wear(orig_wear) + mese:take_item(MESE_COST) + inv:set_stack("mese", 1, mese) + inv:set_stack("tool", 1, tool) + end +end + +function enchanting.dig(pos) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("tool") and inv:is_empty("mese") +end + +function enchanting.blast(pos) + local drops = xdecor.get_inventory_drops(pos, {"tool", "mese"}) + minetest.remove_node(pos) + return drops +end + +local function allowed(tool) + if not tool then + return false + end + if reg_enchantable_tools[tool] then + return true + else + return false + end +end + +function enchanting.put(_, listname, _, stack) + local stackname = stack:get_name() + if listname == "mese" and (stackname == "default:mese_crystal" or + stackname == "imese:industrial_mese_crystal") then + return stack:get_count() + elseif listname == "tool" and allowed(stackname) then + return 1 + end + + return 0 +end + +function enchanting.on_take(pos, listname) + if listname == "tool" then + enchanting.formspec(pos) + end +end + +function enchanting.construct(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Enchantment Table")) + enchanting.formspec(pos) + + local inv = meta:get_inventory() + inv:set_size("tool", 1) + inv:set_size("mese", 1) + + minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open") + local timer = minetest.get_node_timer(pos) + timer:start(0.5) +end + +function enchanting.destruct(pos) + for _, obj in pairs(minetest.get_objects_inside_radius(pos, 0.9)) do + if obj and obj:get_luaentity() and + obj:get_luaentity().name == "xdecor:book_open" then + obj:remove() + break + end + end +end + +function enchanting.timer(pos) + local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2} + local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2} + + local bookshelves = minetest.find_nodes_in_area(minp, maxp, "default:bookshelf") + if #bookshelves == 0 then + return true + end + + local bookshelf_pos = bookshelves[random(1, #bookshelves)] + local x = pos.x - bookshelf_pos.x + local y = bookshelf_pos.y - pos.y + local z = pos.z - bookshelf_pos.z + + if tostring(x .. z):find(2) then + minetest.add_particle({ + pos = bookshelf_pos, + velocity = {x = x, y = 2 - y, z = z}, + acceleration = {x = 0, y = -2.2, z = 0}, + expirationtime = 1, + size = 1.5, + glow = 5, + texture = "xdecor_glyph" .. random(1,18) .. ".png" + }) + end + + return true +end + +xdecor.register("enchantment_table", { + description = S("Enchantment Table"), + --~ Enchantment table tooltip + _tt_help = S("Enchant your tools with mese crystals"), + tiles = { + "xdecor_enchantment_top.png", "xdecor_enchantment_bottom.png", + "xdecor_enchantment_side.png", "xdecor_enchantment_side.png", + "xdecor_enchantment_side.png", "xdecor_enchantment_side.png" + }, + groups = {cracky = 1, level = 1}, + is_ground_content = false, + light_source = 6, + sounds = default.node_sound_stone_defaults(), + on_rotate = screwdriver.rotate_simple, + can_dig = enchanting.dig, + on_blast = enchanting.blast, + on_timer = enchanting.timer, + on_construct = enchanting.construct, + on_destruct = enchanting.destruct, + on_receive_fields = enchanting.fields, + on_metadata_inventory_put = enchanting.on_put, + on_metadata_inventory_take = enchanting.on_take, + allow_metadata_inventory_put = enchanting.put, + allow_metadata_inventory_move = function() + return 0 + end, +}) + +minetest.register_entity("xdecor:book_open", { + initial_properties = { + visual = "sprite", + visual_size = {x=0.75, y=0.75}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + physical = false, + textures = {"xdecor_book_open.png"}, + static_save = false, + }, + + on_activate = function(self) + self.object:set_armor_groups({immortal=1}) + end, + + -- Minetest Game support: Prevent entity being pushed or damaged by TNT explosion + on_blast = function() + return false, false, {} + end, +}) + +minetest.register_lbm({ + label = "recreate book entity", + name = "xdecor:create_book_entity", + nodenames = {"xdecor:enchantment_table"}, + run_at_every_load = true, + action = function(pos, node) + local objs = minetest.get_objects_inside_radius(pos, 0.9) + + for _, obj in ipairs(objs) do + local e = obj:get_luaentity() + if e and e.name == "xdecor:book_open" then + return + end + end + + minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open") + end, +}) + +function enchanting:enchant_texture(img) + if img == nil or img == "" or type(img) ~= "string" then + return "no_texture.png" + else + return "("..img.. ")^[colorize:violet:50" + end +end + +function enchanting:register_tool(original_tool_name, def) + local original_tool = reg_tools[original_tool_name] + if not original_tool then + minetest.log("error", "[xdecor] Called enchanting:register_tool for non-existing tool: "..original_tool_name) + return + end + local original_toolcaps = original_tool.tool_capabilities + if not original_toolcaps then + minetest.log("error", "[xdecor] Called enchanting:register_tool for tool without tool_capabilities: "..original_tool_name) + return + end + local original_damage_groups = original_toolcaps.damage_groups + local original_groupcaps = original_toolcaps.groupcaps + local original_basename = original_tool_name:match(".*:(.*)") + local toolitem = ItemStack(original_tool_name) + local original_desc = toolitem:get_short_description() or original_tool_name + local groups + if def.groups then + groups = table.copy(def.groups) + elseif original_tool.groups then + groups = table.copy(original_tool.groups) + else + groups = {} + end + groups.not_in_creative_inventory = 1 + groups.enchanted_tool = 1 + for _, enchant in ipairs(def.enchants) do + local groupcaps = table.copy(original_groupcaps) + local full_punch_interval = original_toolcaps.full_punch_interval + local max_drop_level = original_toolcaps.max_drop_level + local dig_group = def.dig_group + local fleshy + + if not def.bonuses then + def.bonuses = {} + end + local bonus_defs = { + uses = def.bonuses.uses or DEFAULT_ENCHANTING_USES, + times = def.bonuses.times or DEFAULT_ENCHANTING_TIMES, + damages = def.bonuses.damages or DEFAULT_ENCHANTING_DAMAGES, + } + + if enchant == "durable" then + groupcaps[dig_group].uses = ceil(original_groupcaps[dig_group].uses * + bonus_defs.uses) + groups.enchantment_durable = 1 + elseif enchant == "fast" then + for i, time in pairs(original_groupcaps[dig_group].times) do + groupcaps[dig_group].times[i] = time - bonus_defs.times + end + groups.enchantment_fast = 1 + elseif enchant == "sharp" then + fleshy = original_damage_groups.fleshy + fleshy = fleshy + bonus_defs.damages + groups.enchantment_sharp = 1 + else + minetest.log("error", "[xdecor] Called enchanting:register_tool with unsupported enchant: "..tostring(enchant)) + return + end + + local arg1 = original_desc + local arg2 = self:get_tooltip(enchant, original_groupcaps[dig_group], fleshy, bonus_defs) + local enchantedTool = original_tool.mod_origin .. ":enchanted_" .. original_basename .. "_" .. enchant + + local invimg = original_tool.inventory_image + invimg = enchanting:enchant_texture(invimg) + local wieldimg = original_tool.wield_image + if wieldimg == nil or wieldimg == "" then + wieldimg = invimg + end + minetest.register_tool(":" .. enchantedTool, { + --~ Enchanted tool description, e.g. "Enchanted Diamond Sword". @1 is the original tool name, @2 is the enchantment text, e.g. "Durability (+20%)" + description = S("Enchanted @1\n@2", arg1, arg2), + --~ Enchanted tool description, e.g. "Enchanted Diamond Sword" + short_description = S("Enchanted @1", arg1), + inventory_image = invimg, + wield_image = wieldimg, + groups = groups, + tool_capabilities = { + groupcaps = groupcaps, damage_groups = {fleshy = fleshy}, + full_punch_interval = full_punch_interval, + max_drop_level = max_drop_level + }, + pointabilities = original_tool.pointabilities, + }) + if minetest.get_modpath("toolranks") then + toolranks.add_tool(enchantedTool) + end + end + available_tool_enchants[original_tool_name] = table.copy(def.enchants) + reg_enchantable_tools[original_tool_name] = true +end + +function enchanting:register_custom_tool(original_tool_name, enchanted_tools) + if not available_tool_enchants[original_tool_name] then + available_tool_enchants[original_tool_name] = {} + end + for enchant, v in pairs(enchanted_tools) do + table.insert(available_tool_enchants[original_tool_name], enchant) + end + reg_enchantable_tools[original_tool_name] = true +end + +-- Recipes + +minetest.register_craft({ + output = "xdecor:enchantment_table", + recipe = { + {"", "default:book", ""}, + {"default:diamond", "default:obsidian", "default:diamond"}, + {"default:obsidian", "default:obsidian", "default:obsidian"} + } +}) + +--[[ API FUNCTIONS ]] + +--[[ +Register one or more enchantments for an already defined tool. +This will register a new tool for each enchantment. The new tools will +have the following changes over the original: +* New description and short_description +* Apply a purple glow on wield_image and inventory_image using + "()^[colorize:purple" +* Change tool_capabilities and damage_groups, depending on + enchantments. +* Have groups set to { not_in_creative_inventory = 1 } + +The new tools will follow this naming scheme: + + :enchanted__ + +e.g. example:sword_diamond with the enchantment "sharp" will +have "example:enchanted_sword_diamond_sharp" added. + +You must make sure this name is available before calling this +function. + +Arguments: +* toolname: Itemstring of original tool to enchant +* def: Definition table with the following fields: + * enchants: a list of strings, one for each enchantment to add. + there must be at least one enchantment. + Available enchantments: + * "durable": Durability (tool lasts longer) + * "fast": Efficiency (tool digs faster) + * "sharp": Sharpness (more damage using the damage group "fleshy") + * dig_group: Must be specified if Durability or Efficiency is used. + This defines the tool's digging group that enchantment will improve. + * bonuses: optional table to customize the enchantment "strengths": + * uses: multiplies number of uses (Durability) (default: 1.2) + * times: subtracts from digging time; higher = faster (Efficiency) (default: 0.1) + * damages: adds to damage (Sharpness) (default: 1) + * groups: optional table specifying all item groups. If specified, + this should at least contain `not_in_creative_inventory=1`. + If unspecified (recommended), the enchanted tools will inherit all + groups from the original tool, plus they receive `not_in_creative_inventory=1` +]] +xdecor.register_enchantable_tool = function(toolname, def) + enchanting:register_tool(toolname, def) +end + +--[[ Registers a custom tool enchantment. +Here, you are fully free to design the tool yourself. + +The enchanted tools should follow these guidelines: + +1) Use xdecor.enchant_description to generate the description and short_description +2) Use xdecor.enchant_texture to generate the inventory_image and wield_image +3) Set groups to { not_in_creative_inventory = 1 } + +Arguments: +* toolname: Itemstring of original tool to enchant +* enchanted_tools: Table of enchanted tools. + * The keys are enchantment names from "enchants" in xdecor.register_enchantable_tool + * The values are the itemstrings of the enchanted tools for those + enchantments +]] +xdecor.register_custom_enchantable_tool = function(toolname, enchanted_tools) + enchanting:register_custom_tool(toolname, enchanted_tools) +end + +-- Takes a texture (string) and applies an "enchanting" modifier on it. +-- Useful when you want to register custom tool enchantments. +xdecor.enchant_texture = function(texture) + return enchanting:enchant_texture(texture) +end + +--[[ +Takes a description of a normal tool and modifies it for the enchanted tool variant. +Arguments: +* description: Original description to modify +* enchant: Enchantment type. One of the enchantment names from "enchants" in xdecor.register_enchantable_tool +* percent: Percentage to display + +Returns: , + +-- Useful when you want to register custom tool enchantments. +]] +xdecor.enchant_description = function(description, enchant, percent) + local append = enchanting:get_tooltip_raw(enchant, percent) + local desc = S("Enchanted @1\n@2", description, append) + local short_desc S("Enchanted @1", description) + return desc, short_desc +end + diff --git a/mods/xdecor/src/hive.lua b/mods/xdecor/src/hive.lua new file mode 100644 index 0000000..34b6091 --- /dev/null +++ b/mods/xdecor/src/hive.lua @@ -0,0 +1,207 @@ +local hive = {} +local S = minetest.get_translator("xdecor") +local FS = function(...) return minetest.formspec_escape(S(...)) end +local HONEY_MAX = 16 +local NEEDED_FLOWERS = 3 +local TIMER_MIN = 64 +local TIMER_MAX = 128 + +local text_busy = FS("The bees are busy making honey.") +local text_noflowers = FS("The bees are looking for flowers.") +local text_fewflowers = FS("The bees want to pollinate more flowers.") +local text_idle = FS("The bees are idle.") +local text_sleep = FS("The bees are resting.") + +function hive.set_formspec(meta, status) + local statustext + if status == "busy" then + statustext = text_busy + elseif status == "noflowers" then + statustext = text_noflowers + elseif status == "fewflowers" then + statustext = text_fewflowers + elseif status == "idle" then + statustext = text_idle + elseif status == "sleep" then + statustext = text_sleep + end + + local formspec = "size[8,6;]" + .."label[0.5,0;"..statustext.."]" + ..[[ image[6,1;1,1;hive_bee.png] + image[5,1;1,1;hive_layout.png] + list[context;honey;5,1;1,1;] + list[current_player;main;0,2.35;8,4;] + listring[current_player;main] + listring[context;honey] ]] .. + xdecor.xbg .. default.get_hotbar_bg(0,2.35) + meta:set_string("formspec", formspec) +end + +local function count_flowers(pos) + local radius = 4 + local minp = vector.add(pos, -radius) + local maxp = vector.add(pos, radius) + local flowers = minetest.find_nodes_in_area_under_air(minp, maxp, "group:flower") + return #flowers +end + +local function is_sleeptime() + local time = (minetest.get_timeofday() or 0) * 24000 + if time < 5500 or time > 18500 then + return true + else + return false + end +end + +function hive.construct(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + local status = "idle" + local flowers = count_flowers(pos) + if is_sleeptime() then + status = "sleep" + elseif flowers >= NEEDED_FLOWERS then + status = "busy" + elseif flowers > 0 then + status = "fewflowers" + else + status = "noflowers" + end + hive.set_formspec(meta, status) + meta:set_string("infotext", S("Artificial Hive")) + inv:set_size("honey", 1) + + local timer = minetest.get_node_timer(pos) + timer:start(math.random(TIMER_MIN, TIMER_MAX)) +end + +function hive.timer(pos) + local meta = minetest.get_meta(pos) + if is_sleeptime() then + hive.set_formspec(meta, "sleep") + return true + end + + local inv = minetest.get_meta(pos):get_inventory() + local honeystack = inv:get_stack("honey", 1) + local honey = honeystack:get_count() + + local flowers = count_flowers(pos) + + if flowers >= NEEDED_FLOWERS and honey < HONEY_MAX then + if honey == HONEY_MAX - 1 then + hive.set_formspec(meta, "idle") + else + hive.set_formspec(meta, "busy") + end + inv:add_item("honey", "xdecor:honey") + elseif honey == HONEY_MAX then + hive.set_formspec(meta, "idle") + local timer = minetest.get_node_timer(pos) + timer:stop() + return true + end + if flowers == 0 then + hive.set_formspec(meta, "noflowers") + elseif flowers < NEEDED_FLOWERS then + hive.set_formspec(meta, "fewflowers") + end + + return true +end + +function hive.blast(pos) + local drops = xdecor.get_inventory_drops(pos, {"honey"}) + minetest.remove_node(pos) + return drops +end + +xdecor.register("hive", { + --~ Beehive + description = S("Artificial Hive"), + --~ Tooltip of artificial hive + _tt_help = S("Bees live here and produce honey"), + tiles = {"xdecor_hive_top.png", "xdecor_hive_top.png", + "xdecor_hive_side.png", "xdecor_hive_side.png", + "xdecor_hive_side.png", "xdecor_hive_front.png"}, + groups = {choppy=3, oddly_breakable_by_hand=2, flammable=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + on_construct = hive.construct, + on_timer = hive.timer, + on_blast = hive.blast, + + can_dig = function(pos) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("honey") + end, + + on_punch = function(_, _, puncher) + puncher:set_hp(puncher:get_hp() - 2) + end, + + allow_metadata_inventory_put = function() + return 0 + end, + + on_metadata_inventory_take = function(pos, list, index, stack) + local inv = minetest.get_inventory({type="node", pos=pos}) + local remainstack = inv:get_stack(list, index) + -- Trigger if taking anything from full honey slot + if remainstack:get_count() + stack:get_count() >= HONEY_MAX then + local timer = minetest.get_node_timer(pos) + timer:start(math.random(TIMER_MIN, TIMER_MAX)) + if not is_sleeptime() and count_flowers(pos) >= NEEDED_FLOWERS then + local meta = minetest.get_meta(pos) + hive.set_formspec(meta, "busy") + end + end + end +}) + +-- Craft items + +minetest.register_craftitem("xdecor:honey", { + description = S("Honey"), + inventory_image = "xdecor_honey.png", + wield_image = "xdecor_honey.png", + on_use = minetest.item_eat(2), + groups = { + food_honey = 1, + food_sugar = 1, + flammable = 2, + xdecor_soup_ingredient = 1, + }, +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:hive", + recipe = { + {"group:stick", "group:stick", "group:stick"}, + {"default:paper", "default:paper", "default:paper"}, + {"group:stick", "group:stick", "group:stick"} + } +}) + +if minetest.get_modpath("unified_inventory") then + unified_inventory.register_craft_type("xdecor:hive", { + --~ Tooltip for honey in crafting guide of the Unified Inventory mod + description = S("Made by bees"), + icon = "hive_bee.png", + width = 1, + height = 1, + uses_crafting_grid = false + }) + + unified_inventory.register_craft({ + output = "xdecor:honey", + type = "xdecor:hive", + items = {"xdecor:hive"}, + width = 1 + }) +end diff --git a/mods/xdecor/src/itemframe.lua b/mods/xdecor/src/itemframe.lua new file mode 100644 index 0000000..da2780f --- /dev/null +++ b/mods/xdecor/src/itemframe.lua @@ -0,0 +1,266 @@ +-- Item frames. + +-- Hint: +-- If your item appears behind or too far in front of the item frame, add +-- _xdecor_itemframe_offset = +-- to your item definition to fix it. + +local itemframe, tmp = {}, {} +local S = minetest.get_translator("xdecor") +screwdriver = screwdriver or {} + +-- Description of item frame node +local DESC_ITEM_FRAME = S("Item Frame") + +local function remove_item(pos, node) + local objs = minetest.get_objects_inside_radius(pos, 0.5) + if not objs then return end + + for _, obj in pairs(objs) do + local ent = obj:get_luaentity() + if obj and ent and ent.name == "xdecor:f_item" then + obj:remove() break + end + end +end + +local facedir = { + [0] = {x = 0, y = 0, z = 1}, + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, + {x = -1, y = 0, z = 0} +} + +local function update_item(pos, node) + remove_item(pos, node) + local meta = minetest.get_meta(pos) + local itemstring = meta:get_string("item") + local posad = facedir[node.param2] + if not posad or itemstring == "" then return end + + local itemdef = ItemStack(itemstring):get_definition() + local offset_plus = 0 + if itemdef and itemdef._xdecor_itemframe_offset then + offset_plus = itemdef._xdecor_itemframe_offset + offset_plus = math.min(6, math.max(-6, offset_plus)) + end + local offset = (6.5+offset_plus)/16 + + pos = vector.add(pos, vector.multiply(posad, offset)) + tmp.nodename = node.name + tmp.texture = ItemStack(itemstring):get_name() + + local entity = minetest.add_entity(pos, "xdecor:f_item") + local yaw = (math.pi * 2) - node.param2 * (math.pi / 2) + entity:set_yaw(yaw) + + local timer = minetest.get_node_timer(pos) + timer:start(15.0) +end + +local function drop_item(pos, node) + local meta = minetest.get_meta(pos) + local item = meta:get_string("item") + if item == "" then return end + + minetest.add_item(pos, item) + meta:set_string("item", "") + remove_item(pos, node) + + local timer = minetest.get_node_timer(pos) + timer:stop() +end + +function itemframe.set_infotext(meta) + local itemstring = meta:get_string("item") + local owner = meta:get_string("owner") + if itemstring == "" then + if owner ~= "" then + meta:set_string("infotext", + --~ Item frame infotext. @1 = item frame name, @2 = owner name (player) + S("@1 (owned by @2)", + --~ Block that can display an item + DESC_ITEM_FRAME, owner)) + else + meta:set_string("infotext", DESC_ITEM_FRAME) + end + else + local itemstack = ItemStack(itemstring) + local tooltip = itemstack:get_short_description() + if tooltip == "" then + tooltip = itemstack:get_name() + end + if itemstring == "" then + tooltip = DESC_ITEM_FRAME + end + if owner ~= "" then + meta:set_string("infotext", S("@1 (owned by @2)", tooltip, owner)) + else + meta:set_string("infotext", tooltip) + end + end +end + +function itemframe.after_place(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + local name = placer:get_player_name() + meta:set_string("owner", name) + itemframe.set_infotext(meta) +end + +function itemframe.timer(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local num = #minetest.get_objects_inside_radius(pos, 0.5) + + if num == 0 and meta:get_string("item") ~= "" then + update_item(pos, node) + end + + return true +end + +function itemframe.rightclick(pos, node, clicker, itemstack) + local meta = minetest.get_meta(pos) + local player_name = clicker:get_player_name() + local owner = meta:get_string("owner") + local admin = minetest.check_player_privs(player_name, "protection_bypass") + + if not admin and (player_name ~= owner or not itemstack) then + return itemstack + end + + drop_item(pos, node) + local itemstring = itemstack:take_item():to_string() + meta:set_string("item", itemstring) + itemframe.set_infotext(meta) + update_item(pos, node) + return itemstack +end + +function itemframe.punch(pos, node, puncher) + local meta = minetest.get_meta(pos) + local player_name = puncher:get_player_name() + local owner = meta:get_string("owner") + local admin = minetest.check_player_privs(player_name, "protection_bypass") + + if admin or player_name == owner then + drop_item(pos, node) + end +end + +function itemframe.dig(pos, player) + if not player then return end + local meta = minetest.get_meta(pos) + local player_name = player and player:get_player_name() + local owner = meta:get_string("owner") + local admin = minetest.check_player_privs(player_name, "protection_bypass") + + return admin or player_name == owner +end + +function itemframe.blast(pos) + return +end + +xdecor.register("itemframe", { + description = DESC_ITEM_FRAME, + --~ Item frame tooltip + _tt_help = S("For presenting a single item"), + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + on_rotate = screwdriver.disallow, + sunlight_propagates = true, + inventory_image = "xdecor_itemframe.png", + node_box = xdecor.nodebox.slab_z(0.9375), + tiles = { + "xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png", + "xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png" + }, + after_place_node = itemframe.after_place, + on_timer = itemframe.timer, + on_rightclick = itemframe.rightclick, + on_punch = itemframe.punch, + can_dig = itemframe.dig, + on_blast = itemframe.blast, + on_destruct = function(pos) + local node = minetest.get_node(pos) + drop_item(pos, node) + end, + after_destruct = remove_item, + _xdecor_itemframe_offset = -3.5, +}) + +minetest.register_entity("xdecor:f_item", { + initial_properties = { + visual = "wielditem", + visual_size = {x = 0.33, y = 0.33}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + physical = false, + textures = {"air"}, + }, + on_activate = function(self, staticdata) + local pos = self.object:get_pos() + if minetest.get_node(pos).name ~= "xdecor:itemframe" then + self.object:remove() + return + end + + if tmp.nodename and tmp.texture then + self.nodename = tmp.nodename + tmp.nodename = nil + self.texture = tmp.texture + tmp.texture = nil + elseif staticdata and staticdata ~= "" then + local data = staticdata:split(";") + if data and data[1] and data[2] then + self.nodename = data[1] + self.texture = data[2] + end + end + if self.texture then + self.object:set_properties({ + textures = {self.texture} + }) + end + + self.object:set_armor_groups({immortal=1}) + end, + get_staticdata = function(self) + if self.nodename and self.texture then + return self.nodename .. ";" .. self.texture + end + + return "" + end, + + -- Minetest Game support: Prevent entity being pushed or damaged by TNT explosion + on_blast = function() + return false, false, {} + end, +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:itemframe", + recipe = { + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "default:paper", "group:stick"}, + {"group:stick", "group:stick", "group:stick"} + } +}) + +minetest.register_lbm({ + label = "Update itemframe infotexts", + name = "xdecor:update_itemframe_infotexts", + nodenames = {"xdecor:itemframe"}, + run_at_every_load = true, + action = function(pos, node) + local meta = minetest.get_meta(pos) + itemframe.set_infotext(meta) + end, +}) + diff --git a/mods/xdecor/src/mailbox.lua b/mods/xdecor/src/mailbox.lua new file mode 100644 index 0000000..437c4d6 --- /dev/null +++ b/mods/xdecor/src/mailbox.lua @@ -0,0 +1,214 @@ +local mailbox = {} +screwdriver = screwdriver or {} +local S = minetest.get_translator("xdecor") +local FS = function(...) return minetest.formspec_escape(S(...)) end + +-- Max. length of the list of givers in mailbox formspec +local GIVER_LIST_LENGTH = 7 + +local function get_img(img) + if not img then return end + local img_name = img:match("(.*)%.png") + + if img_name then + return img_name .. ".png" + end +end + +local function img_col(stack) + local def = minetest.registered_items[stack] + if not def then + return "" + end + + if def.inventory_image ~= "" then + local img = get_img(def.inventory_image) + if img then + return img + end + end + + if def.tiles then + local tile, img = def.tiles[1] + if type(tile) == "table" then + img = get_img(tile.name) + elseif type(tile) == "string" then + img = get_img(tile) + end + + if img then + return img + end + end + + return "" +end + +function mailbox:formspec(pos, owner, is_owner) + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + local meta = minetest.get_meta(pos) + local giver, img = "", "" + + if is_owner then + for i = 1, GIVER_LIST_LENGTH do + local giving = meta:get_string("giver" .. i) + if giving ~= "" then + local stack = meta:get_string("stack" .. i) + local giver_name = giving:sub(1,12) + local stack_name = stack:match("[%w_:]+") + local stack_count = stack:match("%s(%d+)") or 1 + + -- List of donors. A line looks like this: + -- × + giver = giver .. "#FFFF00," .. giver_name .. "," .. i .. + --~ Used in the mailbox donor list. Will be displayed as item icon followed by this string. @1 = item count + ",#FFFFFF," .. FS("× @1", stack_count) .. "," + + img = img .. i .. "=" .. + img_col(stack_name) .. "^\\[resize:16x16," + end + end + + return "size[9.5,9]" + .."label[0,0;"..FS("Mailbox").."]" + --~ Caption of the list of players who gave items in a mailbox + .."label[6,0;"..FS("Last donators").."]" + ..[[ box[6,0.72;3.3,3.9;#555555] + listring[current_player;main] + list[current_player;main;0.75,5.25;8,4;] + tableoptions[background=#00000000;highlight=#00000000;border=false] ]] .. + "tablecolumns[color;text;image," .. img .. "0;color;text]" .. + "table[6,0.75;3.3,4;givers;" .. giver .. "]" .. + "list[nodemeta:" .. spos .. ";mailbox;0,0.75;6,4;]" .. + "listring[nodemeta:" .. spos .. ";mailbox]" .. + xdecor.xbg .. default.get_hotbar_bg(0.75, 5.25) + end + + return "size[8,5]" .. + "list[current_player;main;0,1.25;8,4;]" .. + --~ Mailbox menu title. @1 = player name + "label[0,0;"..FS("Send your goods to\n@1", + (minetest.colorize and + minetest.colorize("#FFFF00", owner) or owner)) .. "]" .. + "list[nodemeta:" .. spos .. ";drop;3.5,0;1,1;]" .. + "listring[]" .. + xdecor.xbg .. default.get_hotbar_bg(0, 1.25) +end + +function mailbox.dig(pos, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local player_name = player and player:get_player_name() + local inv = meta:get_inventory() + + return inv:is_empty("mailbox") and player_name == owner +end + +function mailbox.blast(pos) + return +end + +function mailbox.after_place_node(pos, placer) + local meta = minetest.get_meta(pos) + local player_name = placer:get_player_name() + + meta:set_string("owner", player_name) + --~ Mailbox infotext. @1 = owner name + meta:set_string("infotext", S("@1's Mailbox", player_name)) + + local inv = meta:get_inventory() + inv:set_size("mailbox", 6 * 4) + inv:set_size("drop", 1) +end + +function mailbox.rightclick(pos, node, clicker, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local player = clicker:get_player_name() + local owner = meta:get_string("owner") + + minetest.show_formspec(player, "xdecor:mailbox", + mailbox:formspec(pos, owner, (player == owner))) + + return itemstack +end + +function mailbox.put(pos, listname, _, stack, player) + if listname == "drop" then + local inv = minetest.get_meta(pos):get_inventory() + if inv:room_for_item("mailbox", stack) then + return -1 + else + minetest.chat_send_player(player:get_player_name(), + S("The mailbox is full.")) + end + end + + return 0 +end + +function mailbox.on_put(pos, listname, _, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if listname == "drop" and inv:room_for_item("mailbox", stack) then + inv:set_list("drop", {}) + inv:add_item("mailbox", stack) + + for i = GIVER_LIST_LENGTH, 2, -1 do + meta:set_string("giver" .. i, meta:get_string("giver" .. (i - 1))) + meta:set_string("stack" .. i, meta:get_string("stack" .. (i - 1))) + end + + meta:set_string("giver1", player:get_player_name()) + meta:set_string("stack1", stack:to_string()) + end +end + +function mailbox.allow_take(pos, listname, index, stack, player) + if listname == "drop" then + return 0 + end + local meta = minetest.get_meta(pos) + + if player:get_player_name() ~= meta:get_string("owner") then + return 0 + end + + return stack:get_count() +end + +function mailbox.allow_move(pos) + return 0 +end + +xdecor.register("mailbox", { + description = S("Mailbox"), + --~ Mailbox tooltip + _tt_help = S("Lets other players give you things"), + tiles = {"xdecor_mailbox_top.png", "xdecor_mailbox_bottom.png", + "xdecor_mailbox_side.png", "xdecor_mailbox_side.png", + "xdecor_mailbox.png", "xdecor_mailbox.png"}, + groups = {cracky = 3, oddly_breakable_by_hand = 1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + on_rotate = screwdriver.rotate_simple, + can_dig = mailbox.dig, + on_blast = mailbox.blast, + on_rightclick = mailbox.rightclick, + allow_metadata_inventory_take = mailbox.allow_take, + allow_metadata_inventory_move = mailbox.allow_move, + on_metadata_inventory_put = mailbox.on_put, + allow_metadata_inventory_put = mailbox.put, + after_place_node = mailbox.after_place_node +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:mailbox", + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"dye:red", "default:paper", "dye:red"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"} + } +}) diff --git a/mods/xdecor/src/mechanisms.lua b/mods/xdecor/src/mechanisms.lua new file mode 100644 index 0000000..0427675 --- /dev/null +++ b/mods/xdecor/src/mechanisms.lua @@ -0,0 +1,325 @@ +-- Thanks to sofar for helping with that code. + +local plate = {} +screwdriver = screwdriver or {} + +local S = minetest.get_translator("xdecor") +local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false + +-- Number of seconds an actuator (pressure plate, lever) stays active. +-- After this time, it will return to the disabled state again. +local DISABLE_ACTUATOR_AFTER = 2.0 + +-- Effect area of pressure plates and levers. Doors within this area +-- can be affected. +local PRESSURE_PLATE_AREA_MIN = {x = -2, y = 0, z = -2} +local PRESSURE_PLATE_AREA_MAX = {x = 2, y = 0, z = 2} +local LEVER_AREA_MIN = {x = -2, y = -1, z = -2} +local LEVER_AREA_MAX = {x = 2, y = 1, z = 2} + +-- Pressure plates check for players within this radius +local PRESSURE_PLATE_PLAYER_RADIUS = 0.8 +-- Interval in seconds that pressure plates check for players +local PRESSURE_PLATE_CHECK_TIMER = 0.1 + +local function door_open(pos_door, player) + local door = doors.get(pos_door) + if not door then + return + end + door:open(player) +end + +local function door_close(pos_door, player) + local door = doors.get(pos_door) + if not door then + return + end + door:close(player) +end + +-- Returns true if the door node at pos is currently next to any +-- active actuator node (lever, pressure plate) +local function door_is_actuatored(pos_door) + local minp = vector.add(LEVER_AREA_MIN, pos_door) + local maxp = vector.add(LEVER_AREA_MAX, pos_door) + local levers = minetest.find_nodes_in_area(minp, maxp, "group:lever") + for l=1, #levers do + local lnode = minetest.get_node(levers[l]) + if minetest.get_item_group(lnode.name, "xdecor_actuator") == 2 then + return true + end + end + minp = vector.add(PRESSURE_PLATE_AREA_MIN, pos_door) + maxp = vector.add(PRESSURE_PLATE_AREA_MAX, pos_door) + local pressure_plates = minetest.find_nodes_in_area(minp, maxp, "group:pressure_plate") + for p=1, #pressure_plates do + local pnode = minetest.get_node(pressure_plates[p]) + if minetest.get_item_group(pnode.name, "xdecor_actuator") == 2 then + return true + end + end + return false +end + +local function actuator_timeout(pos_actuator, actuator_area_min, actuator_area_max) + local actuator = minetest.get_node(pos_actuator) + + -- Get name of last player that triggered the actuator + local meta = minetest.get_meta(pos_actuator) + local last_triggerer_str = meta:get_string("last_triggerer") + local last_triggerer_obj = minetest.get_player_by_name(last_triggerer_str) + + -- Turn off actuator + if minetest.get_item_group(actuator.name, "xdecor_actuator") == 2 then + local def = minetest.registered_nodes[actuator.name] + if def._xdecor_actuator_off then + minetest.set_node(pos_actuator, { name = def._xdecor_actuator_off, param2 = actuator.param2 }) + end + end + + -- Close neighboring doors that are no longer next to any active actuator + local minp = vector.add(actuator_area_min, pos_actuator) + local maxp = vector.add(actuator_area_max, pos_actuator) + local doors = minetest.find_nodes_in_area(minp, maxp, "group:door") + for d=1, #doors do + if not door_is_actuatored(doors[d]) then + local dnode = minetest.get_node(doors[d]) + local ddef = minetest.registered_nodes[dnode.name] + if (ddef.protected and last_triggerer_obj) or (not ddef.protected) then + door_close(doors[d], last_triggerer_obj) + end + end + end +end + +local function actuator_activate(pos_actuator, actuator_area_min, actuator_area_max, player) + local player_name = player:get_player_name() + local actuator = minetest.get_node(pos_actuator) + local ga = minetest.get_item_group(actuator.name, "xdecor_actuator") + if ga == 2 then + -- No-op if actuator is already active + return + elseif ga == 1 then + local def = minetest.registered_nodes[actuator.name] + -- Turn actuator on + if def._xdecor_actuator_on then + minetest.set_node(pos_actuator, { name = def._xdecor_actuator_on, param2 = actuator.param2 }) + + -- Store name of last player that triggered the actuator + local meta = minetest.get_meta(pos_actuator) + meta:set_string("last_triggerer", player_name) + end + end + + -- Turn on neighboring doors + local minp = vector.add(actuator_area_min, pos_actuator) + local maxp = vector.add(actuator_area_max, pos_actuator) + local doors = minetest.find_nodes_in_area(minp, maxp, "group:door") + for i = 1, #doors do + door_open(doors[i], player) + end +end + +function plate.construct(pos) + local timer = minetest.get_node_timer(pos) + timer:start(PRESSURE_PLATE_CHECK_TIMER) +end + +function plate.has_player_standing_on(pos) + local objs = minetest.get_objects_inside_radius(pos, PRESSURE_PLATE_PLAYER_RADIUS) + for _, player in pairs(objs) do + if player:is_player() then + return true, player + end + end + return false +end + +function plate.timer(pos) + if not doors.get then + return true + end + local ok, player = plate.has_player_standing_on(pos) + if ok then + actuator_activate(pos, PRESSURE_PLATE_AREA_MIN, PRESSURE_PLATE_AREA_MAX, player) + return false + end + + return true +end + +function plate.construct_on(pos) + local timer = minetest.get_node_timer(pos) + timer:start(DISABLE_ACTUATOR_AFTER) +end + +function plate.timer_on(pos) + if plate.has_player_standing_on(pos) then + -- If player is still standing on active pressure plate, restart timer + local timer = minetest.get_node_timer(pos) + timer:start(DISABLE_ACTUATOR_AFTER) + return + end + + actuator_timeout(pos, PRESSURE_PLATE_AREA_MIN, PRESSURE_PLATE_AREA_MAX) +end + +function plate.register(material, desc, def) + local groups + if def.groups then + groups = table.copy(def.groups) + else + groups = {} + end + groups.pressure_plate = 1 + groups.xdecor_actuator = 1 + xdecor.register("pressure_" .. material .. "_off", { + description = def.description or (desc .. " Pressure Plate"), + --~ Pressure plate tooltip + _tt_help = S("Opens doors when stepped on"), + tiles = {"xdecor_pressure_" .. material .. ".png"}, + use_texture_alpha = ALPHA_OPAQUE, + drawtype = "nodebox", + node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}), + groups = groups, + is_ground_content = false, + sounds = def.sounds, + sunlight_propagates = true, + on_rotate = screwdriver.rotate_simple, + on_construct = plate.construct, + on_timer = plate.timer, + _xdecor_actuator_off = "xdecor:pressure_"..material.."_off", + _xdecor_actuator_on = "xdecor:pressure_"..material.."_on", + }) + local groups_on = table.copy(groups) + groups_on.xdecor_actuator = 2 + groups_on.pressure_plate = 2 + xdecor.register("pressure_" .. material .. "_on", { + tiles = {"xdecor_pressure_" .. material .. ".png"}, + use_texture_alpha = ALPHA_OPAQUE, + drawtype = "nodebox", + node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}), + groups = groups_on, + is_ground_content = false, + sounds = def.sounds, + drop = "xdecor:pressure_" .. material .. "_off", + sunlight_propagates = true, + on_rotate = screwdriver.rotate_simple, + on_construct = plate.construct_on, + on_timer = plate.timer_on, + _xdecor_actuator_off = "xdecor:pressure_"..material.."_off", + _xdecor_actuator_on = "xdecor:pressure_"..material.."_on", + }) +end + +plate.register("wood", "Wooden", { + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2}, + description = S("Wooden Pressure Plate"), +}) + +plate.register("stone", "Stone", { + sounds = default.node_sound_stone_defaults(), + groups = {cracky = 3, oddly_breakable_by_hand = 2}, + description = S("Stone Pressure Plate"), +}) + +xdecor.register("lever_off", { + description = S("Lever"), + --~ Lever tooltip + _tt_help = S("Opens doors when pulled"), + tiles = {"xdecor_lever_off.png"}, + use_texture_alpha = ALPHA_OPAQUE, + drawtype = "nodebox", + node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}), + groups = {cracky = 3, oddly_breakable_by_hand = 2, lever = 1, xdecor_actuator = 1}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + on_rotate = screwdriver.rotate_simple, + + on_rightclick = function(pos, node, clicker, itemstack) + if not doors.get then + return itemstack + end + actuator_activate(pos, LEVER_AREA_MIN, LEVER_AREA_MAX, clicker) + return itemstack + end, + _xdecor_itemframe_offset = -3.5, + _xdecor_actuator_off = "xdecor:lever_off", + _xdecor_actuator_on = "xdecor:lever_on", +}) + +xdecor.register("lever_on", { + tiles = {"xdecor_lever_on.png"}, + use_texture_alpha = ALPHA_OPAQUE, + drawtype = "nodebox", + node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}), + groups = {cracky = 3, oddly_breakable_by_hand = 2, lever = 2, xdecor_actuator = 2, not_in_creative_inventory = 1}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + on_rotate = screwdriver.rotate_simple, + on_rightclick = function(pos, node, clicker, itemstack) + -- Prevent placing nodes on activated lever with the place key + -- for consistent behavior with the lever in "off" state. + -- The player may still place nodes using [Sneak]. + return itemstack + end, + on_construct = function(pos) + local timer = minetest.get_node_timer(pos) + timer:start(DISABLE_ACTUATOR_AFTER) + end, + on_timer = function(pos) + local node = minetest.get_node(pos) + actuator_timeout(pos, LEVER_AREA_MIN, LEVER_AREA_MAX) + end, + drop = "xdecor:lever_off", + _xdecor_itemframe_offset = -3.5, + _xdecor_actuator_off = "xdecor:lever_off", + _xdecor_actuator_on = "xdecor:lever_on", +}) + +-- Make sure the node timers of active actuators are still +-- active when these nodes load again. If not, start them +-- again to trigger their timer action, which is expected +-- to turn off the actuator soon. +minetest.register_lbm({ + label = "Restart actuator timers (X-Decor-libre)", + name = "xdecor:restart_actuator_timers", + nodenames = { "group:xdecor_actuator" }, + run_at_every_load = true, + action = function(pos, node) + local g = minetest.get_item_group(node.name, "xdecor_actuator") + if g ~= 2 then + return + end + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + timer:start(DISABLE_ACTUATOR_AFTER) + end + end, +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:pressure_stone_off", + type = "shapeless", + recipe = {"group:stone", "group:stone"} +}) + +minetest.register_craft({ + output = "xdecor:pressure_wood_off", + type = "shapeless", + recipe = {"group:wood", "group:wood"} +}) + +minetest.register_craft({ + output = "xdecor:lever_off", + recipe = { + {"group:stick"}, + {"group:stone"} + } +}) diff --git a/mods/xdecor/src/nodes.lua b/mods/xdecor/src/nodes.lua new file mode 100644 index 0000000..2c4a63b --- /dev/null +++ b/mods/xdecor/src/nodes.lua @@ -0,0 +1,977 @@ +screwdriver = screwdriver or {} +local S = minetest.get_translator("xdecor") +local ALPHA_CLIP = minetest.features.use_texture_alpha_string_modes and "clip" or true +local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false + +local function register_pane(name, desc, def) + xpanes.register_pane(name, { + description = desc, + tiles = {"xdecor_" .. name .. ".png"}, + drawtype = "airlike", + paramtype = "light", + textures = def.textures or {"xdecor_" .. name .. ".png", "" ,"xdecor_" .. name .. ".png"}, + inventory_image = "xdecor_" .. name .. ".png", + wield_image = "xdecor_" .. name .. ".png", + groups = def.groups, + sounds = def.sounds or default.node_sound_defaults(), + recipe = def.recipe + }) +end + +register_pane("bamboo_frame", S("Bamboo Frame"), { + groups = {choppy = 3, oddly_breakable_by_hand = 2, pane = 1, flammable = 2}, + recipe = { + {"default:papyrus", "default:papyrus", "default:papyrus"}, + {"default:papyrus", "farming:cotton", "default:papyrus"}, + {"default:papyrus", "default:papyrus", "default:papyrus"} + }, + sounds = default.node_sound_wood_defaults(), +}) + +register_pane("chainlink", S("Chainlink"), { + groups = {cracky = 3, oddly_breakable_by_hand = 2, pane = 1}, + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"", "default:steel_ingot", ""}, + {"default:steel_ingot", "", "default:steel_ingot"} + } +}) + +register_pane("rusty_bar", S("Rusty Iron Bars"), { + sounds = default.node_sound_stone_defaults(), + textures = {"xdecor_rusty_bar.png", "", "xdecor_rusty_bar_top.png"}, + groups = {cracky = 2, pane = 1}, + recipe = { + {"", "default:dirt", ""}, + {"default:iron_lump", "default:iron_lump", "default:iron_lump"}, + {"default:iron_lump", "default:iron_lump", "default:iron_lump"}, + }, + sounds = default.node_sound_metal_defaults(), +}) + +register_pane("wood_frame", S("Wood Frame"), { + sounds = default.node_sound_wood_defaults(), + textures = {"xdecor_wood_frame.png", "", "xdecor_wood_frame_top.png"}, + groups = {choppy = 2, pane = 1, flammable = 2}, + recipe = { + {"group:wood", "group:stick", "group:wood"}, + {"group:stick", "group:stick", "group:stick"}, + {"group:wood", "group:stick", "group:wood"} + } +}) + +xdecor.register("baricade", { + description = S("Barricade"), + drawtype = "plantlike", + paramtype2 = "facedir", + inventory_image = "xdecor_baricade.png", + tiles = {"xdecor_baricade.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + is_ground_content = false, + damage_per_second = 4, + selection_box = xdecor.nodebox.slab_y(0.3), + collision_box = xdecor.pixelbox(2, {{0, 0, 1, 2, 2, 0}}) +}) + +xdecor.register("barrel", { + description = S("Barrel"), + tiles = {"xdecor_barrel_top.png", "xdecor_barrel_top.png", "xdecor_barrel_sides.png"}, + on_place = minetest.rotate_node, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults() +}) + +local function blast_storage(pos) + local drops = xdecor.get_inventory_drops(pos, {"main"}) + minetest.remove_node(pos) + return drops +end + +local function register_storage(name, desc, def) + xdecor.register(name, { + description = desc, + _tt_help = def._tt_help, + inventory = {size = def.inv_size or 24}, + infotext = desc, + tiles = def.tiles, + use_texture_alpha = ALPHA_OPAQUE, + node_box = def.node_box, + on_rotate = def.on_rotate, + on_place = def.on_place, + on_blast = blast_storage, + groups = def.groups or {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults() + }) +end + +register_storage("cabinet", S("Wooden Cabinet"), { + --~ Tooltip for block that stores items + _tt_help = S("24 inventory slots"), + on_rotate = screwdriver.rotate_simple, + tiles = { + "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", + "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", + "xdecor_cabinet_sides.png", "xdecor_cabinet_front.png" + } +}) + +register_storage("cabinet_half", S("Half Wooden Cabinet"), { + inv_size = 8, + --~ Tooltip for block that stores items + _tt_help = S("8 inventory slots"), + node_box = xdecor.nodebox.slab_y(0.5, 0.5), + on_rotate = screwdriver.rotate_simple, + tiles = { + "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", + "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png", + "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png" + } +}) + +if minetest.get_modpath("moreblocks") then + minetest.register_alias("xdecor:empty_shelf", "moreblocks:empty_shelf") +else + -- Node renamed from "Empty Shelf" because it was misleading. + -- (you can still put things in it, making it non-empty) + register_storage("empty_shelf", S("Plain Shelf"), { + _tt_help = S("24 inventory slots"), + on_rotate = screwdriver.rotate_simple, + tiles = { + "default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "default_wood.png^xdecor_empty_shelf.png" + }, + }) + + -- Update infotext of old empty_shelf nodes to "Plain Shelf" + minetest.register_lbm({ + label = "Update plain shelf infotext", + name = "xdecor:empty_shelf_to_plain_shelf", + nodenames = {"xdecor:empty_shelf"}, + run_at_every_load = false, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", S("Plain Shelf")) + end, + }) +end + +register_storage("multishelf", S("Multi Shelf"), { + _tt_help = S("24 inventory slots"), + on_rotate = screwdriver.rotate_simple, + tiles = { + "default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "default_wood.png^xdecor_multishelf.png" + }, +}) + +xdecor.register("candle", { + description = S("Candle"), + light_source = 12, + drawtype = "torchlike", + inventory_image = "xdecor_candle_inv.png", + wield_image = "xdecor_candle_wield.png", + paramtype2 = "wallmounted", + walkable = false, + groups = {dig_immediate = 3, attached_node = 1}, + is_ground_content = false, + tiles = { + { + name = "xdecor_candle_floor.png", + animation = {type="vertical_frames", length = 1.5} + }, + { + name = "xdecor_candle_hanging.png", + animation = {type="vertical_frames", length = 1.5} + }, + { + name = "xdecor_candle_wall.png", + animation = {type="vertical_frames", length = 1.5} + } + }, + selection_box = { + type = "wallmounted", + wall_top = {-0.25, -0.3, -0.25, 0.25, 0.5, 0.25}, + wall_bottom = {-0.25, -0.5, -0.25, 0.25, 0.1, 0.25}, + wall_side = {-0.5, -0.35, -0.15, -0.15, 0.4, 0.15} + } +}) + +xdecor.register("chair", { + description = S("Chair"), + tiles = {"xdecor_wood.png"}, + sounds = default.node_sound_wood_defaults(), + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2, sittable = 1}, + is_ground_content = false, + on_rotate = screwdriver.rotate_simple, + node_box = xdecor.pixelbox(16, { + {3, 0, 11, 2, 16, 2}, + {11, 0, 11, 2, 16, 2}, + {5, 9, 11.5, 6, 6, 1}, + {3, 0, 3, 2, 6, 2}, + {11, 0, 3, 2, 6, 2}, + {3, 6, 3, 10, 2, 8} + }), + can_dig = xdecor.sit_dig, + after_destruct = xdecor.sit_destruct, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + xdecor.sit(pos, node, clicker, pointed_thing) + return itemstack + end, + _xdecor_itemframe_offset = -1.5, +}) + +xdecor.register("cobweb", { + description = S("Cobweb"), + drawtype = "plantlike", + tiles = {"xdecor_cobweb.png"}, + inventory_image = "xdecor_cobweb.png", + move_resistance = 8, + walkable = false, + selection_box = {type = "regular"}, + groups = {snappy = 3, flammable = 3}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults() +}) + +local curtain_colors = { + red = { S("Red Curtain"), "wool_red.png", "wool:red" }, +} + +local CURTAIN_OFFSET = 1/16 + +-- For preserve_metadata for curtains. +-- Erases metadata from the drops +-- because the item metadata should be empty +-- to allow proper item stacking. +local cleanup_curtain_meta = function(_,_,_,drops) + for d=1, #drops do + local meta = drops[d]:get_meta() + meta:set_string("palette_index", "") + end +end + +for c, info in pairs(curtain_colors) do + local desc = info[1] + local base_texture = info[2] + local craft_item = info[3] + xdecor.register("curtain_" .. c, { + description = desc, + walkable = false, + tiles = {base_texture, "("..base_texture..")^[transformFY", base_texture}, + use_texture_alpha = ALPHA_CLIP, + inventory_image = base_texture.."^xdecor_curtain_open_overlay.png^[makealpha:255,126,126", + wield_image = base_texture.."^xdecor_curtain_open_overlay.png^[makealpha:255,126,126", + drawtype = "nodebox", + paramtype2 = "wallmounted", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -0.5, -0.5, -0.5+CURTAIN_OFFSET, 0.5, 0.5 }, + wall_top = { -0.5, 0.5-CURTAIN_OFFSET, -0.5, 0.5, 0.5, 0.5 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, -0.5+CURTAIN_OFFSET, 0.5 }, + }, + groups = {dig_immediate = 3, flammable = 3}, + is_ground_content = false, + on_rightclick = function(pos, node, _, itemstack) + minetest.set_node(pos, {name = "xdecor:curtain_open_" .. c, param2 = node.param2}) + return itemstack + end, + preserve_metadata = cleanup_curtain_meta, + }) + + local open_tile = base_texture.."^xdecor_curtain_open_overlay.png^[makealpha:255,126,126" + xdecor.register("curtain_open_" .. c, { + tiles = { + open_tile, + "("..open_tile..")^[transformFY", + base_texture, + base_texture, + base_texture.."^xdecor_curtain_open_overlay_top.png^[makealpha:255,126,126", + base_texture.."^xdecor_curtain_open_overlay_bottom.png^[makealpha:255,126,126", + }, + use_texture_alpha = ALPHA_CLIP, + drawtype = "nodebox", + paramtype2 = "wallmounted", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -0.5, -0.5, -0.5+CURTAIN_OFFSET, 0.5, 0.5 }, + wall_top = { -0.5, 0.5-CURTAIN_OFFSET, -0.5, 0.5, 0.5, 0.5 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, -0.5+CURTAIN_OFFSET, 0.5 }, + }, + walkable = false, + groups = {dig_immediate = 3, flammable = 3, not_in_creative_inventory = 1}, + is_ground_content = false, + drop = "xdecor:curtain_" .. c, + on_rightclick = function(pos, node, _, itemstack) + minetest.set_node(pos, {name="xdecor:curtain_" .. c, param2 = node.param2}) + return itemstack + end, + preserve_metadata = cleanup_curtain_meta, + }) + + minetest.register_craft({ + output = "xdecor:curtain_" .. c .. " 4", + recipe = { + {"", craft_item, ""}, + {"", craft_item, ""} + } + }) +end + +xdecor.register("cushion", { + description = S("Cushion"), + tiles = {"xdecor_cushion.png"}, + groups = {snappy = 3, flammable = 3, fall_damage_add_percent = -50, sittable = 1}, + is_ground_content = false, + on_place = minetest.rotate_node, + node_box = xdecor.nodebox.slab_y(0.5), + can_dig = xdecor.sit_dig, + after_destruct = xdecor.sit_destruct, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + xdecor.sit(pos, node, clicker, pointed_thing) + return itemstack + end +}) + +xdecor.register("cushion_block", { + description = S("Cushion Block"), + tiles = {"xdecor_cushion.png"}, + groups = {snappy = 3, flammable = 3, fall_damage_add_percent = -75}, + is_ground_content = false, +}) + +local xdecor_doors = { + japanese = { + recipe = { + {"group:wood", "default:paper"}, + {"default:paper", "group:wood"}, + {"group:wood", "default:paper"} + }, + desc = S("Japanese Door"), + }, + prison = { + recipe = { + {"xpanes:bar_flat", "xpanes:bar_flat",}, + {"xpanes:bar_flat", "default:steel_ingot",}, + {"xpanes:bar_flat", "xpanes:bar_flat"} + }, + desc = S("Prison Door"), + sounds = default.node_sound_metal_defaults(), + sound_open = "xpanes_steel_bar_door_open", + sound_close = "xpanes_steel_bar_door_close", + gain_open = 0.18, + gain_close = 0.16, + protected = true, + }, + rusty_prison = { + recipe = { + {"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",}, + {"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",}, + {"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat"} + }, + desc = S("Rusty Prison Door"), + sounds = default.node_sound_metal_defaults(), + sound_open = "xpanes_steel_bar_door_open", + sound_close = "xpanes_steel_bar_door_close", + gain_open = 0.21, + gain_close = 0.19, + protected = true, + }, + screen = { + recipe = { + {"group:wood", "group:wood"}, + {"xpanes:chainlink_flat", "xpanes:chainlink_flat"}, + {"group:wood", "group:wood"} + }, + desc = S("Screen Door"), + }, + slide = { + recipe = { + {"default:paper", "default:paper"}, + {"default:paper", "default:paper"}, + {"group:wood", "group:wood"} + }, + desc = S("Paper Door"), + }, + woodglass = { + recipe = { + {"default:glass", "default:glass"}, + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"} + }, + desc = S("Woodglass Door"), + }, +} + +local mesecons_register + +if minetest.global_exists("mesecon") then + mesecons_register = { effector = { + action_on = function(pos, node) + local door = doors.get(pos) + if door then + door:open() + end + end, + action_off = function(pos, node) + local door = doors.get(pos) + if door then + door:close() + end + end, + rules = mesecon.rules.pplate + }} +end + +for name, def in pairs(xdecor_doors) do + if not doors.register then break end + doors.register(name .. "_door", { + tiles = { + {name = "xdecor_" .. name .. "_door.png", backface_culling = true} + }, + description = def.desc, + inventory_image = "xdecor_" .. name .. "_door_inv.png", + sounds = def.sounds, + sound_open = def.sound_open, + sound_close = def.sound_close, + gain_open = def.gain_open, + gain_close = def.gain_close, + protected = def.protected, + groups = {choppy = 2, cracky = 2, oddly_breakable_by_hand = 1, door = 1, node = 1}, + recipe = def.recipe, + mesecons = mesecons_register, + }) +end + +xdecor.register("enderchest", { + description = S("Ender Chest"), + --~ Ender chest tooltip + _tt_help = S("Interdimensional inventory"), + tiles = { + "xdecor_enderchest_top.png", "xdecor_enderchest_top.png", + "xdecor_enderchest_side.png", "xdecor_enderchest_side.png", + "xdecor_enderchest_side.png", "xdecor_enderchest_front.png" + }, + groups = {cracky = 1, choppy = 1}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + on_rotate = screwdriver.rotate_simple, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", [[ size[8,9] + list[current_player;enderchest;0,0;8,4;] + list[current_player;main;0,5;8,4;] + listring[current_player;enderchest] + listring[current_player;main] ]] + .. xdecor.xbg .. default.get_hotbar_bg(0,5)) + + meta:set_string("infotext", S("Ender Chest")) + end +}) + +minetest.register_on_joinplayer(function(player) + local inv = player:get_inventory() + inv:set_size("enderchest", 8*4) +end) + +xdecor.register("ivy", { + description = S("Ivy"), + drawtype = "signlike", + walkable = false, + climbable = true, + groups = {snappy = 3, attached_node = 1, plant = 1, flammable = 3}, + paramtype2 = "wallmounted", + selection_box = {type="wallmounted"}, + tiles = {"xdecor_ivy.png"}, + inventory_image = "xdecor_ivy.png", + wield_image = "xdecor_ivy.png", + sounds = default.node_sound_leaves_defaults() +}) + +xdecor.register("rooster", { + description = S("Weathercock"), + drawtype = "torchlike", + inventory_image = "xdecor_rooster.png", + walkable = false, + groups = {snappy = 3, attached_node = 1}, + is_ground_content = false, + tiles = {"xdecor_rooster.png"}, + sounds = default.node_sound_metal_defaults(), +}) + +-- Lantern which attaches to the floor. +-- Has a hanging variant +xdecor.register("lantern", { + description = S("Lantern"), + light_source = 13, + drawtype = "plantlike", + inventory_image = "xdecor_lantern_inv.png", + wield_image = "xdecor_lantern_inv.png", + walkable = false, + groups = {snappy = 3, attached_node = 3}, + is_ground_content = false, + tiles = { + { + name = "xdecor_lantern.png", + animation = {type="vertical_frames", length = 1.5} + } + }, + selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}}), + sounds = default.node_sound_metal_defaults(), + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- Use pointed node's on_rightclick function first, if present + if placer and not placer:get_player_control().sneak then + local node = minetest.get_node(pointed_thing.under) + 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, placer, itemstack) or itemstack + end + end + -- Check protection + if minetest.is_protected(pointed_thing.above, placer:get_player_name()) and + not minetest.check_player_privs(placer, "protection_bypass") then + minetest.record_protection_violation(pointed_thing.above, placer:get_player_name()) + return itemstack + end + + -- Decide whether the lantern attaches the the floor + -- (default) or the ceiling. + local leftover, place_pos, nodename + local up = vector.new(pointed_thing.above.x, pointed_thing.above.y+1, pointed_thing.above.z) + local upnode = minetest.get_node(up) + local updef = minetest.registered_nodes[upnode.name] + local down = vector.new(pointed_thing.above.x, pointed_thing.above.y-1, pointed_thing.above.z) + local downnode = minetest.get_node(down) + local downdef = minetest.registered_nodes[downnode.name] + local sound_play = false + if pointed_thing.under.y > pointed_thing.above.y then + nodename = "xdecor:lantern_hanging" + if downdef and not downdef.walkable then + sound_play = true + end + elseif downdef and not downdef.walkable and updef and updef.walkable then + nodename = "xdecor:lantern_hanging" + sound_play = true + else + nodename = "xdecor:lantern" + end + leftover, place_pos = minetest.item_place_node(ItemStack(nodename), placer, pointed_thing) + if place_pos == nil then + return + end + if leftover:get_count() == 0 and + not minetest.is_creative_enabled(placer:get_player_name()) then + itemstack:take_item() + end + + if sound_play then + minetest.sound_play(default.node_sound_metal_defaults().place, {pos=place_pos}, true) + end + + return itemstack + end, +}) + +-- Same as lantern, but attaches to ceiling +xdecor.register("lantern_hanging", { + description = S("Hanging Lantern"), + light_source = 13, + drawtype = "plantlike", + inventory_image = "xdecor_lantern_inv.png^xdecor_lantern_hanging_overlay_inv.png", + wield_image = "xdecor_lantern_inv.png", + walkable = false, + groups = {snappy = 3, attached_node = 4, not_in_creative_inventory = 1}, + is_ground_content = false, + tiles = { + { + name = "xdecor_lantern.png", + animation = {type="vertical_frames", length = 1.5} + } + }, + selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}}), + sounds = default.node_sound_metal_defaults(), + drop = "xdecor:lantern", +}) + +-- Update legacy lantern (back when they were wallmounted) +-- that are hanging to the proper node. +minetest.register_lbm({ + label = "Update hanging lanterns", + name = "xdecor:update_hanging_lanterns", + nodenames = {"xdecor:lantern"}, + run_at_every_load = false, + action = function(pos, node) + if node.param2 == 0 then -- wallmounted 0 value means attached to the ceiling + -- Only convert the node if it needs to hang + -- (walkable node above, non-walkable node below) + local up = vector.new(pos.x, pos.y+1, pos.z) + local upnode = minetest.get_node(up) + local updef = minetest.registered_nodes[upnode.name] + local down = vector.new(pos.x, pos.y-1, pos.z) + local downnode = minetest.get_node(down) + local downdef = minetest.registered_nodes[downnode.name] + if updef and updef.walkable and downdef and not downdef.walkable then + minetest.swap_node(pos, {name="xdecor:lantern_hanging"}) + end + end + end, +}) + +local xdecor_lightbox = { + iron = S("Steel Lattice Light Box"), + wooden = S("Wooden Cross Light Box"), + wooden2 = S("Wooden Rhombus Light Box"), +} + +for l, desc in pairs(xdecor_lightbox) do + xdecor.register(l .. "_lightbox", { + description = desc, + tiles = {"xdecor_" .. l .. "_lightbox.png"}, + groups = {cracky = 3, choppy = 3, oddly_breakable_by_hand = 2}, + is_ground_content = false, + light_source = 13, + sounds = default.node_sound_glass_defaults() + }) +end + +-- Potted flowers +local xdecor_potted = { + -- Based on the original Minetest Game flowers + dandelion_white = S("Potted White Dandelion"), + dandelion_yellow = S("Potted Yellow Dandelion"), + geranium = S("Potted Blue Geranium"), + rose = S("Potted Red Rose"), + tulip = S("Potted Orange Tulip"), + viola = S("Potted Viola"), + -- Based on the flowers added in Minetest Game 5.0.0 + tulip_black = S("Potted Black Tulip"), + chrysanthemum_green = S("Potted Green Chrysanthemum"), +} + +for f, desc in pairs(xdecor_potted) do + xdecor.register("potted_" .. f, { + description = desc, + walkable = false, + groups = {snappy = 3, flammable = 3, plant = 1, flower = 1, potted_flower = 1}, + is_ground_content = false, + tiles = {"xdecor_" .. f .. "_pot.png"}, + inventory_image = "xdecor_" .. f .. "_pot.png", + drawtype = "plantlike", + sounds = default.node_sound_leaves_defaults({ + place = default.node_sound_stone_defaults().place, + dug = default.node_sound_stone_defaults().dug, + }), + selection_box = xdecor.nodebox.slab_y(0.3) + }) + + -- Register recipe only if the matching flower exists + if minetest.registered_items["flowers:" .. f] then + minetest.register_craft({ + output = "xdecor:potted_" .. f, + recipe = { + {"default:clay_brick", "flowers:" .. f, "default:clay_brick"}, + {"", "default:clay_brick", ""} + } + }) + end +end + +local painting_box = { + type = "wallmounted", + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375} +} + +xdecor.register("painting_1", { + description = S("Painting"), + tiles = {"xdecor_painting_1.png","xdecor_painting_1.png^[transformR180","xdecor_painting_1.png"}, + use_texture_alpha = ALPHA_OPAQUE, + inventory_image = "xdecor_painting_empty.png", + wield_image = "xdecor_painting_empty.png", + paramtype2 = "wallmounted", + wallmounted_rotate_vertical = true, + sunlight_propagates = true, + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2, attached_node = 1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + node_box = painting_box, + node_placement_prediction = "", + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- Use pointed node's on_rightclick function first, if present + if placer and not placer:get_player_control().sneak then + local node = minetest.get_node(pointed_thing.under) + 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, placer, itemstack) or itemstack + end + end + -- Check protection + if minetest.is_protected(pointed_thing.above, placer:get_player_name()) and + not minetest.check_player_privs(placer, "protection_bypass") then + minetest.record_protection_violation(pointed_thing.above, placer:get_player_name()) + return itemstack + end + + local num = math.random(4) + local leftover, place_pos = minetest.item_place_node( + ItemStack("xdecor:painting_" .. num), placer, pointed_thing) + + if not place_pos then + return itemstack + end + + if leftover:get_count() == 0 and + not minetest.is_creative_enabled(placer:get_player_name()) then + itemstack:take_item() + end + + -- Play 'place' sound manually + minetest.sound_play(default.node_sound_wood_defaults().place, {pos=place_pos}, true) + + return itemstack + end, + sounds = default.node_sound_wood_defaults(), +}) + +for i = 2, 4 do + xdecor.register("painting_" .. i, { + tiles = {"xdecor_painting_"..i..".png","xdecor_painting_"..i..".png^[transformR180","xdecor_painting_"..i..".png"}, + use_texture_alpha = ALPHA_OPAQUE, + paramtype2 = "wallmounted", + wallmounted_rotate_vertical = true, + drop = "xdecor:painting_1", + sunlight_propagates = true, + groups = { + choppy = 3, + oddly_breakable_by_hand = 2, + flammable = 2, + attached_node = 1, + not_in_creative_inventory = 1 + }, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + node_box = painting_box + }) +end + +xdecor.register("stonepath", { + description = S("Garden Stone Path"), + tiles = {"default_stone.png"}, + groups = {snappy = 3}, + is_ground_content = false, + on_rotate = screwdriver.rotate_simple, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + node_box = xdecor.pixelbox(16, { + {8, 0, 8, 6, .5, 6}, {1, 0, 1, 6, .5, 6}, + {1, 0, 10, 5, .5, 5}, {10, 0, 2, 4, .5, 4} + }), + selection_box = xdecor.nodebox.slab_y(0.05) +}) + +local function register_hard_node(name, desc, def) + def = def or {} + xdecor.register(name, { + description = desc, + tiles = def.tiles or {"xdecor_" .. name .. ".png"}, + groups = def.groups or {cracky = 1}, + is_ground_content = false, + sounds = def.sounds or default.node_sound_stone_defaults(), + -- Use a default rotation to avoid annoying rotation + -- on normal placement. + -- The nodes can still be rotated by e.g. the screwdriver + -- because xdecor.register uses 'facedir' by default. + place_param2 = 0, + }) +end + +register_hard_node("cactusbrick", S("Cactus Brick")) +register_hard_node("coalstone_tile", S("Coal Stone Tile")) +register_hard_node("desertstone_tile", S("Polished Desert Stone Block")) +register_hard_node("hard_clay", S("Hardened Clay")) +register_hard_node("moonbrick", S("Moon Brick")) +register_hard_node("stone_rune", S("Runestone")) + +-- renamed from stone_tile to fix naming collision with moreblocks +-- mod for the registrations under the 'stairs:' namespace +register_hard_node("stone_tile_x", S("Polished Stone Block"), { + tiles = {"xdecor_stone_tile.png"}, +}) +xdecor.register_legacy_aliases("stone_tile", "stone_tile_x") + +register_hard_node("packed_ice", S("Packed Ice"), { + groups = {cracky = 1, cools_lava = 1, slippery = 3}, + sounds = default.node_sound_glass_defaults() +}) + +-- renamed from wood_tile to fix naming collision with moreblocks +-- mod for the registrations under the 'stairs:' namespace +register_hard_node("wood_tile_x", S("Wooden Tile"), { + groups = {choppy = 1, wood = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + tiles = {"xdecor_wood_tile.png"}, +}) +xdecor.register_legacy_aliases("wood_tile", "wood_tile_x") + +xdecor.register("table", { + --~ Furniture + description = S("Table"), + tiles = {"xdecor_wood.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + node_box = xdecor.pixelbox(16, { + {0, 14, 0, 16, 2, 16}, {5.5, 0, 5.5, 5, 14, 6} + }) +}) + +xdecor.register("tatami", { + description = S("Tatami"), + tiles = {"xdecor_tatami.png"}, + wield_image = "xdecor_tatami.png", + groups = {snappy = 3, flammable = 3}, + is_ground_content = false, + sunlight_propagates = true, + node_box = xdecor.nodebox.slab_y(0.0625) +}) + +xdecor.register("trampoline", { + description = S("Trampoline"), + tiles = {"xdecor_trampoline.png", "xdecor_trampoline_bottom.png", "xdecor_trampoline_sides.png"}, + use_texture_alpha = ALPHA_CLIP, + groups = {cracky = 3, oddly_breakable_by_hand = 1, fall_damage_add_percent = -80, bouncy = 90}, + is_ground_content = false, + node_box = { + type = "fixed", + fixed = { + { -0.5, -1/16, -0.5, 0.5, 0, 0.5 }, -- bouncy top + { -0.5, -0.5, -0.5, -3/16, 0, -3/16 }, -- leg 1 + { 3/16, -0.5, -0.5, 0.5, 0, -3/16 }, -- leg 2 + { -0.5, -0.5, 3/16, -3/16, 0, 0.5 }, -- leg 3 + { 3/16, -0.5, 3/16, 0.5, 0, 0.5 }, -- leg 4 + { -3/16, -5/16, -0.5, 3/16, -1/16, -7/16 }, -- connector 1 + { -0.5, -5/16, -3/16, -7/16, -1/16, 3/16 }, -- connector 2 + { -3/16, -5/16, 7/16, 3/16, -1/16, 0.5 }, -- connector 3 + { 7/16, -5/16, -3/16, 0.5, -1/16, 3/16 }, -- connector 4 + }, + }, + selection_box = xdecor.nodebox.slab_y(0.5), + collision_box = xdecor.nodebox.slab_y(0.5), + sounds = default.node_sound_defaults({ + footstep = { + name = "xdecor_bouncy", + gain = 0.8 + }, + dig = default.node_sound_wood_defaults().dig, + }), +}) + +xdecor.register("tv", { + description = S("Television"), + light_source = 11, + groups = {cracky = 3, oddly_breakable_by_hand = 2}, + is_ground_content = false, + on_rotate = screwdriver.rotate_simple, + tiles = { + "xdecor_television_left.png^[transformR270", + "xdecor_television_left.png^[transformR90", + "xdecor_television_left.png^[transformFX", + "xdecor_television_left.png", "xdecor_television_back.png", + { + name = "xdecor_television_front_animated.png", + animation = {type = "vertical_frames", length = 80.0} + } + }, + sounds = default.node_sound_metal_defaults(), +}) + +xdecor.register("woodframed_glass", { + description = S("Wood Framed Glass"), + drawtype = "glasslike_framed", + sunlight_propagates = true, + tiles = {"xdecor_woodframed_glass.png", "xdecor_woodframed_glass_detail.png"}, + use_texture_alpha = ALPHA_CLIP, + groups = {cracky = 2, oddly_breakable_by_hand = 1}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), + _xdecor_custom_noncube_tiles = { + stair = { + "xdecor_woodframed_glass_split.png", + "xdecor_woodframed_glass.png", + "xdecor_woodframed_glass_stairside_flip.png", + "xdecor_woodframed_glass_stairside.png", + "xdecor_woodframed_glass.png", + "xdecor_woodframed_glass_split.png", + }, + stair_inner = { + "xdecor_woodframed_glass_stairside.png^[transformR270", + "xdecor_woodframed_glass.png", + "xdecor_woodframed_glass_stairside_flip.png", + "xdecor_woodframed_glass.png", + "xdecor_woodframed_glass.png", + "xdecor_woodframed_glass_stairside.png", + }, + stair_outer = { + "xdecor_woodframed_glass_stairside.png^[transformR90", + "xdecor_woodframed_glass.png", + "xdecor_woodframed_glass_outer_stairside.png", + "xdecor_woodframed_glass_stairside_flip.png", + "xdecor_woodframed_glass_stairside.png^[transformR90", + "xdecor_woodframed_glass_outer_stairside.png", + }, + halfstair = { + "xdecor_woodframed_glass_cube.png", + "xdecor_woodframed_glass.png", + "xdecor_woodframed_glass_stairside_flip.png", + "xdecor_woodframed_glass_stairside.png", + "xdecor_woodframed_glass_split.png^[transformR90", + "xdecor_woodframed_glass_cube.png", + }, + slab = { + "xdecor_woodframed_glass.png", + "xdecor_woodframed_glass.png", + "xdecor_woodframed_glass_split.png", + }, + cube = { "xdecor_woodframed_glass_cube.png" }, + thinstair = { "xdecor_woodframed_glass_split.png" }, + micropanel = { "xdecor_woodframed_glass_split.png" }, + panel = { + "xdecor_woodframed_glass_split.png", + "xdecor_woodframed_glass_split.png", + "xdecor_woodframed_glass_cube.png", + "xdecor_woodframed_glass_cube.png", + "xdecor_woodframed_glass_split.png", + }, + }, +}) + +local devices = { + { "radio", S("Radio"), default.node_sound_metal_defaults() }, + --~ as in "loudspeaker" + { "speaker", S("Speaker"), default.node_sound_metal_defaults() }, +} +for _, v in pairs(devices) do + xdecor.register(v[1], { + description = v[2], + on_rotate = screwdriver.rotate_simple, + tiles = { + "xdecor_" .. v[1] .. "_top.png", + "xdecor_" .. v[1] .. "_side.png", + "xdecor_" .. v[1] .. "_side.png", + "xdecor_" .. v[1] .. "_side.png", + "xdecor_" .. v[1] .. "_back.png", + "xdecor_" .. v[1] .. "_front.png", + }, + groups = {cracky = 2, not_cuttable = 1}, + is_ground_content = false, + sounds = v[3], + }) +end diff --git a/mods/xdecor/src/recipes.lua b/mods/xdecor/src/recipes.lua new file mode 100644 index 0000000..e2089b7 --- /dev/null +++ b/mods/xdecor/src/recipes.lua @@ -0,0 +1,405 @@ +minetest.register_craft({ + output = "xdecor:baricade", + recipe = { + {"group:stick", "", "group:stick"}, + {"", "default:steel_ingot", ""}, + {"group:stick", "", "group:stick"} + } +}) + +minetest.register_craft({ + output = "xdecor:barrel", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"default:iron_lump", "", "default:iron_lump"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +minetest.register_craft({ + output = "xdecor:candle", + recipe = { + {"default:torch"} + } +}) + +minetest.register_craft({ + output = "xdecor:cabinet", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"doors:trapdoor", "", "doors:trapdoor"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +minetest.register_craft({ + output = "xdecor:cabinet_half 2", + recipe = { + {"xdecor:cabinet"} + } +}) + +minetest.register_craft({ + output = "xdecor:cactusbrick", + recipe = { + {"default:brick", "default:cactus"} + } +}) + +minetest.register_craft({ + output = "xdecor:chair", + recipe = { + {"group:stick", "", ""}, + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "", "group:stick"} + } +}) + +minetest.register_craft({ + output = "xdecor:coalstone_tile 4", + recipe = { + {"default:coalblock", "default:stone"}, + {"default:stone", "default:coalblock"} + } +}) + +minetest.register_craft({ + output = "xdecor:cobweb", + recipe = { + {"farming:string", "", "farming:string"}, + {"", "farming:string", ""}, + {"farming:string", "", "farming:string"} + } +}) + +minetest.register_craft({ + output = "xdecor:cushion 3", + recipe = { + {"wool:red", "wool:red", "wool:red"} + } +}) + +minetest.register_craft({ + output = "xdecor:cushion_block", + recipe = { + {"xdecor:cushion"}, + {"xdecor:cushion"} + } +}) + +minetest.register_craft({ + output = "xdecor:desertstone_tile 4", + recipe = { + {"default:desert_stone_block", "default:desert_stone_block"}, + {"default:desert_stone_block", "default:desert_stone_block"}, + } +}) + +if not minetest.get_modpath("moreblocks") then + minetest.register_craft({ + output = "xdecor:empty_shelf", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"", "", ""}, + {"group:wood", "group:wood", "group:wood"} + } + }) +end + +minetest.register_craft({ + output = "xdecor:enderchest", + recipe = { + {"", "default:obsidian", ""}, + {"default:obsidian", "default:chest", "default:obsidian"}, + {"", "default:obsidian", ""} + } +}) + +minetest.register_craft({ + output = "xdecor:hard_clay", + recipe = { + {"default:clay", "default:clay"}, + {"default:clay", "default:clay"} + } +}) + +minetest.register_craft({ + output = "xdecor:iron_lightbox", + recipe = { + {"xpanes:bar_flat", "default:torch", "xpanes:bar_flat"}, + {"xpanes:bar_flat", "default:glass", "xpanes:bar_flat"}, + {"xpanes:bar_flat", "default:torch", "xpanes:bar_flat"} + } +}) + +minetest.register_craft({ + output = "xdecor:ivy 4", + recipe = { + {"group:leaves"}, + {"group:leaves"} + } +}) + +minetest.register_craft({ + output = "xdecor:lantern", + recipe = { + {"default:iron_lump"}, + {"default:torch"}, + {"default:iron_lump"} + } +}) + +minetest.register_craft({ + output = "xdecor:moonbrick", + recipe = { + {"default:brick", "default:stone"} + } +}) + +minetest.register_craft({ + output = "xdecor:multishelf", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:vessel", "group:book", "group:vessel"}, + {"group:wood", "group:wood", "group:wood"} + } +}) + +minetest.register_craft({ + output = "xdecor:packed_ice", + recipe = { + {"", "default:ice", ""}, + {"default:ice", "", "default:ice"}, + {"", "default:ice", ""}, + } +}) + +minetest.register_craft({ + output = "xdecor:painting_1", + recipe = { + {"default:sign_wall_wood", "group:dye"} + } +}) + +minetest.register_craft({ + output = "xdecor:radio", + type = "shapeless", + recipe = {"xdecor:speaker", "xdecor:speaker"} +}) + +minetest.register_craft({ + output = "xdecor:rooster", + recipe = { + {"default:gold_ingot", "", "default:gold_ingot"}, + {"", "default:gold_ingot", ""}, + {"default:gold_ingot", "", "default:gold_ingot"} + } +}) + +minetest.register_craft({ + output = "xdecor:speaker", + recipe = { + {"default:gold_ingot", "default:copper_ingot", "default:gold_ingot"}, + {"default:copper_ingot", "", "default:copper_ingot"}, + {"default:gold_ingot", "default:copper_ingot", "default:gold_ingot"} + } +}) + +minetest.register_craft({ + output = "xdecor:stone_tile_x 4", + recipe = { + {"default:stone_block", "default:stone_block"}, + {"default:stone_block", "default:stone_block"}, + } +}) + +minetest.register_craft({ + output = "xdecor:stone_rune 4", + recipe = { + {"default:stone_block", "default:stone_block", "default:stone_block"}, + {"default:stone_block", "", "default:stone_block"}, + {"default:stone_block", "default:stone_block", "default:stone_block"} + } +}) + +minetest.register_craft({ + output = "xdecor:stonepath 16", + recipe = { + {"stairs:slab_cobble", "", "stairs:slab_cobble"}, + {"", "stairs:slab_cobble", ""}, + {"stairs:slab_cobble", "", "stairs:slab_cobble"} + } +}) + +minetest.register_craft({ + output = "xdecor:table", + recipe = { + {"stairs:slab_wood", "stairs:slab_wood", "stairs:slab_wood"}, + {"", "group:stick", ""}, + {"", "group:stick", ""} + } +}) + +minetest.register_craft({ + output = "xdecor:tatami", + recipe = { + {"farming:wheat", "farming:wheat", "farming:wheat"} + } +}) + +minetest.register_craft({ + output = "xdecor:trampoline", + recipe = { + {"farming:string", "farming:string", "farming:string"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"} + } +}) + +minetest.register_craft({ + output = "xdecor:tv", + recipe = { + {"default:steel_ingot", "default:copper_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:glass", "default:steel_ingot"}, + {"default:steel_ingot", "default:copper_ingot", "default:steel_ingot"} + } +}) + +minetest.register_craft({ + output = "xdecor:woodframed_glass", + recipe = { + {"group:stick", "group:stick", "group:stick"}, + {"group:stick", "default:glass", "group:stick"}, + {"group:stick", "group:stick", "group:stick"} + } +}) + +minetest.register_craft({ + output = "xdecor:wood_tile_x 2", + recipe = { + {"", "group:wood", ""}, + {"group:wood", "", "group:wood"}, + {"", "group:wood", ""} + } +}) + +minetest.register_craft({ + output = "xdecor:wooden_lightbox", + recipe = { + {"group:stick", "default:torch", "group:stick"}, + {"group:stick", "default:glass", "group:stick"}, + {"group:stick", "default:torch", "group:stick"} + } +}) + +minetest.register_craft({ + output = "xdecor:wooden2_lightbox", + recipe = { + {"group:stick", "group:stick", "group:stick"}, + {"default:torch", "default:glass", "default:torch"}, + {"group:stick", "group:stick", "group:stick"} + }, +}) + + +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:empty_shelf", + burntime = 30, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:multishelf", + burntime = 30, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:cabinet", + burntime = 30, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:barrel", + burntime = 30, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:cabinet_half", + burntime = 15, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:workbench", + burntime = 15, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:table", + burntime = 12, +}) +minetest.register_craft({ + type = "fuel", + recipe = "doors:woodglass_door", + burntime = 13, +}) +minetest.register_craft({ + type = "fuel", + recipe = "doors:screen_door", + burntime = 10, +}) +minetest.register_craft({ + type = "fuel", + recipe = "doors:slide_door", + burntime = 8, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xpanes:wood_frame_flat", + burntime = 5, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xpanes:bamboo_frame_flat", + burntime = 3, +}) +minetest.register_craft({ + type = "fuel", + recipe = "doors:japanese_door", + burntime = 8, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:chair", + burntime = 6, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:baricade", + burntime = 6, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:wood_tile_x", + burntime = 10, +}) +minetest.register_craft({ + type = "fuel", + recipe = "realchess:chessboard", + burntime = 4, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:painting_1", + burntime = 3, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:tatami", + burntime = 1, +}) +minetest.register_craft({ + type = "fuel", + recipe = "xdecor:ivy", + burntime = 1, +}) + diff --git a/mods/xdecor/src/rope.lua b/mods/xdecor/src/rope.lua new file mode 100644 index 0000000..2dbe568 --- /dev/null +++ b/mods/xdecor/src/rope.lua @@ -0,0 +1,152 @@ +local rope = {} +local S = minetest.get_translator("xdecor") + +-- Maximum length a rope can extend to +local MAX_ROPES = 30 + +local ropesounds = default.node_sound_leaves_defaults() + +-- Code by Mirko K. (modified by Temperest, Wulfsdad, kilbith and Wuzzy) (License: GPL). +function rope.place(itemstack, placer, pointed_thing) + local creative = minetest.is_creative_enabled(placer:get_player_name()) + local protection_bypass = minetest.check_player_privs(placer, "protection_bypass") + local pname = placer:get_player_name() + if pointed_thing.type == "node" then + -- Use pointed node's on_rightclick function first, if present + if placer and not placer:get_player_control().sneak then + local node = minetest.get_node(pointed_thing.under) + 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, placer, itemstack) or itemstack + end + end + local pos = pointed_thing.above + -- Check protection + if minetest.is_protected(pos, pname) and not protection_bypass then + minetest.record_protection_violation(pos, pname) + return itemstack + end + + local oldnode = minetest.get_node(pos) + local stackname = itemstack:get_name() + -- Limit rope length to max. stack size or MAX_ROPES (whatever is smaller). + -- Prevents the rope to extend infinitely in Creative Mode. + local max_ropes = math.min(itemstack:get_stack_max(), MAX_ROPES) + + -- Start placing ropes and extend it downwards until we hit an obstacle, + -- run out of ropes or hit the maximum rope length. + local start_pos = table.copy(pos) + local ropes_to_place = 0 + local new_rope_nodes = {} + while oldnode.name == "air" and (creative or (ropes_to_place < itemstack:get_count())) and ropes_to_place < max_ropes do + -- Stop extending rope into protected area + if minetest.is_protected(pos, pname) and not protection_bypass then + break + end + + table.insert(new_rope_nodes, table.copy(pos)) + pos.y = pos.y - 1 + oldnode = minetest.get_node(pos) + ropes_to_place = ropes_to_place + 1 + end + local newnode = {name = stackname} + if ropes_to_place == 1 then + minetest.set_node(new_rope_nodes[1], newnode) + else + minetest.bulk_set_node(new_rope_nodes, newnode) + end + if not creative then + itemstack:take_item(ropes_to_place) + end + + -- Play placement sound manually + if ropes_to_place > 0 then + minetest.sound_play(ropesounds.place, {pos=start_pos}, true) + end + end + + return itemstack +end + +function rope.remove(pos, oldnode, digger, rope_name) + local num = 0 + local below = {x = pos.x, y = pos.y, z = pos.z} + + -- Remove all ropes below our rope + local positions = {} + while minetest.get_node(below).name == rope_name do + local pname = "" + local protection_bypass = false + if digger and digger:is_player() then + protection_bypass = minetest.check_player_privs(digger, "protection_bypass") + pname = digger:get_player_name() + end + -- Stop removing ropes when reaching protected land + if minetest.is_protected(below, pname) and not protection_bypass then + break + end + table.insert(positions, table.copy(below)) + below.y = below.y - 1 + num = num + 1 + end + if num == 0 then + return + end + minetest.bulk_set_node(positions, {name="air", param2=0}) + + if digger and digger:is_player() then + local digger_inv = digger:get_inventory() + -- Give/drop rope items + local creative = minetest.is_creative_enabled(digger:get_player_name()) + if not creative or not digger_inv:contains_item("main", rope_name) then + if creative then + num = 1 + end + local item = rope_name.." "..num + local leftover = digger_inv:add_item("main", rope_name.." "..num) + if not leftover:is_empty() then + minetest.add_item(pos, leftover) + end + end + + minetest.log("action", "[xdecor] Rope of length "..(num+1).." dug by "..digger:get_player_name().." starting at "..minetest.pos_to_string(pos)) + else + -- No digger: Drop rope as item + minetest.add_item(pos, "xdecor:rope") + + minetest.log("action", "[xdecor] Rope of length "..(num+1).." removed starting at "..minetest.pos_to_string(pos)) + end + + return true +end + +xdecor.register("rope", { + description = S("Rope"), + drawtype = "plantlike", + walkable = false, + climbable = true, + groups = {dig_immediate = 3, flammable = 3}, + is_ground_content = false, + tiles = {"xdecor_rope.png"}, + inventory_image = "xdecor_rope_inv.png", + wield_image = "xdecor_rope_inv.png", + selection_box = xdecor.pixelbox(8, {{3, 0, 3, 2, 8, 2}}), + node_placement_prediction = "", + on_place = rope.place, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + pos = vector.new(pos.x, pos.y-1, pos.z) + rope.remove(pos, oldnode, digger, "xdecor:rope") + end, + sounds = ropesounds, +}) + +-- Recipes + +minetest.register_craft({ + output = "xdecor:rope", + recipe = { + {"farming:string"}, + {"farming:string"}, + {"farming:string"} + } +}) diff --git a/mods/xdecor/src/workbench.lua b/mods/xdecor/src/workbench.lua new file mode 100644 index 0000000..a51c808 --- /dev/null +++ b/mods/xdecor/src/workbench.lua @@ -0,0 +1,764 @@ +local workbench = {} +local registered_cuttable_nodes = {} +local special_cuts = {} + +screwdriver = screwdriver or {} +local min, ceil = math.min, math.ceil +local S = minetest.get_translator("xdecor") +local FS = function(...) return minetest.formspec_escape(S(...)) end +local NS = function(s) return s end + +-- Set to true to print all the raw English strings +-- of registered cut nodes into console. +-- (Requires Luanti 5.14.0 or later to work.) +local GENERATE_TRANSLATABLE_STRING_LIST = false + +if GENERATE_TRANSLATABLE_STRING_LIST and not minetest.strip_escapes then + minetest.log("warning", "[xdecor] GENERATE_TRANSLATABLE_STRING_LIST is set to true but minetest.strip_escapes is missing! ".. + "This would malform the output, so GENERATE_TRANSLATABLE_STRING_LIST will be forced to false.") + GENERATE_TRANSLATABLE_STRING_LIST = false +end + +local DEFAULT_HAMMER_REPAIR = 500 +local DEFAULT_HAMMER_REPAIR_COST = 700 + + +-- Nodeboxes definitions +workbench.defs = { + -- Name Yield Nodeboxes (X Y Z W H L) Description LegacyDescription + {"nanoslab", 16, {{ 0, 0, 0, 8, 1, 8 }}, + --~ Part of a block name for a tiny slab with 1/16 height and 1/4 area. E.g. "Stone Nanoslab" + NS("Nanoslab"), + --~ Block name for a tiny slab with 1/16 height and 1/4 area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") + NS("@1 Nanoslab")}, + {"micropanel", 16, {{ 0, 0, 0, 16, 1, 8 }}, + --~ Part of a block name for a tiny slab with 1/16 height and 1/2 area. E.g. "Stone Micropanel" + NS("Micropanel"), + --~ Block name for a tiny slab with 1/16 height and 1/2 area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") + NS("@1 Micropanel")}, + {"microslab", 8, {{ 0, 0, 0, 16, 1, 16 }}, + --~ Part of a block name for a tiny slab with 1/16 height and full area. E.g. "Stone Microslab" + NS("Microslab"), + --~ Block name for a tiny slab with 1/16 height and full area. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") + NS("@1 Microslab")}, + {"thinstair", 8, {{ 0, 7, 0, 16, 1, 8 }, { 0, 15, 8, 16, 1, 8 }}, + --~ Part of a block name of a thin stair, a stair-like block where the "steps" are thinner. E.g. "Stone Thin Stair" + NS("Thin Stair"), + --~ Block name of a thin stair, a stair-like block where the "steps" are thinner. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") + NS("@1 Thin Stair")}, + {"cube", 4, {{ 0, 0, 0, 8, 8, 8 }}, + --~ Part of a block name of a tiny cube-shaped block with 1/2 the side length of a full block. E.g. "Stone Cube" + NS("Cube"), + --~ Block name of a tiny cube-shaped block with 1/2 the side length of a full block. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") + NS("@1 Cube")}, + {"panel", 4, {{ 0, 0, 0, 16, 8, 8 }}, + --~ Part of a block name of a block with 1/2 the height and 1/2 the length of a full block. It's like a slab that was cut in half. E.g. "Stone Panel" + NS("Panel"), + --~ Block name of a block with 1/2 the height and 1/2 the length of a full block. It's like a slab that was cut in half. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") + NS("@1 Panel")}, + {"slab", 2, nil, + --~ Part of block name of a block with 1/2 the height of a full block. E.g. "Stone Slab" + NS("Slab"), + --~ Block name of a block with 1/2 the height of a full block. (@1 = base block name, e.g. "Stone") + NS("@1 Slab") }, + {"doublepanel", 2, {{ 0, 0, 0, 16, 8, 8 }, { 0, 8, 8, 16, 8, 8 }}, + --~ Block name of a stair-like block variant with a lower piece cut away. E.g. "Stone Double Panel" + NS("Double Panel"), + --~ Block name of a stair-like block variant with a lower piece cut away. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") + NS("@1 Double Panel")}, + {"halfstair", 2, {{ 0, 0, 0, 8, 8, 16 }, + { 0, 8, 8, 8, 8, 8 }}, + --~ Part of a block name for a stair where 1/2 has been cut away sideways. Can be obtained by work bench. E.g. "Stone Half-Stair" + NS("Half-Stair"), + --~ Block name of a stair where 1/2 has been cut away sideways. Can be obtained by work bench. (@1 = base block name, e.g. "Stone") + NS("@1 Half-Stair")}, + {"stair_outer", 1, nil, nil}, + {"stair", 1, nil, + --~ Block name of a 'traditional' stair-shaped block. E.g. "Stone Stair" + NS("Stair"), + --~ Block name of a 'traditional' stair-shaped block. (@1 = base block name, e.g. "Stone") + NS("@1 Stair")}, + {"stair_inner", 1, nil, nil}, +} + +local custom_repairable = {} +function xdecor:register_repairable(item) + custom_repairable[item] = true +end + +-- Tools allowed to be repaired +function workbench:repairable(stack) + -- Explicitly registered as repairable: Overrides everything else + if custom_repairable[stack] then + return true + end + -- no repair if non-tool + if not minetest.registered_tools[stack] then + return false + end + -- no repair if disable_repair group + if minetest.get_item_group(stack, "disable_repair") == 1 then + return false + end + return true +end + +-- Returns true if item can be cut into basic stairs and slabs +function workbench:cuttable(itemname) + local split = string.split(itemname, ":") + if split and split[1] and split[2] then + if minetest.registered_nodes["stairs:stair_"..split[2]] ~= nil or + minetest.registered_nodes["stairs:slab_"..split[2]] ~= nil then + return true + end + end + if registered_cuttable_nodes[itemname] == true then + return true + end + return false +end + +-- Returns true if item can be cut into xdecor extended shapes (thinslab, panel, cube, etc.) +function workbench:cuttable_extended(itemname) + return registered_cuttable_nodes[itemname] == true +end + +-- method to allow other mods to check if an item is repairable +function xdecor:is_repairable(stack) + return workbench:repairable(stack) +end + +function workbench:get_output(inv, input, name) + local output = {} + local extended = workbench:cuttable_extended(input:get_name()) + for i = 1, #self.defs do + local nbox = self.defs[i] + local cuttype = nbox[1] + local count = nbox[2] * input:get_count() + local max_count = input:get_stack_max() + if count > max_count then + -- Limit count to maximum multiple to avoid waste + count = nbox[2] * math.floor(max_count / nbox[2]) + end + local was_cut = false + if extended or nbox[3] == nil then + local item = name .. "_" .. cuttype + local name_after_colon = name:match(":(.*)") + item = (nbox[3] and item) + if not item and name_after_colon then + item = "stairs:" .. cuttype .. "_" .. name_after_colon + end + if item and minetest.registered_items[item] then + output[i] = item .. " " .. count + was_cut = true + end + end + if not was_cut and special_cuts[input:get_name()] ~= nil then + local cut = special_cuts[input:get_name()][cuttype] + if cut then + output[i] = cut .. " " .. count + was_cut = true + end + end + end + + inv:set_list("forms", output) +end + +local main_fs = "".. + --~ Label shown in work bench menu where you can cut a block to create smaller versions of it + "label[0.9,1.23;"..FS("Cut").."]" + --~ Label shown in work bench menu where you can repair an item + .."label[0.9,2.23;"..FS("Repair").."]" + ..[[ box[-0.05,1;2.05,0.9;#555555] + box[-0.05,2;2.05,0.9;#555555] ]] + --~ Button in work bench menu for the crafting grid + .."button[0,0;2,1;craft;"..FS("Crafting").."]" + --~ Button in work bench menu for its inventory + .."button[2,0;2,1;storage;"..FS("Storage").."]" + ..[[ image[3,1;1,1;gui_arrow.png] + image[0,1;1,1;worktable_saw.png] + image[0,2;1,1;worktable_anvil.png] + image[3,2;1,1;hammer_layout.png] + list[context;input;2,1;1,1;] + list[context;tool;2,2;1,1;] + list[context;hammer;3,2;1,1;] + list[context;forms;4,0;4,3;] + listring[current_player;main] + listring[context;tool] + listring[current_player;main] + listring[context;hammer] + listring[current_player;main] + listring[context;forms] + listring[current_player;main] + listring[context;input] +]] + +local crafting_fs = "image[5,1;1,1;gui_furnace_arrow_bg.png^[transformR270]" + --~ Button to return to main page in work bench menu + .."button[0,0;1.5,1;back;< "..FS("Back").."]" + ..[[ list[current_player;craft;2,0;3,3;] + list[current_player;craftpreview;6,1;1,1;] + listring[current_player;main] + listring[current_player;craft] +]] + +local storage_fs = "list[context;storage;0,1;8,2;]" + .."button[0,0;1.5,1;back;< "..FS("Back").."]" + ..[[listring[context;storage] + listring[current_player;main] +]] + +local formspecs = { + -- Main formspec + main_fs, + + -- Crafting formspec + crafting_fs, + + -- Storage formspec + storage_fs, +} + +function workbench:set_formspec(meta, id) + meta:set_string("formspec", + "size[8,7;]list[current_player;main;0,3.25;8,4;]" .. + formspecs[id] .. xdecor.xbg .. default.get_hotbar_bg(0,3.25)) +end + +function workbench.construct(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + inv:set_size("tool", 1) + inv:set_size("input", 1) + inv:set_size("hammer", 1) + inv:set_size("forms", 4*3) + inv:set_size("storage", 8*2) + + meta:set_string("infotext", S("Work Bench")) + workbench:set_formspec(meta, 1) +end + +function workbench.fields(pos, _, fields) + if fields.quit then return end + + local meta = minetest.get_meta(pos) + local id = fields.back and 1 or fields.craft and 2 or fields.storage and 3 + if not id then return end + + workbench:set_formspec(meta, id) +end + +function workbench.dig(pos) + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("input") and inv:is_empty("hammer") and + inv:is_empty("tool") and inv:is_empty("storage") +end + +function workbench.blast(pos) + local drops = xdecor.get_inventory_drops(pos, {"input", "hammer", "tool", "storage"}) + minetest.remove_node(pos) + return drops +end + +function workbench.timer(pos) + local timer = minetest.get_node_timer(pos) + local inv = minetest.get_meta(pos):get_inventory() + local tool = inv:get_stack("tool", 1) + local hammer = inv:get_stack("hammer", 1) + + if tool:is_empty() or hammer:is_empty() or tool:get_wear() == 0 then + timer:stop() + return + end + + local hammerdef = hammer:get_definition() + + -- Tool's wearing range: 0-65535; 0 = new condition + tool:add_wear(-hammerdef._xdecor_hammer_repair or DEFAULT_HAMMER_REPAIR) + hammer:add_wear(hammerdef._xdecor_hammer_repair_cost or DEFAULT_HAMMER_REPAIR_COST) + + inv:set_stack("tool", 1, tool) + inv:set_stack("hammer", 1, hammer) + + return true +end + +function workbench.allow_put(pos, listname, index, stack, player) + local stackname = stack:get_name() + if (listname == "tool" and workbench:repairable(stackname)) or + (listname == "input" and workbench:cuttable(stackname)) or + (listname == "hammer" and minetest.get_item_group(stackname, "repair_hammer") == 1) or + listname == "storage" then + return stack:get_count() + end + + return 0 +end + +function workbench.on_put(pos, listname, index, stack, player) + local inv = minetest.get_meta(pos):get_inventory() + if listname == "input" then + local input = inv:get_stack("input", 1) + workbench:get_output(inv, input, stack:get_name()) + elseif listname == "tool" or listname == "hammer" then + local timer = minetest.get_node_timer(pos) + timer:start(3.0) + end +end + +function workbench.allow_move(pos, from_list, from_index, to_list, to_index, count, player) + if (to_list == "storage" and from_list ~= "forms") then + return count + elseif (to_list == "hammer" and (from_list == "tool" or from_list == "storage")) then + local inv = minetest.get_inventory({type="node", pos=pos}) + local stack = inv:get_stack(from_list, from_index) + if minetest.get_item_group(stack:get_name(), "repair_hammer") == 1 then + return count + end + elseif (to_list == "tool") then + local inv = minetest.get_inventory({type="node", pos=pos}) + local stack = inv:get_stack(from_list, from_index) + if workbench:repairable(stack:get_name()) then + return count + end + elseif (to_list == "input") then + local inv = minetest.get_inventory({type="node", pos=pos}) + local stack = inv:get_stack(from_list, from_index) + if workbench:cuttable(stack:get_name()) then + return count + end + end + return 0 +end + +function workbench.on_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local from_stack = inv:get_stack(from_list, from_index) + local to_stack = inv:get_stack(to_list, to_index) + + workbench.on_take(pos, from_list, from_index, from_stack, player) + workbench.on_put(pos, to_list, to_index, to_stack, player) +end + +function workbench.allow_take(pos, listname, index, stack, player) + return stack:get_count() +end + +function workbench.on_take(pos, listname, index, stack, player) + local inv = minetest.get_meta(pos):get_inventory() + local input = inv:get_stack("input", 1) + local inputname = input:get_name() + local stackname = stack:get_name() + + if listname == "input" then + if stackname == inputname and workbench:cuttable(inputname) then + workbench:get_output(inv, input, stackname) + else + inv:set_list("forms", {}) + end + elseif listname == "forms" then + local fromstack = inv:get_stack(listname, index) + if not fromstack:is_empty() and fromstack:get_name() ~= stackname then + local player_inv = player:get_inventory() + if player_inv:room_for_item("main", fromstack) then + player_inv:add_item("main", fromstack) + end + end + + input:take_item(ceil(stack:get_count() / workbench.defs[index][2])) + inv:set_stack("input", 1, input) + workbench:get_output(inv, input, inputname) + end +end + +xdecor.register("workbench", { + description = S("Work Bench"), + --~ Work bench tooltip + _tt_help = S("For cutting blocks, repairing tools with a hammer, crafting and storing items"), + groups = {cracky = 2, choppy = 2, oddly_breakable_by_hand = 1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + tiles = { + "xdecor_workbench_top.png","xdecor_workbench_bottom.png", + "xdecor_workbench_sides.png", "xdecor_workbench_sides.png", + "xdecor_workbench_front.png", "xdecor_workbench_front.png" + }, + on_rotate = screwdriver.rotate_simple, + can_dig = workbench.dig, + on_blast = workbench.blast, + on_timer = workbench.timer, + on_construct = workbench.construct, + on_receive_fields = workbench.fields, + on_metadata_inventory_put = workbench.on_put, + on_metadata_inventory_take = workbench.on_take, + on_metadata_inventory_move = workbench.on_move, + allow_metadata_inventory_put = workbench.allow_put, + allow_metadata_inventory_take = workbench.allow_take, + allow_metadata_inventory_move = workbench.allow_move +}) + +local function register_cut_raw(node, workbench_def, textdomain) + local mod_name, item_name = node:match("^(.-):(.*)") + local def = minetest.registered_nodes[node] + + -- Special translation symbol + local T + if textdomain then + T = minetest.get_translator(textdomain) + else + T = function(s) return s end + end + + if item_name and workbench_def[3] then + local groups = {} + local tiles + + for k, v in pairs(def.groups) do + if k ~= "wood" and k ~= "stone" and k ~= "level" then + groups[k] = v + end + end + + if def.tiles then + if #def.tiles > 1 and (def.drawtype:sub(1,5) ~= "glass") then + tiles = def.tiles + else + tiles = {def.tiles[1]} + end + else + tiles = {def.tile_images[1]} + end + + -- Erase `tileable_vertical=false` from tiles because it + -- lead to buggy textures (e.g. with default:permafrost_with_moss) + for t=1, #tiles do + if type(tiles[t]) == "table" and tiles[t].tileable_vertical == false then + tiles[t].tileable_vertical = nil + end + end + + local custom_tiles = xdecor.glasscuts[node] + if custom_tiles then + if not custom_tiles.nanoslab then + custom_tiles.nanoslab = custom_tiles.cube + end + if not custom_tiles.micropanel then + custom_tiles.micropanel = custom_tiles.micropanel + end + if not custom_tiles.doublepanel then + custom_tiles.doublepanel = custom_tiles.panel + end + end + + local core_desc, modifier + local desc_stair, desc_stair_inner, desc_stair_outer, desc_slab, desc_cut + if minetest.strip_escapes then + core_desc = minetest.strip_escapes(def.description) + modifier = minetest.strip_escapes(workbench_def[4]) + + desc_stair = T(core_desc .. " Stair") + desc_stair_inner = T("Inner " .. core_desc .. " Stair") + desc_stair_outer = T("Outer " .. core_desc .. " Stair") + desc_slab = T(core_desc .. " Slab") + -- Base node description (e.g. "Stone") concatenated with a space, + -- then a modifier (e.g. "Nanoslab"), e.g. "Stone Nanoslab". + desc_cut = T(core_desc .. " " .. modifier) + else + core_desc = def.description + modifier = workbench_def[4] + + desc_stair = S("@1 Stair", core_desc) + desc_stair_inner = S("Inner @1 Stair", core_desc) + desc_stair_outer = S("Outer @1 Stair", core_desc) + desc_slab = S("@1 Slab", core_desc) + desc_cut = S(workbench_def[5], core_desc) + end + + if not minetest.registered_nodes["stairs:slab_" .. item_name] then + if custom_tiles and (custom_tiles.slab or custom_tiles.stair) then + if custom_tiles.stair then + stairs.register_stair(item_name, node, + groups, custom_tiles.stair, desc_stair, + def.sounds) + stairs.register_stair_inner(item_name, node, + groups, custom_tiles.stair_inner, "", def.sounds, nil, desc_stair_inner) + stairs.register_stair_outer(item_name, node, + groups, custom_tiles.stair_outer, "", def.sounds, nil, desc_stair_outer) + + if GENERATE_TRANSLATABLE_STRING_LIST then + print(("S(%q)"):format(core_desc .. " Stair")) + print(("S(%q)"):format("Inner " .. core_desc .. " Stair")) + print(("S(%q)"):format("Outer " .. core_desc .. " Stair")) + end + end + if custom_tiles.slab then + stairs.register_slab(item_name, node, + groups, custom_tiles.slab, desc_slab, + def.sounds) + + if GENERATE_TRANSLATABLE_STRING_LIST then + print(("S(%q)"):format(core_desc .. " Slab")) + end + end + else + stairs.register_stair_and_slab(item_name, node, + groups, tiles, + desc_stair, + desc_slab, + def.sounds, nil, + desc_stair_inner, + desc_stair_outer) + + if GENERATE_TRANSLATABLE_STRING_LIST then + print(("S(%q)"):format(core_desc .. " Stair")) + print(("S(%q)"):format(core_desc .. " Slab")) + print(("S(%q)"):format("Inner " .. core_desc .. " Stair")) + print(("S(%q)"):format("Outer " .. core_desc .. " Stair")) + end + end + end + + local cutname = workbench_def[1] + local tiles_special_cut + if custom_tiles and custom_tiles[cutname] then + tiles_special_cut = custom_tiles[cutname] + else + tiles_special_cut = tiles + end + + local cutnodename = node .. "_" .. cutname + if minetest.registered_nodes[cutnodename] then + minetest.log("error", "[xdecor] register_cut_raw: Refusing to register node "..cutnodename.." becaut it was already registered!") + return false + end + + -- Add groups to identify node as a cut node + local cutgroups = table.copy(groups) + -- Marks it as a cut node + cutgroups["xdecor_cut"] = 1 + -- Specifies the cut type (nanoslab, panel, etc.) + cutgroups["xdecor_cut_"..workbench_def[1]] = 1 + + -- Also hide cut nodes from creative inv + cutgroups.not_in_creative_inventory = 1 + + minetest.register_node(":" .. cutnodename, { + description = desc_cut, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + sounds = def.sounds, + tiles = tiles_special_cut, + use_texture_alpha = def.use_texture_alpha, + groups = cutgroups, + is_ground_content = def.is_ground_content, + node_box = xdecor.pixelbox(16, workbench_def[3]), + sunlight_propagates = true, + on_place = minetest.rotate_node + }) + + if GENERATE_TRANSLATABLE_STRING_LIST then + print(("S(%q)"):format(core_desc .. " " .. modifier)) + end + + elseif item_name and mod_name then + minetest.register_alias_force( + ("%s:%s_innerstair"):format(mod_name, item_name), + ("stairs:stair_inner_%s"):format(item_name) + ) + minetest.register_alias_force( + ("%s:%s_outerstair"):format(mod_name, item_name), + ("stairs:stair_outer_%s"):format(item_name) + ) + end + return true +end + +function workbench:register_cut(nodename, textdomain) + if registered_cuttable_nodes[nodename] then + minetest.log("error", "[xdecor] Workbench: Tried to register cut for node "..nodename..", but it was already registered!") + return false + end + local ok = true + for _, d in ipairs(workbench.defs) do + local ok = register_cut_raw(nodename, d, textdomain) + if not ok then + ok = false + end + end + registered_cuttable_nodes[nodename] = true + return ok +end + +function workbench:register_special_cut(nodename, cutlist) + if registered_cuttable_nodes[nodename] or special_cuts[nodename] then + minetest.log("error", "[xdecor] Workbench: Tried to register special cut for node "..nodename..", but it was already registered!") + return false + end + registered_cuttable_nodes[nodename] = true + special_cuts[nodename] = cutlist +end + +-- Workbench craft +minetest.register_craft({ + output = "xdecor:workbench", + recipe = { + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"} + } +}) + +--[[ API FUNCTIONS ]] + +--[[ Register a custom hammer (for repairing). +A hammer repair items at the work bench. The workbench repeatedly +checks if a hammer and a repairable tool are in the slots. The hammer +will repair the tool in regular intervals. This is called a "step". +In each step, the hammer reduces the wear of the repairable +tool but increases its own wear, each by a fixed amount. + +This function allows you to register a custom hammer with custom +name, item image and wear stats. + +Arguments: +* name: Internal itemname +* def: Definition table: + * description: Item `description` + * image: Inventory image and wield image + * groups: Item groups (MUST contain at least `repair_hammer = 1`) + * repair: How much item wear the hammer repairs per step + * repair_cost: How much item wear the hammer takes itself per step + +Note: Mind the implication of repair_cost! If repair_cost is lower than +repair, this means practically infinite durability if you have two +hammers that repair each other. If repair_cost is higher than repair, +then hammers will break eventually. +]] +function xdecor.register_hammer(name, def) + minetest.register_tool(name, { + description = def.description, + --~ Hammer tooltip + _tt_help = S("Repairs tools at the work bench"), + inventory_image = def.image, + wield_image = def.image, + on_use = function() do + return end + end, + groups = def.groups, + _xdecor_hammer_repair = def.repair or DEFAULT_HAMMER_REPAIR, + _xdecor_hammer_repair_cost = def.repair_cost or DEFAULT_HAMMER_REPAIR_COST, + }) +end + +--[[ API FUNCTIONS ]] + +--[[ +Registers various 'cut' node variants for the node with the given nodename, +which will be available in the workbench. +This must only be called once per node. Calling it again is an error. + +The following nodes will be registered: + +* _nanoslab +* _micropanel +* _microslab +* _thinstair +* _cube +* _panel +* _doublepanel +* _halfstair + +You MUST make sure these names are not already taken before +calling this function. Call xdecor.can_cut to do this. +Failing to do so is an error. + +Additionally, a slab, stair, inner stair and outer stair +will be registered by using the `stairs` mod if the slab +node does not exist yet. Refer to the `stairs` mod documentation +for details. + +Parameters: +* nodename: Name of node to be cut +* textdomain: Translation textdomain for registered node + descriptions (if not provided, node descriptions will + be untranslatable) + +Returns true if all nodes were registered successfully, +returns false (and writes to error log) if any error occurred. +]] +xdecor.register_cut = function(nodename, textdomain) + return workbench:register_cut(nodename, textdomain) +end + +-- Returns true if cut nodes have been registered for the given node +xdecor.is_cut_registered = function(nodename) + return registered_cuttable_nodes[nodename] == true +end + +--[[ Returns true if cut node variants can be registered +for the node AND this node doesn't already have +cut nodes registered. ]] +xdecor.can_cut = function(nodename) + -- Node already has cut variants: Fail + if xdecor.is_cut_registered(nodename) then + return false + end + -- Check group + if minetest.get_item_group(nodename, "not_cuttable") == 1 then + return false + end + for w=1, #workbench.defs do + local wdef = workbench.defs[w] + local cut = wdef[1] + if cut ~= "stair" and cut ~= "slab" and cut ~= "stair_inner" and cut ~= "stair_outer" then + if minetest.registered_nodes[nodename .. "_" ..cut] then + -- There already exists a node with one of the required names: Fail + return false + end + end + end + -- All tests passed: Success! + return true +end + +--[[ END OF API FUNCTIONS ]] + + +-- Register xdecor's built-in hammer +xdecor.register_hammer("xdecor:hammer", { + description = S("Hammer"), + image = "xdecor_hammer.png", + groups = { repair_hammer = 1 }, + repair = DEFAULT_HAMMER_REPAIR, + repair_cost = DEFAULT_HAMMER_REPAIR_COST, +}) + +-- Hammer recipes +minetest.register_craft({ + output = "xdecor:hammer", + recipe = { + {"default:steel_ingot", "group:stick", "default:steel_ingot"}, + {"", "group:stick", ""} + } +}) + +-- Register default cuttable blocks (loaded from a list +-- of hardcoded node names) +local cuttable_nodes = dofile(minetest.get_modpath("xdecor").."/src/cuttable_node_list.lua") + +for i = 1, #cuttable_nodes do + local nodename = cuttable_nodes[i] + if xdecor.can_cut(nodename) then + workbench:register_cut(nodename, "_xdecor_cut_nodes") + else + minetest.log("action", "[xdecor] Tried to register cut for default node '"..nodename.."' but it was not allowed") + end +end + +-- Special cuts for cushion block and cabinet +workbench:register_special_cut("xdecor:cushion_block", { slab = "xdecor:cushion" }) +workbench:register_special_cut("xdecor:cabinet", { slab = "xdecor:cabinet_half" }) + diff --git a/mods/xdecor/testing/perftsuite.csv b/mods/xdecor/testing/perftsuite.csv new file mode 100644 index 0000000..47e8558 --- /dev/null +++ b/mods/xdecor/testing/perftsuite.csv @@ -0,0 +1,126 @@ +rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1,20,400,8902,197281,4865609,119060324 +r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 1,48,2039,97862,4085603,193690690 +4k3/8/8/8/8/8/8/4K2R w K - 0 1,15,66,1197,7059,133987,764643 +4k3/8/8/8/8/8/8/R3K3 w Q - 0 1,16,71,1287,7626,145232,846648 +4k2r/8/8/8/8/8/8/4K3 w k - 0 1,5,75,459,8290,47635,899442 +r3k3/8/8/8/8/8/8/4K3 w q - 0 1,5,80,493,8897,52710,1001523 +4k3/8/8/8/8/8/8/R3K2R w KQ - 0 1,26,112,3189,17945,532933,2788982 +r3k2r/8/8/8/8/8/8/4K3 w kq - 0 1,5,130,782,22180,118882,3517770 +8/8/8/8/8/8/6k1/4K2R w K - 0 1,12,38,564,2219,37735,185867 +8/8/8/8/8/8/1k6/R3K3 w Q - 0 1,15,65,1018,4573,80619,413018 +4k2r/6K1/8/8/8/8/8/8 w k - 0 1,3,32,134,2073,10485,179869 +r3k3/1K6/8/8/8/8/8/8 w q - 0 1,4,49,243,3991,20780,367724 +r3k2r/8/8/8/8/8/8/R3K2R w KQkq - 0 1,26,568,13744,314346,7594526,179862938 +r3k2r/8/8/8/8/8/8/1R2K2R w Kkq - 0 1,25,567,14095,328965,8153719,195629489 +r3k2r/8/8/8/8/8/8/2R1K2R w Kkq - 0 1,25,548,13502,312835,7736373,184411439 +r3k2r/8/8/8/8/8/8/R3K1R1 w Qkq - 0 1,25,547,13579,316214,7878456,189224276 +1r2k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1,26,583,14252,334705,8198901,198328929 +2r1k2r/8/8/8/8/8/8/R3K2R w KQk - 0 1,25,560,13592,317324,7710115,185959088 +r3k1r1/8/8/8/8/8/8/R3K2R w KQq - 0 1,25,560,13607,320792,7848606,190755813 +4k3/8/8/8/8/8/8/4K2R b K - 0 1,5,75,459,8290,47635,899442 +4k3/8/8/8/8/8/8/R3K3 b Q - 0 1,5,80,493,8897,52710,1001523 +4k2r/8/8/8/8/8/8/4K3 b k - 0 1,15,66,1197,7059,133987,764643 +r3k3/8/8/8/8/8/8/4K3 b q - 0 1,16,71,1287,7626,145232,846648 +4k3/8/8/8/8/8/8/R3K2R b KQ - 0 1,5,130,782,22180,118882,3517770 +r3k2r/8/8/8/8/8/8/4K3 b kq - 0 1,26,112,3189,17945,532933,2788982 +8/8/8/8/8/8/6k1/4K2R b K - 0 1,3,32,134,2073,10485,179869 +8/8/8/8/8/8/1k6/R3K3 b Q - 0 1,4,49,243,3991,20780,367724 +4k2r/6K1/8/8/8/8/8/8 b k - 0 1,12,38,564,2219,37735,185867 +r3k3/1K6/8/8/8/8/8/8 b q - 0 1,15,65,1018,4573,80619,413018 +r3k2r/8/8/8/8/8/8/R3K2R b KQkq - 0 1,26,568,13744,314346,7594526,179862938 +r3k2r/8/8/8/8/8/8/1R2K2R b Kkq - 0 1,26,583,14252,334705,8198901,198328929 +r3k2r/8/8/8/8/8/8/2R1K2R b Kkq - 0 1,25,560,13592,317324,7710115,185959088 +r3k2r/8/8/8/8/8/8/R3K1R1 b Qkq - 0 1,25,560,13607,320792,7848606,190755813 +1r2k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1,25,567,14095,328965,8153719,195629489 +2r1k2r/8/8/8/8/8/8/R3K2R b KQk - 0 1,25,548,13502,312835,7736373,184411439 +r3k1r1/8/8/8/8/8/8/R3K2R b KQq - 0 1,25,547,13579,316214,7878456,189224276 +8/1n4N1/2k5/8/8/5K2/1N4n1/8 w - - 0 1,14,195,2760,38675,570726,8107539 +8/1k6/8/5N2/8/4n3/8/2K5 w - - 0 1,11,156,1636,20534,223507,2594412 +8/8/4k3/3Nn3/3nN3/4K3/8/8 w - - 0 1,19,289,4442,73584,1198299,19870403 +K7/8/2n5/1n6/8/8/8/k6N w - - 0 1,3,51,345,5301,38348,588695 +k7/8/2N5/1N6/8/8/8/K6n w - - 0 1,17,54,835,5910,92250,688780 +8/1n4N1/2k5/8/8/5K2/1N4n1/8 b - - 0 1,15,193,2816,40039,582642,8503277 +8/1k6/8/5N2/8/4n3/8/2K5 b - - 0 1,16,180,2290,24640,288141,3147566 +8/8/3K4/3Nn3/3nN3/4k3/8/8 b - - 0 1,4,68,1118,16199,281190,4405103 +K7/8/2n5/1n6/8/8/8/k6N b - - 0 1,17,54,835,5910,92250,688780 +k7/8/2N5/1N6/8/8/8/K6n b - - 0 1,3,51,345,5301,38348,588695 +B6b/8/8/8/2K5/4k3/8/b6B w - - 0 1,17,278,4607,76778,1320507,22823890 +8/8/1B6/7b/7k/8/2B1b3/7K w - - 0 1,21,316,5744,93338,1713368,28861171 +k7/B7/1B6/1B6/8/8/8/K6b w - - 0 1,21,144,3242,32955,787524,7881673 +K7/b7/1b6/1b6/8/8/8/k6B w - - 0 1,7,143,1416,31787,310862,7382896 +B6b/8/8/8/2K5/5k2/8/b6B b - - 0 1,6,106,1829,31151,530585,9250746 +8/8/1B6/7b/7k/8/2B1b3/7K b - - 0 1,17,309,5133,93603,1591064,29027891 +k7/B7/1B6/1B6/8/8/8/K6b b - - 0 1,7,143,1416,31787,310862,7382896 +K7/b7/1b6/1b6/8/8/8/k6B b - - 0 1,21,144,3242,32955,787524,7881673 +7k/RR6/8/8/8/8/rr6/7K w - - 0 1,19,275,5300,104342,2161211,44956585 +R6r/8/8/2K5/5k2/8/8/r6R w - - 0 1,36,1027,29215,771461,20506480,525169084 +7k/RR6/8/8/8/8/rr6/7K b - - 0 1,19,275,5300,104342,2161211,44956585 +R6r/8/8/2K5/5k2/8/8/r6R b - - 0 1,36,1027,29227,771368,20521342,524966748 +6kq/8/8/8/8/8/8/7K w - - 0 1,2,36,143,3637,14893,391507 +6KQ/8/8/8/8/8/8/7k b - - 0 1,2,36,143,3637,14893,391507 +K7/8/8/3Q4/4q3/8/8/7k w - - 0 1,6,35,495,8349,166741,3370175 +6qk/8/8/8/8/8/8/7K b - - 0 1,22,43,1015,4167,105749,419369 +6KQ/8/8/8/8/8/8/7k b - - 0 1,2,36,143,3637,14893,391507 +K7/8/8/3Q4/4q3/8/8/7k b - - 0 1,6,35,495,8349,166741,3370175 +8/8/8/8/8/K7/P7/k7 w - - 0 1,3,7,43,199,1347,6249 +8/8/8/8/8/7K/7P/7k w - - 0 1,3,7,43,199,1347,6249 +K7/p7/k7/8/8/8/8/8 w - - 0 1,1,3,12,80,342,2343 +7K/7p/7k/8/8/8/8/8 w - - 0 1,1,3,12,80,342,2343 +8/2k1p3/3pP3/3P2K1/8/8/8/8 w - - 0 1,7,35,210,1091,7028,34834 +8/8/8/8/8/K7/P7/k7 b - - 0 1,1,3,12,80,342,2343 +8/8/8/8/8/7K/7P/7k b - - 0 1,1,3,12,80,342,2343 +K7/p7/k7/8/8/8/8/8 b - - 0 1,3,7,43,199,1347,6249 +7K/7p/7k/8/8/8/8/8 b - - 0 1,3,7,43,199,1347,6249 +8/2k1p3/3pP3/3P2K1/8/8/8/8 b - - 0 1,5,35,182,1091,5408,34822 +8/8/8/8/8/4k3/4P3/4K3 w - - 0 1,2,8,44,282,1814,11848 +4k3/4p3/4K3/8/8/8/8/8 b - - 0 1,2,8,44,282,1814,11848 +8/8/7k/7p/7P/7K/8/8 w - - 0 1,3,9,57,360,1969,10724 +8/8/k7/p7/P7/K7/8/8 w - - 0 1,3,9,57,360,1969,10724 +8/8/3k4/3p4/3P4/3K4/8/8 w - - 0 1,5,25,180,1294,8296,53138 +8/3k4/3p4/8/3P4/3K4/8/8 w - - 0 1,8,61,483,3213,23599,157093 +8/8/3k4/3p4/8/3P4/3K4/8 w - - 0 1,8,61,411,3213,21637,158065 +k7/8/3p4/8/3P4/8/8/7K w - - 0 1,4,15,90,534,3450,20960 +8/8/7k/7p/7P/7K/8/8 b - - 0 1,3,9,57,360,1969,10724 +8/8/k7/p7/P7/K7/8/8 b - - 0 1,3,9,57,360,1969,10724 +8/8/3k4/3p4/3P4/3K4/8/8 b - - 0 1,5,25,180,1294,8296,53138 +8/3k4/3p4/8/3P4/3K4/8/8 b - - 0 1,8,61,411,3213,21637,158065 +8/8/3k4/3p4/8/3P4/3K4/8 b - - 0 1,8,61,483,3213,23599,157093 +k7/8/3p4/8/3P4/8/8/7K b - - 0 1,4,15,89,537,3309,21104 +7k/3p4/8/8/3P4/8/8/K7 w - - 0 1,4,19,117,720,4661,32191 +7k/8/8/3p4/8/8/3P4/K7 w - - 0 1,5,19,116,716,4786,30980 +k7/8/8/7p/6P1/8/8/K7 w - - 0 1,5,22,139,877,6112,41874 +k7/8/7p/8/8/6P1/8/K7 w - - 0 1,4,16,101,637,4354,29679 +k7/8/8/6p1/7P/8/8/K7 w - - 0 1,5,22,139,877,6112,41874 +k7/8/6p1/8/8/7P/8/K7 w - - 0 1,4,16,101,637,4354,29679 +k7/8/8/3p4/4p3/8/8/7K w - - 0 1,3,15,84,573,3013,22886 +k7/8/3p4/8/8/4P3/8/7K w - - 0 1,4,16,101,637,4271,28662 +7k/3p4/8/8/3P4/8/8/K7 b - - 0 1,5,19,117,720,5014,32167 +7k/8/8/3p4/8/8/3P4/K7 b - - 0 1,4,19,117,712,4658,30749 +k7/8/8/7p/6P1/8/8/K7 b - - 0 1,5,22,139,877,6112,41874 +k7/8/7p/8/8/6P1/8/K7 b - - 0 1,4,16,101,637,4354,29679 +k7/8/8/6p1/7P/8/8/K7 b - - 0 1,5,22,139,877,6112,41874 +k7/8/6p1/8/8/7P/8/K7 b - - 0 1,4,16,101,637,4354,29679 +k7/8/8/3p4/4p3/8/8/7K b - - 0 1,5,15,102,569,4337,22579 +k7/8/3p4/8/8/4P3/8/7K b - - 0 1,4,16,101,637,4271,28662 +7k/8/8/p7/1P6/8/8/7K w - - 0 1,5,22,139,877,6112,41874 +7k/8/p7/8/8/1P6/8/7K w - - 0 1,4,16,101,637,4354,29679 +7k/8/8/1p6/P7/8/8/7K w - - 0 1,5,22,139,877,6112,41874 +7k/8/1p6/8/8/P7/8/7K w - - 0 1,4,16,101,637,4354,29679 +k7/7p/8/8/8/8/6P1/K7 w - - 0 1,5,25,161,1035,7574,55338 +k7/6p1/8/8/8/8/7P/K7 w - - 0 1,5,25,161,1035,7574,55338 +3k4/3pp3/8/8/8/8/3PP3/3K4 w - - 0 1,7,49,378,2902,24122,199002 +7k/8/8/p7/1P6/8/8/7K b - - 0 1,5,22,139,877,6112,41874 +7k/8/p7/8/8/1P6/8/7K b - - 0 1,4,16,101,637,4354,29679 +7k/8/8/1p6/P7/8/8/7K b - - 0 1,5,22,139,877,6112,41874 +7k/8/1p6/8/8/P7/8/7K b - - 0 1,4,16,101,637,4354,29679 +k7/7p/8/8/8/8/6P1/K7 b - - 0 1,5,25,161,1035,7574,55338 +k7/6p1/8/8/8/8/7P/K7 b - - 0 1,5,25,161,1035,7574,55338 +3k4/3pp3/8/8/8/8/3PP3/3K4 b - - 0 1,7,49,378,2902,24122,199002 +8/Pk6/8/8/8/8/6Kp/8 w - - 0 1,11,97,887,8048,90606,1030499 +n1n5/1Pk5/8/8/8/8/5Kp1/5N1N w - - 0 1,24,421,7421,124608,2193768,37665329 +8/PPPk4/8/8/8/8/4Kppp/8 w - - 0 1,18,270,4699,79355,1533145,28859283 +n1n5/PPPk4/8/8/8/8/4Kppp/5N1N w - - 0 1,24,496,9483,182838,3605103,71179139 +8/Pk6/8/8/8/8/6Kp/8 b - - 0 1,11,97,887,8048,90606,1030499 +n1n5/1Pk5/8/8/8/8/5Kp1/5N1N b - - 0 1,24,421,7421,124608,2193768,37665329 +8/PPPk4/8/8/8/8/4Kppp/8 b - - 0 1,18,270,4699,79355,1533145,28859283 +n1n5/PPPk4/8/8/8/8/4Kppp/5N1N b - - 0 1,24,496,9483,182838,3605103,71179139 diff --git a/mods/xdecor/textures/bg_btn.png b/mods/xdecor/textures/bg_btn.png new file mode 100644 index 0000000..5815572 Binary files /dev/null and b/mods/xdecor/textures/bg_btn.png differ diff --git a/mods/xdecor/textures/bishop_black.png b/mods/xdecor/textures/bishop_black.png new file mode 100644 index 0000000..388a622 Binary files /dev/null and b/mods/xdecor/textures/bishop_black.png differ diff --git a/mods/xdecor/textures/bishop_white.png b/mods/xdecor/textures/bishop_white.png new file mode 100644 index 0000000..2819a58 Binary files /dev/null and b/mods/xdecor/textures/bishop_white.png differ diff --git a/mods/xdecor/textures/chess_bg.png b/mods/xdecor/textures/chess_bg.png new file mode 100644 index 0000000..b84ab6a Binary files /dev/null and b/mods/xdecor/textures/chess_bg.png differ diff --git a/mods/xdecor/textures/chess_draw_50move.png b/mods/xdecor/textures/chess_draw_50move.png new file mode 100644 index 0000000..5ae1c41 Binary files /dev/null and b/mods/xdecor/textures/chess_draw_50move.png differ diff --git a/mods/xdecor/textures/chess_draw_50move_next.png b/mods/xdecor/textures/chess_draw_50move_next.png new file mode 100644 index 0000000..b44e836 Binary files /dev/null and b/mods/xdecor/textures/chess_draw_50move_next.png differ diff --git a/mods/xdecor/textures/chess_draw_repeat3.png b/mods/xdecor/textures/chess_draw_repeat3.png new file mode 100644 index 0000000..1cbcb75 Binary files /dev/null and b/mods/xdecor/textures/chess_draw_repeat3.png differ diff --git a/mods/xdecor/textures/chess_draw_repeat3_next.png b/mods/xdecor/textures/chess_draw_repeat3_next.png new file mode 100644 index 0000000..2d0697d Binary files /dev/null and b/mods/xdecor/textures/chess_draw_repeat3_next.png differ diff --git a/mods/xdecor/textures/chess_figurine_bishop_black.png b/mods/xdecor/textures/chess_figurine_bishop_black.png new file mode 100644 index 0000000..0e4895f Binary files /dev/null and b/mods/xdecor/textures/chess_figurine_bishop_black.png differ diff --git a/mods/xdecor/textures/chess_figurine_bishop_white.png b/mods/xdecor/textures/chess_figurine_bishop_white.png new file mode 100644 index 0000000..7d753d9 Binary files /dev/null and b/mods/xdecor/textures/chess_figurine_bishop_white.png differ diff --git a/mods/xdecor/textures/chess_figurine_king_black.png b/mods/xdecor/textures/chess_figurine_king_black.png new file mode 100644 index 0000000..974aeb0 Binary files /dev/null and b/mods/xdecor/textures/chess_figurine_king_black.png differ diff --git a/mods/xdecor/textures/chess_figurine_king_white.png b/mods/xdecor/textures/chess_figurine_king_white.png new file mode 100644 index 0000000..889932f Binary files /dev/null and b/mods/xdecor/textures/chess_figurine_king_white.png differ diff --git a/mods/xdecor/textures/chess_figurine_knight_black.png b/mods/xdecor/textures/chess_figurine_knight_black.png new file mode 100644 index 0000000..2ebb32a Binary files /dev/null and b/mods/xdecor/textures/chess_figurine_knight_black.png differ diff --git a/mods/xdecor/textures/chess_figurine_knight_white.png b/mods/xdecor/textures/chess_figurine_knight_white.png new file mode 100644 index 0000000..933bf34 Binary files /dev/null and b/mods/xdecor/textures/chess_figurine_knight_white.png differ diff --git a/mods/xdecor/textures/chess_figurine_pawn_black.png b/mods/xdecor/textures/chess_figurine_pawn_black.png new file mode 100644 index 0000000..ed4d185 Binary files /dev/null and b/mods/xdecor/textures/chess_figurine_pawn_black.png differ diff --git a/mods/xdecor/textures/chess_figurine_pawn_white.png b/mods/xdecor/textures/chess_figurine_pawn_white.png new file mode 100644 index 0000000..aeb4929 Binary files /dev/null and b/mods/xdecor/textures/chess_figurine_pawn_white.png differ diff --git a/mods/xdecor/textures/chess_figurine_queen_black.png b/mods/xdecor/textures/chess_figurine_queen_black.png new file mode 100644 index 0000000..452fde2 Binary files /dev/null and b/mods/xdecor/textures/chess_figurine_queen_black.png differ diff --git a/mods/xdecor/textures/chess_figurine_queen_white.png b/mods/xdecor/textures/chess_figurine_queen_white.png new file mode 100644 index 0000000..e888f00 Binary files /dev/null and b/mods/xdecor/textures/chess_figurine_queen_white.png differ diff --git a/mods/xdecor/textures/chess_figurine_rook_black.png b/mods/xdecor/textures/chess_figurine_rook_black.png new file mode 100644 index 0000000..5d2dba6 Binary files /dev/null and b/mods/xdecor/textures/chess_figurine_rook_black.png differ diff --git a/mods/xdecor/textures/chess_figurine_rook_white.png b/mods/xdecor/textures/chess_figurine_rook_white.png new file mode 100644 index 0000000..4d47369 Binary files /dev/null and b/mods/xdecor/textures/chess_figurine_rook_white.png differ diff --git a/mods/xdecor/textures/chess_resign.png b/mods/xdecor/textures/chess_resign.png new file mode 100644 index 0000000..6426fdc Binary files /dev/null and b/mods/xdecor/textures/chess_resign.png differ diff --git a/mods/xdecor/textures/chess_turn_black.png b/mods/xdecor/textures/chess_turn_black.png new file mode 100644 index 0000000..00f7c74 Binary files /dev/null and b/mods/xdecor/textures/chess_turn_black.png differ diff --git a/mods/xdecor/textures/chess_turn_white.png b/mods/xdecor/textures/chess_turn_white.png new file mode 100644 index 0000000..6ede5a9 Binary files /dev/null and b/mods/xdecor/textures/chess_turn_white.png differ diff --git a/mods/xdecor/textures/chessboard_sides.png b/mods/xdecor/textures/chessboard_sides.png new file mode 100644 index 0000000..1498b1d Binary files /dev/null and b/mods/xdecor/textures/chessboard_sides.png differ diff --git a/mods/xdecor/textures/chessboard_top.png b/mods/xdecor/textures/chessboard_top.png new file mode 100644 index 0000000..d6db051 Binary files /dev/null and b/mods/xdecor/textures/chessboard_top.png differ diff --git a/mods/xdecor/textures/ench_ui.png b/mods/xdecor/textures/ench_ui.png new file mode 100644 index 0000000..8a2f4a0 Binary files /dev/null and b/mods/xdecor/textures/ench_ui.png differ diff --git a/mods/xdecor/textures/gui_arrow.png b/mods/xdecor/textures/gui_arrow.png new file mode 100644 index 0000000..df1bbdb Binary files /dev/null and b/mods/xdecor/textures/gui_arrow.png differ diff --git a/mods/xdecor/textures/hammer_layout.png b/mods/xdecor/textures/hammer_layout.png new file mode 100644 index 0000000..355ceab Binary files /dev/null and b/mods/xdecor/textures/hammer_layout.png differ diff --git a/mods/xdecor/textures/hive_bee.png b/mods/xdecor/textures/hive_bee.png new file mode 100644 index 0000000..e221f1f Binary files /dev/null and b/mods/xdecor/textures/hive_bee.png differ diff --git a/mods/xdecor/textures/hive_layout.png b/mods/xdecor/textures/hive_layout.png new file mode 100644 index 0000000..27794f4 Binary files /dev/null and b/mods/xdecor/textures/hive_layout.png differ diff --git a/mods/xdecor/textures/king_black.png b/mods/xdecor/textures/king_black.png new file mode 100644 index 0000000..06cfc30 Binary files /dev/null and b/mods/xdecor/textures/king_black.png differ diff --git a/mods/xdecor/textures/king_white.png b/mods/xdecor/textures/king_white.png new file mode 100644 index 0000000..60621c4 Binary files /dev/null and b/mods/xdecor/textures/king_white.png differ diff --git a/mods/xdecor/textures/knight_black.png b/mods/xdecor/textures/knight_black.png new file mode 100644 index 0000000..44de5f1 Binary files /dev/null and b/mods/xdecor/textures/knight_black.png differ diff --git a/mods/xdecor/textures/knight_white.png b/mods/xdecor/textures/knight_white.png new file mode 100644 index 0000000..1de460f Binary files /dev/null and b/mods/xdecor/textures/knight_white.png differ diff --git a/mods/xdecor/textures/mailbox_blank16.png b/mods/xdecor/textures/mailbox_blank16.png new file mode 100644 index 0000000..017d4f9 Binary files /dev/null and b/mods/xdecor/textures/mailbox_blank16.png differ diff --git a/mods/xdecor/textures/mese_layout.png b/mods/xdecor/textures/mese_layout.png new file mode 100644 index 0000000..154a6bc Binary files /dev/null and b/mods/xdecor/textures/mese_layout.png differ diff --git a/mods/xdecor/textures/pawn_black.png b/mods/xdecor/textures/pawn_black.png new file mode 100644 index 0000000..7cb5fc8 Binary files /dev/null and b/mods/xdecor/textures/pawn_black.png differ diff --git a/mods/xdecor/textures/pawn_black_promo_anim.png b/mods/xdecor/textures/pawn_black_promo_anim.png new file mode 100644 index 0000000..7edaf27 Binary files /dev/null and b/mods/xdecor/textures/pawn_black_promo_anim.png differ diff --git a/mods/xdecor/textures/pawn_white.png b/mods/xdecor/textures/pawn_white.png new file mode 100644 index 0000000..f7a8dec Binary files /dev/null and b/mods/xdecor/textures/pawn_white.png differ diff --git a/mods/xdecor/textures/pawn_white_promo_anim.png b/mods/xdecor/textures/pawn_white_promo_anim.png new file mode 100644 index 0000000..3e9295a Binary files /dev/null and b/mods/xdecor/textures/pawn_white_promo_anim.png differ diff --git a/mods/xdecor/textures/queen_black.png b/mods/xdecor/textures/queen_black.png new file mode 100644 index 0000000..d59e312 Binary files /dev/null and b/mods/xdecor/textures/queen_black.png differ diff --git a/mods/xdecor/textures/queen_white.png b/mods/xdecor/textures/queen_white.png new file mode 100644 index 0000000..d923f05 Binary files /dev/null and b/mods/xdecor/textures/queen_white.png differ diff --git a/mods/xdecor/textures/rook_black.png b/mods/xdecor/textures/rook_black.png new file mode 100644 index 0000000..fa87141 Binary files /dev/null and b/mods/xdecor/textures/rook_black.png differ diff --git a/mods/xdecor/textures/rook_white.png b/mods/xdecor/textures/rook_white.png new file mode 100644 index 0000000..6703452 Binary files /dev/null and b/mods/xdecor/textures/rook_white.png differ diff --git a/mods/xdecor/textures/stairs_glass_cube.png b/mods/xdecor/textures/stairs_glass_cube.png new file mode 100644 index 0000000..f8182eb Binary files /dev/null and b/mods/xdecor/textures/stairs_glass_cube.png differ diff --git a/mods/xdecor/textures/stairs_obsidian_glass_cube.png b/mods/xdecor/textures/stairs_obsidian_glass_cube.png new file mode 100644 index 0000000..68bd9f8 Binary files /dev/null and b/mods/xdecor/textures/stairs_obsidian_glass_cube.png differ diff --git a/mods/xdecor/textures/worktable_anvil.png b/mods/xdecor/textures/worktable_anvil.png new file mode 100644 index 0000000..afca15e Binary files /dev/null and b/mods/xdecor/textures/worktable_anvil.png differ diff --git a/mods/xdecor/textures/worktable_saw.png b/mods/xdecor/textures/worktable_saw.png new file mode 100644 index 0000000..73246ca Binary files /dev/null and b/mods/xdecor/textures/worktable_saw.png differ diff --git a/mods/xdecor/textures/xdecor_bamboo_frame.png b/mods/xdecor/textures/xdecor_bamboo_frame.png new file mode 100644 index 0000000..6a0d863 Binary files /dev/null and b/mods/xdecor/textures/xdecor_bamboo_frame.png differ diff --git a/mods/xdecor/textures/xdecor_baricade.png b/mods/xdecor/textures/xdecor_baricade.png new file mode 100644 index 0000000..87109bb Binary files /dev/null and b/mods/xdecor/textures/xdecor_baricade.png differ diff --git a/mods/xdecor/textures/xdecor_barrel_sides.png b/mods/xdecor/textures/xdecor_barrel_sides.png new file mode 100644 index 0000000..4172b81 Binary files /dev/null and b/mods/xdecor/textures/xdecor_barrel_sides.png differ diff --git a/mods/xdecor/textures/xdecor_barrel_top.png b/mods/xdecor/textures/xdecor_barrel_top.png new file mode 100644 index 0000000..014b00a Binary files /dev/null and b/mods/xdecor/textures/xdecor_barrel_top.png differ diff --git a/mods/xdecor/textures/xdecor_book_open.png b/mods/xdecor/textures/xdecor_book_open.png new file mode 100644 index 0000000..206b11c Binary files /dev/null and b/mods/xdecor/textures/xdecor_book_open.png differ diff --git a/mods/xdecor/textures/xdecor_bowl.png b/mods/xdecor/textures/xdecor_bowl.png new file mode 100644 index 0000000..9197da9 Binary files /dev/null and b/mods/xdecor/textures/xdecor_bowl.png differ diff --git a/mods/xdecor/textures/xdecor_bowl_soup.png b/mods/xdecor/textures/xdecor_bowl_soup.png new file mode 100644 index 0000000..54d87ae Binary files /dev/null and b/mods/xdecor/textures/xdecor_bowl_soup.png differ diff --git a/mods/xdecor/textures/xdecor_cabinet_front.png b/mods/xdecor/textures/xdecor_cabinet_front.png new file mode 100644 index 0000000..6380968 Binary files /dev/null and b/mods/xdecor/textures/xdecor_cabinet_front.png differ diff --git a/mods/xdecor/textures/xdecor_cabinet_sides.png b/mods/xdecor/textures/xdecor_cabinet_sides.png new file mode 100644 index 0000000..32ab257 Binary files /dev/null and b/mods/xdecor/textures/xdecor_cabinet_sides.png differ diff --git a/mods/xdecor/textures/xdecor_cactusbrick.png b/mods/xdecor/textures/xdecor_cactusbrick.png new file mode 100644 index 0000000..4856f09 Binary files /dev/null and b/mods/xdecor/textures/xdecor_cactusbrick.png differ diff --git a/mods/xdecor/textures/xdecor_candle_floor.png b/mods/xdecor/textures/xdecor_candle_floor.png new file mode 100644 index 0000000..c1bc4e3 Binary files /dev/null and b/mods/xdecor/textures/xdecor_candle_floor.png differ diff --git a/mods/xdecor/textures/xdecor_candle_hanging.png b/mods/xdecor/textures/xdecor_candle_hanging.png new file mode 100644 index 0000000..04869c7 Binary files /dev/null and b/mods/xdecor/textures/xdecor_candle_hanging.png differ diff --git a/mods/xdecor/textures/xdecor_candle_inv.png b/mods/xdecor/textures/xdecor_candle_inv.png new file mode 100644 index 0000000..90a479e Binary files /dev/null and b/mods/xdecor/textures/xdecor_candle_inv.png differ diff --git a/mods/xdecor/textures/xdecor_candle_wall.png b/mods/xdecor/textures/xdecor_candle_wall.png new file mode 100644 index 0000000..b8a4b50 Binary files /dev/null and b/mods/xdecor/textures/xdecor_candle_wall.png differ diff --git a/mods/xdecor/textures/xdecor_candle_wield.png b/mods/xdecor/textures/xdecor_candle_wield.png new file mode 100644 index 0000000..60bdede Binary files /dev/null and b/mods/xdecor/textures/xdecor_candle_wield.png differ diff --git a/mods/xdecor/textures/xdecor_cauldron_bottom.png b/mods/xdecor/textures/xdecor_cauldron_bottom.png new file mode 100644 index 0000000..b89acbc Binary files /dev/null and b/mods/xdecor/textures/xdecor_cauldron_bottom.png differ diff --git a/mods/xdecor/textures/xdecor_cauldron_sides.png b/mods/xdecor/textures/xdecor_cauldron_sides.png new file mode 100644 index 0000000..6644edb Binary files /dev/null and b/mods/xdecor/textures/xdecor_cauldron_sides.png differ diff --git a/mods/xdecor/textures/xdecor_cauldron_top_anim_boiling_river_water.png b/mods/xdecor/textures/xdecor_cauldron_top_anim_boiling_river_water.png new file mode 100644 index 0000000..083f810 Binary files /dev/null and b/mods/xdecor/textures/xdecor_cauldron_top_anim_boiling_river_water.png differ diff --git a/mods/xdecor/textures/xdecor_cauldron_top_anim_boiling_water.png b/mods/xdecor/textures/xdecor_cauldron_top_anim_boiling_water.png new file mode 100644 index 0000000..48584d5 Binary files /dev/null and b/mods/xdecor/textures/xdecor_cauldron_top_anim_boiling_water.png differ diff --git a/mods/xdecor/textures/xdecor_cauldron_top_anim_soup.png b/mods/xdecor/textures/xdecor_cauldron_top_anim_soup.png new file mode 100644 index 0000000..f6d5258 Binary files /dev/null and b/mods/xdecor/textures/xdecor_cauldron_top_anim_soup.png differ diff --git a/mods/xdecor/textures/xdecor_cauldron_top_empty.png b/mods/xdecor/textures/xdecor_cauldron_top_empty.png new file mode 100644 index 0000000..5cdf5fd Binary files /dev/null and b/mods/xdecor/textures/xdecor_cauldron_top_empty.png differ diff --git a/mods/xdecor/textures/xdecor_cauldron_top_idle.png b/mods/xdecor/textures/xdecor_cauldron_top_idle.png new file mode 100644 index 0000000..69ec2ab Binary files /dev/null and b/mods/xdecor/textures/xdecor_cauldron_top_idle.png differ diff --git a/mods/xdecor/textures/xdecor_cauldron_top_idle_river_water.png b/mods/xdecor/textures/xdecor_cauldron_top_idle_river_water.png new file mode 100644 index 0000000..a7456ec Binary files /dev/null and b/mods/xdecor/textures/xdecor_cauldron_top_idle_river_water.png differ diff --git a/mods/xdecor/textures/xdecor_cauldron_top_idle_soup.png b/mods/xdecor/textures/xdecor_cauldron_top_idle_soup.png new file mode 100644 index 0000000..30804a3 Binary files /dev/null and b/mods/xdecor/textures/xdecor_cauldron_top_idle_soup.png differ diff --git a/mods/xdecor/textures/xdecor_chainlink.png b/mods/xdecor/textures/xdecor_chainlink.png new file mode 100644 index 0000000..1aba3c0 Binary files /dev/null and b/mods/xdecor/textures/xdecor_chainlink.png differ diff --git a/mods/xdecor/textures/xdecor_chrysanthemum_green_pot.png b/mods/xdecor/textures/xdecor_chrysanthemum_green_pot.png new file mode 100644 index 0000000..283a3de Binary files /dev/null and b/mods/xdecor/textures/xdecor_chrysanthemum_green_pot.png differ diff --git a/mods/xdecor/textures/xdecor_coalstone_tile.png b/mods/xdecor/textures/xdecor_coalstone_tile.png new file mode 100644 index 0000000..3122db0 Binary files /dev/null and b/mods/xdecor/textures/xdecor_coalstone_tile.png differ diff --git a/mods/xdecor/textures/xdecor_cobweb.png b/mods/xdecor/textures/xdecor_cobweb.png new file mode 100644 index 0000000..bb1ecea Binary files /dev/null and b/mods/xdecor/textures/xdecor_cobweb.png differ diff --git a/mods/xdecor/textures/xdecor_curtain_open_overlay.png b/mods/xdecor/textures/xdecor_curtain_open_overlay.png new file mode 100644 index 0000000..e6eea41 Binary files /dev/null and b/mods/xdecor/textures/xdecor_curtain_open_overlay.png differ diff --git a/mods/xdecor/textures/xdecor_curtain_open_overlay_bottom.png b/mods/xdecor/textures/xdecor_curtain_open_overlay_bottom.png new file mode 100644 index 0000000..ed733af Binary files /dev/null and b/mods/xdecor/textures/xdecor_curtain_open_overlay_bottom.png differ diff --git a/mods/xdecor/textures/xdecor_curtain_open_overlay_side.png b/mods/xdecor/textures/xdecor_curtain_open_overlay_side.png new file mode 100644 index 0000000..98dda28 Binary files /dev/null and b/mods/xdecor/textures/xdecor_curtain_open_overlay_side.png differ diff --git a/mods/xdecor/textures/xdecor_curtain_open_overlay_top.png b/mods/xdecor/textures/xdecor_curtain_open_overlay_top.png new file mode 100644 index 0000000..8c319ef Binary files /dev/null and b/mods/xdecor/textures/xdecor_curtain_open_overlay_top.png differ diff --git a/mods/xdecor/textures/xdecor_cushion.png b/mods/xdecor/textures/xdecor_cushion.png new file mode 100644 index 0000000..ad4674c Binary files /dev/null and b/mods/xdecor/textures/xdecor_cushion.png differ diff --git a/mods/xdecor/textures/xdecor_dandelion_white_pot.png b/mods/xdecor/textures/xdecor_dandelion_white_pot.png new file mode 100644 index 0000000..ccb91ee Binary files /dev/null and b/mods/xdecor/textures/xdecor_dandelion_white_pot.png differ diff --git a/mods/xdecor/textures/xdecor_dandelion_yellow_pot.png b/mods/xdecor/textures/xdecor_dandelion_yellow_pot.png new file mode 100644 index 0000000..f303475 Binary files /dev/null and b/mods/xdecor/textures/xdecor_dandelion_yellow_pot.png differ diff --git a/mods/xdecor/textures/xdecor_desertstone_tile.png b/mods/xdecor/textures/xdecor_desertstone_tile.png new file mode 100644 index 0000000..094437f Binary files /dev/null and b/mods/xdecor/textures/xdecor_desertstone_tile.png differ diff --git a/mods/xdecor/textures/xdecor_empty_shelf.png b/mods/xdecor/textures/xdecor_empty_shelf.png new file mode 100644 index 0000000..a8363c0 Binary files /dev/null and b/mods/xdecor/textures/xdecor_empty_shelf.png differ diff --git a/mods/xdecor/textures/xdecor_enchantment_bottom.png b/mods/xdecor/textures/xdecor_enchantment_bottom.png new file mode 100644 index 0000000..38cdaf1 Binary files /dev/null and b/mods/xdecor/textures/xdecor_enchantment_bottom.png differ diff --git a/mods/xdecor/textures/xdecor_enchantment_side.png b/mods/xdecor/textures/xdecor_enchantment_side.png new file mode 100644 index 0000000..9bbd5a2 Binary files /dev/null and b/mods/xdecor/textures/xdecor_enchantment_side.png differ diff --git a/mods/xdecor/textures/xdecor_enchantment_top.png b/mods/xdecor/textures/xdecor_enchantment_top.png new file mode 100644 index 0000000..cc79b35 Binary files /dev/null and b/mods/xdecor/textures/xdecor_enchantment_top.png differ diff --git a/mods/xdecor/textures/xdecor_enderchest_front.png b/mods/xdecor/textures/xdecor_enderchest_front.png new file mode 100644 index 0000000..e7286ce Binary files /dev/null and b/mods/xdecor/textures/xdecor_enderchest_front.png differ diff --git a/mods/xdecor/textures/xdecor_enderchest_side.png b/mods/xdecor/textures/xdecor_enderchest_side.png new file mode 100644 index 0000000..4691247 Binary files /dev/null and b/mods/xdecor/textures/xdecor_enderchest_side.png differ diff --git a/mods/xdecor/textures/xdecor_enderchest_top.png b/mods/xdecor/textures/xdecor_enderchest_top.png new file mode 100644 index 0000000..1f6676c Binary files /dev/null and b/mods/xdecor/textures/xdecor_enderchest_top.png differ diff --git a/mods/xdecor/textures/xdecor_geranium_pot.png b/mods/xdecor/textures/xdecor_geranium_pot.png new file mode 100644 index 0000000..0a68204 Binary files /dev/null and b/mods/xdecor/textures/xdecor_geranium_pot.png differ diff --git a/mods/xdecor/textures/xdecor_glyph1.png b/mods/xdecor/textures/xdecor_glyph1.png new file mode 100644 index 0000000..645abac Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph1.png differ diff --git a/mods/xdecor/textures/xdecor_glyph10.png b/mods/xdecor/textures/xdecor_glyph10.png new file mode 100644 index 0000000..06bd074 Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph10.png differ diff --git a/mods/xdecor/textures/xdecor_glyph11.png b/mods/xdecor/textures/xdecor_glyph11.png new file mode 100644 index 0000000..532d25c Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph11.png differ diff --git a/mods/xdecor/textures/xdecor_glyph12.png b/mods/xdecor/textures/xdecor_glyph12.png new file mode 100644 index 0000000..1f6be21 Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph12.png differ diff --git a/mods/xdecor/textures/xdecor_glyph13.png b/mods/xdecor/textures/xdecor_glyph13.png new file mode 100644 index 0000000..4678f7f Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph13.png differ diff --git a/mods/xdecor/textures/xdecor_glyph14.png b/mods/xdecor/textures/xdecor_glyph14.png new file mode 100644 index 0000000..bf095bb Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph14.png differ diff --git a/mods/xdecor/textures/xdecor_glyph15.png b/mods/xdecor/textures/xdecor_glyph15.png new file mode 100644 index 0000000..27199bb Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph15.png differ diff --git a/mods/xdecor/textures/xdecor_glyph16.png b/mods/xdecor/textures/xdecor_glyph16.png new file mode 100644 index 0000000..27e1807 Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph16.png differ diff --git a/mods/xdecor/textures/xdecor_glyph17.png b/mods/xdecor/textures/xdecor_glyph17.png new file mode 100644 index 0000000..7ed2bd4 Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph17.png differ diff --git a/mods/xdecor/textures/xdecor_glyph18.png b/mods/xdecor/textures/xdecor_glyph18.png new file mode 100644 index 0000000..f03b73a Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph18.png differ diff --git a/mods/xdecor/textures/xdecor_glyph2.png b/mods/xdecor/textures/xdecor_glyph2.png new file mode 100644 index 0000000..81b2061 Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph2.png differ diff --git a/mods/xdecor/textures/xdecor_glyph3.png b/mods/xdecor/textures/xdecor_glyph3.png new file mode 100644 index 0000000..24b8cf4 Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph3.png differ diff --git a/mods/xdecor/textures/xdecor_glyph4.png b/mods/xdecor/textures/xdecor_glyph4.png new file mode 100644 index 0000000..dc1909b Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph4.png differ diff --git a/mods/xdecor/textures/xdecor_glyph5.png b/mods/xdecor/textures/xdecor_glyph5.png new file mode 100644 index 0000000..1473ea4 Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph5.png differ diff --git a/mods/xdecor/textures/xdecor_glyph6.png b/mods/xdecor/textures/xdecor_glyph6.png new file mode 100644 index 0000000..45c0c9a Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph6.png differ diff --git a/mods/xdecor/textures/xdecor_glyph7.png b/mods/xdecor/textures/xdecor_glyph7.png new file mode 100644 index 0000000..5708623 Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph7.png differ diff --git a/mods/xdecor/textures/xdecor_glyph8.png b/mods/xdecor/textures/xdecor_glyph8.png new file mode 100644 index 0000000..c5ae1c3 Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph8.png differ diff --git a/mods/xdecor/textures/xdecor_glyph9.png b/mods/xdecor/textures/xdecor_glyph9.png new file mode 100644 index 0000000..148b03d Binary files /dev/null and b/mods/xdecor/textures/xdecor_glyph9.png differ diff --git a/mods/xdecor/textures/xdecor_half_cabinet_front.png b/mods/xdecor/textures/xdecor_half_cabinet_front.png new file mode 100644 index 0000000..ea9c389 Binary files /dev/null and b/mods/xdecor/textures/xdecor_half_cabinet_front.png differ diff --git a/mods/xdecor/textures/xdecor_half_cabinet_sides.png b/mods/xdecor/textures/xdecor_half_cabinet_sides.png new file mode 100644 index 0000000..6f274b8 Binary files /dev/null and b/mods/xdecor/textures/xdecor_half_cabinet_sides.png differ diff --git a/mods/xdecor/textures/xdecor_hammer.png b/mods/xdecor/textures/xdecor_hammer.png new file mode 100644 index 0000000..17b9856 Binary files /dev/null and b/mods/xdecor/textures/xdecor_hammer.png differ diff --git a/mods/xdecor/textures/xdecor_hard_clay.png b/mods/xdecor/textures/xdecor_hard_clay.png new file mode 100644 index 0000000..8abe666 Binary files /dev/null and b/mods/xdecor/textures/xdecor_hard_clay.png differ diff --git a/mods/xdecor/textures/xdecor_hive_front.png b/mods/xdecor/textures/xdecor_hive_front.png new file mode 100644 index 0000000..4515551 Binary files /dev/null and b/mods/xdecor/textures/xdecor_hive_front.png differ diff --git a/mods/xdecor/textures/xdecor_hive_side.png b/mods/xdecor/textures/xdecor_hive_side.png new file mode 100644 index 0000000..7fd26ad Binary files /dev/null and b/mods/xdecor/textures/xdecor_hive_side.png differ diff --git a/mods/xdecor/textures/xdecor_hive_top.png b/mods/xdecor/textures/xdecor_hive_top.png new file mode 100644 index 0000000..43203e1 Binary files /dev/null and b/mods/xdecor/textures/xdecor_hive_top.png differ diff --git a/mods/xdecor/textures/xdecor_honey.png b/mods/xdecor/textures/xdecor_honey.png new file mode 100644 index 0000000..04c404c Binary files /dev/null and b/mods/xdecor/textures/xdecor_honey.png differ diff --git a/mods/xdecor/textures/xdecor_iron_lightbox.png b/mods/xdecor/textures/xdecor_iron_lightbox.png new file mode 100644 index 0000000..45146f9 Binary files /dev/null and b/mods/xdecor/textures/xdecor_iron_lightbox.png differ diff --git a/mods/xdecor/textures/xdecor_itemframe.png b/mods/xdecor/textures/xdecor_itemframe.png new file mode 100644 index 0000000..088ba15 Binary files /dev/null and b/mods/xdecor/textures/xdecor_itemframe.png differ diff --git a/mods/xdecor/textures/xdecor_ivy.png b/mods/xdecor/textures/xdecor_ivy.png new file mode 100644 index 0000000..b85e112 Binary files /dev/null and b/mods/xdecor/textures/xdecor_ivy.png differ diff --git a/mods/xdecor/textures/xdecor_japanese_door.png b/mods/xdecor/textures/xdecor_japanese_door.png new file mode 100644 index 0000000..35f77ec Binary files /dev/null and b/mods/xdecor/textures/xdecor_japanese_door.png differ diff --git a/mods/xdecor/textures/xdecor_japanese_door_inv.png b/mods/xdecor/textures/xdecor_japanese_door_inv.png new file mode 100644 index 0000000..4d3ec64 Binary files /dev/null and b/mods/xdecor/textures/xdecor_japanese_door_inv.png differ diff --git a/mods/xdecor/textures/xdecor_lantern.png b/mods/xdecor/textures/xdecor_lantern.png new file mode 100644 index 0000000..18c9ce2 Binary files /dev/null and b/mods/xdecor/textures/xdecor_lantern.png differ diff --git a/mods/xdecor/textures/xdecor_lantern_hanging_overlay_inv.png b/mods/xdecor/textures/xdecor_lantern_hanging_overlay_inv.png new file mode 100644 index 0000000..74efa7a Binary files /dev/null and b/mods/xdecor/textures/xdecor_lantern_hanging_overlay_inv.png differ diff --git a/mods/xdecor/textures/xdecor_lantern_inv.png b/mods/xdecor/textures/xdecor_lantern_inv.png new file mode 100644 index 0000000..71cef66 Binary files /dev/null and b/mods/xdecor/textures/xdecor_lantern_inv.png differ diff --git a/mods/xdecor/textures/xdecor_lever_off.png b/mods/xdecor/textures/xdecor_lever_off.png new file mode 100644 index 0000000..6d8bb49 Binary files /dev/null and b/mods/xdecor/textures/xdecor_lever_off.png differ diff --git a/mods/xdecor/textures/xdecor_lever_on.png b/mods/xdecor/textures/xdecor_lever_on.png new file mode 100644 index 0000000..c64d27f Binary files /dev/null and b/mods/xdecor/textures/xdecor_lever_on.png differ diff --git a/mods/xdecor/textures/xdecor_mailbox.png b/mods/xdecor/textures/xdecor_mailbox.png new file mode 100644 index 0000000..8289884 Binary files /dev/null and b/mods/xdecor/textures/xdecor_mailbox.png differ diff --git a/mods/xdecor/textures/xdecor_mailbox_bottom.png b/mods/xdecor/textures/xdecor_mailbox_bottom.png new file mode 100644 index 0000000..b613863 Binary files /dev/null and b/mods/xdecor/textures/xdecor_mailbox_bottom.png differ diff --git a/mods/xdecor/textures/xdecor_mailbox_side.png b/mods/xdecor/textures/xdecor_mailbox_side.png new file mode 100644 index 0000000..44b2a2f Binary files /dev/null and b/mods/xdecor/textures/xdecor_mailbox_side.png differ diff --git a/mods/xdecor/textures/xdecor_mailbox_top.png b/mods/xdecor/textures/xdecor_mailbox_top.png new file mode 100644 index 0000000..3584c53 Binary files /dev/null and b/mods/xdecor/textures/xdecor_mailbox_top.png differ diff --git a/mods/xdecor/textures/xdecor_moonbrick.png b/mods/xdecor/textures/xdecor_moonbrick.png new file mode 100644 index 0000000..efdac14 Binary files /dev/null and b/mods/xdecor/textures/xdecor_moonbrick.png differ diff --git a/mods/xdecor/textures/xdecor_multishelf.png b/mods/xdecor/textures/xdecor_multishelf.png new file mode 100644 index 0000000..0a5e10e Binary files /dev/null and b/mods/xdecor/textures/xdecor_multishelf.png differ diff --git a/mods/xdecor/textures/xdecor_packed_ice.png b/mods/xdecor/textures/xdecor_packed_ice.png new file mode 100644 index 0000000..8c44eaf Binary files /dev/null and b/mods/xdecor/textures/xdecor_packed_ice.png differ diff --git a/mods/xdecor/textures/xdecor_painting_1.png b/mods/xdecor/textures/xdecor_painting_1.png new file mode 100644 index 0000000..7609c2b Binary files /dev/null and b/mods/xdecor/textures/xdecor_painting_1.png differ diff --git a/mods/xdecor/textures/xdecor_painting_2.png b/mods/xdecor/textures/xdecor_painting_2.png new file mode 100644 index 0000000..8a9cf4a Binary files /dev/null and b/mods/xdecor/textures/xdecor_painting_2.png differ diff --git a/mods/xdecor/textures/xdecor_painting_3.png b/mods/xdecor/textures/xdecor_painting_3.png new file mode 100644 index 0000000..d094d3d Binary files /dev/null and b/mods/xdecor/textures/xdecor_painting_3.png differ diff --git a/mods/xdecor/textures/xdecor_painting_4.png b/mods/xdecor/textures/xdecor_painting_4.png new file mode 100644 index 0000000..5ccb141 Binary files /dev/null and b/mods/xdecor/textures/xdecor_painting_4.png differ diff --git a/mods/xdecor/textures/xdecor_painting_empty.png b/mods/xdecor/textures/xdecor_painting_empty.png new file mode 100644 index 0000000..216429a Binary files /dev/null and b/mods/xdecor/textures/xdecor_painting_empty.png differ diff --git a/mods/xdecor/textures/xdecor_permafrost_moss_cube.png b/mods/xdecor/textures/xdecor_permafrost_moss_cube.png new file mode 100644 index 0000000..df7b0fd Binary files /dev/null and b/mods/xdecor/textures/xdecor_permafrost_moss_cube.png differ diff --git a/mods/xdecor/textures/xdecor_permafrost_moss_outer_stairside.png b/mods/xdecor/textures/xdecor_permafrost_moss_outer_stairside.png new file mode 100644 index 0000000..bf4dd6a Binary files /dev/null and b/mods/xdecor/textures/xdecor_permafrost_moss_outer_stairside.png differ diff --git a/mods/xdecor/textures/xdecor_permafrost_moss_split.png b/mods/xdecor/textures/xdecor_permafrost_moss_split.png new file mode 100644 index 0000000..2916260 Binary files /dev/null and b/mods/xdecor/textures/xdecor_permafrost_moss_split.png differ diff --git a/mods/xdecor/textures/xdecor_permafrost_moss_stairside.png b/mods/xdecor/textures/xdecor_permafrost_moss_stairside.png new file mode 100644 index 0000000..3da1348 Binary files /dev/null and b/mods/xdecor/textures/xdecor_permafrost_moss_stairside.png differ diff --git a/mods/xdecor/textures/xdecor_permafrost_stones_cube.png b/mods/xdecor/textures/xdecor_permafrost_stones_cube.png new file mode 100644 index 0000000..0002ab4 Binary files /dev/null and b/mods/xdecor/textures/xdecor_permafrost_stones_cube.png differ diff --git a/mods/xdecor/textures/xdecor_permafrost_stones_outer_stairside.png b/mods/xdecor/textures/xdecor_permafrost_stones_outer_stairside.png new file mode 100644 index 0000000..0002ab4 Binary files /dev/null and b/mods/xdecor/textures/xdecor_permafrost_stones_outer_stairside.png differ diff --git a/mods/xdecor/textures/xdecor_permafrost_stones_split.png b/mods/xdecor/textures/xdecor_permafrost_stones_split.png new file mode 100644 index 0000000..0002ab4 Binary files /dev/null and b/mods/xdecor/textures/xdecor_permafrost_stones_split.png differ diff --git a/mods/xdecor/textures/xdecor_permafrost_stones_stairside.png b/mods/xdecor/textures/xdecor_permafrost_stones_stairside.png new file mode 100644 index 0000000..e570270 Binary files /dev/null and b/mods/xdecor/textures/xdecor_permafrost_stones_stairside.png differ diff --git a/mods/xdecor/textures/xdecor_pressure_stone.png b/mods/xdecor/textures/xdecor_pressure_stone.png new file mode 100644 index 0000000..faf3ae0 Binary files /dev/null and b/mods/xdecor/textures/xdecor_pressure_stone.png differ diff --git a/mods/xdecor/textures/xdecor_pressure_wood.png b/mods/xdecor/textures/xdecor_pressure_wood.png new file mode 100644 index 0000000..504113a Binary files /dev/null and b/mods/xdecor/textures/xdecor_pressure_wood.png differ diff --git a/mods/xdecor/textures/xdecor_prison_door.png b/mods/xdecor/textures/xdecor_prison_door.png new file mode 100644 index 0000000..2f7e66f Binary files /dev/null and b/mods/xdecor/textures/xdecor_prison_door.png differ diff --git a/mods/xdecor/textures/xdecor_prison_door_inv.png b/mods/xdecor/textures/xdecor_prison_door_inv.png new file mode 100644 index 0000000..3285408 Binary files /dev/null and b/mods/xdecor/textures/xdecor_prison_door_inv.png differ diff --git a/mods/xdecor/textures/xdecor_radio_back.png b/mods/xdecor/textures/xdecor_radio_back.png new file mode 100644 index 0000000..78b28c4 Binary files /dev/null and b/mods/xdecor/textures/xdecor_radio_back.png differ diff --git a/mods/xdecor/textures/xdecor_radio_front.png b/mods/xdecor/textures/xdecor_radio_front.png new file mode 100644 index 0000000..0202114 Binary files /dev/null and b/mods/xdecor/textures/xdecor_radio_front.png differ diff --git a/mods/xdecor/textures/xdecor_radio_side.png b/mods/xdecor/textures/xdecor_radio_side.png new file mode 100644 index 0000000..441ae30 Binary files /dev/null and b/mods/xdecor/textures/xdecor_radio_side.png differ diff --git a/mods/xdecor/textures/xdecor_radio_top.png b/mods/xdecor/textures/xdecor_radio_top.png new file mode 100644 index 0000000..b8c1280 Binary files /dev/null and b/mods/xdecor/textures/xdecor_radio_top.png differ diff --git a/mods/xdecor/textures/xdecor_rooster.png b/mods/xdecor/textures/xdecor_rooster.png new file mode 100644 index 0000000..41ab699 Binary files /dev/null and b/mods/xdecor/textures/xdecor_rooster.png differ diff --git a/mods/xdecor/textures/xdecor_rope.png b/mods/xdecor/textures/xdecor_rope.png new file mode 100644 index 0000000..bcfaba2 Binary files /dev/null and b/mods/xdecor/textures/xdecor_rope.png differ diff --git a/mods/xdecor/textures/xdecor_rope_inv.png b/mods/xdecor/textures/xdecor_rope_inv.png new file mode 100644 index 0000000..51a24a8 Binary files /dev/null and b/mods/xdecor/textures/xdecor_rope_inv.png differ diff --git a/mods/xdecor/textures/xdecor_rope_wield.png b/mods/xdecor/textures/xdecor_rope_wield.png new file mode 100644 index 0000000..3ca8fef Binary files /dev/null and b/mods/xdecor/textures/xdecor_rope_wield.png differ diff --git a/mods/xdecor/textures/xdecor_rose_pot.png b/mods/xdecor/textures/xdecor_rose_pot.png new file mode 100644 index 0000000..12923ac Binary files /dev/null and b/mods/xdecor/textures/xdecor_rose_pot.png differ diff --git a/mods/xdecor/textures/xdecor_rusty_bar.png b/mods/xdecor/textures/xdecor_rusty_bar.png new file mode 100644 index 0000000..382d7ca Binary files /dev/null and b/mods/xdecor/textures/xdecor_rusty_bar.png differ diff --git a/mods/xdecor/textures/xdecor_rusty_bar_top.png b/mods/xdecor/textures/xdecor_rusty_bar_top.png new file mode 100644 index 0000000..a408e1b Binary files /dev/null and b/mods/xdecor/textures/xdecor_rusty_bar_top.png differ diff --git a/mods/xdecor/textures/xdecor_rusty_prison_door.png b/mods/xdecor/textures/xdecor_rusty_prison_door.png new file mode 100644 index 0000000..3b1dd1a Binary files /dev/null and b/mods/xdecor/textures/xdecor_rusty_prison_door.png differ diff --git a/mods/xdecor/textures/xdecor_rusty_prison_door_inv.png b/mods/xdecor/textures/xdecor_rusty_prison_door_inv.png new file mode 100644 index 0000000..65cf872 Binary files /dev/null and b/mods/xdecor/textures/xdecor_rusty_prison_door_inv.png differ diff --git a/mods/xdecor/textures/xdecor_screen_door.png b/mods/xdecor/textures/xdecor_screen_door.png new file mode 100644 index 0000000..a00ebb3 Binary files /dev/null and b/mods/xdecor/textures/xdecor_screen_door.png differ diff --git a/mods/xdecor/textures/xdecor_screen_door_inv.png b/mods/xdecor/textures/xdecor_screen_door_inv.png new file mode 100644 index 0000000..a842732 Binary files /dev/null and b/mods/xdecor/textures/xdecor_screen_door_inv.png differ diff --git a/mods/xdecor/textures/xdecor_slide_door.png b/mods/xdecor/textures/xdecor_slide_door.png new file mode 100644 index 0000000..1810ccd Binary files /dev/null and b/mods/xdecor/textures/xdecor_slide_door.png differ diff --git a/mods/xdecor/textures/xdecor_slide_door_inv.png b/mods/xdecor/textures/xdecor_slide_door_inv.png new file mode 100644 index 0000000..e80e75a Binary files /dev/null and b/mods/xdecor/textures/xdecor_slide_door_inv.png differ diff --git a/mods/xdecor/textures/xdecor_speaker_back.png b/mods/xdecor/textures/xdecor_speaker_back.png new file mode 100644 index 0000000..0696d9f Binary files /dev/null and b/mods/xdecor/textures/xdecor_speaker_back.png differ diff --git a/mods/xdecor/textures/xdecor_speaker_front.png b/mods/xdecor/textures/xdecor_speaker_front.png new file mode 100644 index 0000000..7d3b085 Binary files /dev/null and b/mods/xdecor/textures/xdecor_speaker_front.png differ diff --git a/mods/xdecor/textures/xdecor_speaker_side.png b/mods/xdecor/textures/xdecor_speaker_side.png new file mode 100644 index 0000000..319dbf6 Binary files /dev/null and b/mods/xdecor/textures/xdecor_speaker_side.png differ diff --git a/mods/xdecor/textures/xdecor_speaker_top.png b/mods/xdecor/textures/xdecor_speaker_top.png new file mode 100644 index 0000000..b510a2e Binary files /dev/null and b/mods/xdecor/textures/xdecor_speaker_top.png differ diff --git a/mods/xdecor/textures/xdecor_stone_rune.png b/mods/xdecor/textures/xdecor_stone_rune.png new file mode 100644 index 0000000..319a2df Binary files /dev/null and b/mods/xdecor/textures/xdecor_stone_rune.png differ diff --git a/mods/xdecor/textures/xdecor_stone_tile.png b/mods/xdecor/textures/xdecor_stone_tile.png new file mode 100644 index 0000000..4346783 Binary files /dev/null and b/mods/xdecor/textures/xdecor_stone_tile.png differ diff --git a/mods/xdecor/textures/xdecor_tatami.png b/mods/xdecor/textures/xdecor_tatami.png new file mode 100644 index 0000000..e1998f7 Binary files /dev/null and b/mods/xdecor/textures/xdecor_tatami.png differ diff --git a/mods/xdecor/textures/xdecor_television_back.png b/mods/xdecor/textures/xdecor_television_back.png new file mode 100644 index 0000000..761b1c7 Binary files /dev/null and b/mods/xdecor/textures/xdecor_television_back.png differ diff --git a/mods/xdecor/textures/xdecor_television_front_animated.png b/mods/xdecor/textures/xdecor_television_front_animated.png new file mode 100644 index 0000000..ae5df4f Binary files /dev/null and b/mods/xdecor/textures/xdecor_television_front_animated.png differ diff --git a/mods/xdecor/textures/xdecor_television_left.png b/mods/xdecor/textures/xdecor_television_left.png new file mode 100644 index 0000000..65444fb Binary files /dev/null and b/mods/xdecor/textures/xdecor_television_left.png differ diff --git a/mods/xdecor/textures/xdecor_trampoline.png b/mods/xdecor/textures/xdecor_trampoline.png new file mode 100644 index 0000000..3b67920 Binary files /dev/null and b/mods/xdecor/textures/xdecor_trampoline.png differ diff --git a/mods/xdecor/textures/xdecor_trampoline_bottom.png b/mods/xdecor/textures/xdecor_trampoline_bottom.png new file mode 100644 index 0000000..bd1e8b0 Binary files /dev/null and b/mods/xdecor/textures/xdecor_trampoline_bottom.png differ diff --git a/mods/xdecor/textures/xdecor_trampoline_sides.png b/mods/xdecor/textures/xdecor_trampoline_sides.png new file mode 100644 index 0000000..165be13 Binary files /dev/null and b/mods/xdecor/textures/xdecor_trampoline_sides.png differ diff --git a/mods/xdecor/textures/xdecor_tulip_black_pot.png b/mods/xdecor/textures/xdecor_tulip_black_pot.png new file mode 100644 index 0000000..49c4ae0 Binary files /dev/null and b/mods/xdecor/textures/xdecor_tulip_black_pot.png differ diff --git a/mods/xdecor/textures/xdecor_tulip_pot.png b/mods/xdecor/textures/xdecor_tulip_pot.png new file mode 100644 index 0000000..d339ef6 Binary files /dev/null and b/mods/xdecor/textures/xdecor_tulip_pot.png differ diff --git a/mods/xdecor/textures/xdecor_viola_pot.png b/mods/xdecor/textures/xdecor_viola_pot.png new file mode 100644 index 0000000..7549c4c Binary files /dev/null and b/mods/xdecor/textures/xdecor_viola_pot.png differ diff --git a/mods/xdecor/textures/xdecor_wood.png b/mods/xdecor/textures/xdecor_wood.png new file mode 100644 index 0000000..426e5bf Binary files /dev/null and b/mods/xdecor/textures/xdecor_wood.png differ diff --git a/mods/xdecor/textures/xdecor_wood_frame.png b/mods/xdecor/textures/xdecor_wood_frame.png new file mode 100644 index 0000000..f528f5a Binary files /dev/null and b/mods/xdecor/textures/xdecor_wood_frame.png differ diff --git a/mods/xdecor/textures/xdecor_wood_frame_top.png b/mods/xdecor/textures/xdecor_wood_frame_top.png new file mode 100644 index 0000000..752e148 Binary files /dev/null and b/mods/xdecor/textures/xdecor_wood_frame_top.png differ diff --git a/mods/xdecor/textures/xdecor_wood_tile.png b/mods/xdecor/textures/xdecor_wood_tile.png new file mode 100644 index 0000000..272df2c Binary files /dev/null and b/mods/xdecor/textures/xdecor_wood_tile.png differ diff --git a/mods/xdecor/textures/xdecor_wooden2_lightbox.png b/mods/xdecor/textures/xdecor_wooden2_lightbox.png new file mode 100644 index 0000000..a53ad96 Binary files /dev/null and b/mods/xdecor/textures/xdecor_wooden2_lightbox.png differ diff --git a/mods/xdecor/textures/xdecor_wooden_lightbox.png b/mods/xdecor/textures/xdecor_wooden_lightbox.png new file mode 100644 index 0000000..c5a6b52 Binary files /dev/null and b/mods/xdecor/textures/xdecor_wooden_lightbox.png differ diff --git a/mods/xdecor/textures/xdecor_woodframed_glass.png b/mods/xdecor/textures/xdecor_woodframed_glass.png new file mode 100644 index 0000000..3605c38 Binary files /dev/null and b/mods/xdecor/textures/xdecor_woodframed_glass.png differ diff --git a/mods/xdecor/textures/xdecor_woodframed_glass_cube.png b/mods/xdecor/textures/xdecor_woodframed_glass_cube.png new file mode 100644 index 0000000..45cc355 Binary files /dev/null and b/mods/xdecor/textures/xdecor_woodframed_glass_cube.png differ diff --git a/mods/xdecor/textures/xdecor_woodframed_glass_detail.png b/mods/xdecor/textures/xdecor_woodframed_glass_detail.png new file mode 100644 index 0000000..eff4b0a Binary files /dev/null and b/mods/xdecor/textures/xdecor_woodframed_glass_detail.png differ diff --git a/mods/xdecor/textures/xdecor_woodframed_glass_outer_stairside.png b/mods/xdecor/textures/xdecor_woodframed_glass_outer_stairside.png new file mode 100644 index 0000000..14a9572 Binary files /dev/null and b/mods/xdecor/textures/xdecor_woodframed_glass_outer_stairside.png differ diff --git a/mods/xdecor/textures/xdecor_woodframed_glass_split.png b/mods/xdecor/textures/xdecor_woodframed_glass_split.png new file mode 100644 index 0000000..568d425 Binary files /dev/null and b/mods/xdecor/textures/xdecor_woodframed_glass_split.png differ diff --git a/mods/xdecor/textures/xdecor_woodframed_glass_stairside.png b/mods/xdecor/textures/xdecor_woodframed_glass_stairside.png new file mode 100644 index 0000000..a59f75a Binary files /dev/null and b/mods/xdecor/textures/xdecor_woodframed_glass_stairside.png differ diff --git a/mods/xdecor/textures/xdecor_woodglass_door.png b/mods/xdecor/textures/xdecor_woodglass_door.png new file mode 100644 index 0000000..51209e2 Binary files /dev/null and b/mods/xdecor/textures/xdecor_woodglass_door.png differ diff --git a/mods/xdecor/textures/xdecor_woodglass_door_inv.png b/mods/xdecor/textures/xdecor_woodglass_door_inv.png new file mode 100644 index 0000000..663eab4 Binary files /dev/null and b/mods/xdecor/textures/xdecor_woodglass_door_inv.png differ diff --git a/mods/xdecor/textures/xdecor_workbench_bottom.png b/mods/xdecor/textures/xdecor_workbench_bottom.png new file mode 100644 index 0000000..be5f890 Binary files /dev/null and b/mods/xdecor/textures/xdecor_workbench_bottom.png differ diff --git a/mods/xdecor/textures/xdecor_workbench_front.png b/mods/xdecor/textures/xdecor_workbench_front.png new file mode 100644 index 0000000..3ef7236 Binary files /dev/null and b/mods/xdecor/textures/xdecor_workbench_front.png differ diff --git a/mods/xdecor/textures/xdecor_workbench_sides.png b/mods/xdecor/textures/xdecor_workbench_sides.png new file mode 100644 index 0000000..24521ad Binary files /dev/null and b/mods/xdecor/textures/xdecor_workbench_sides.png differ diff --git a/mods/xdecor/textures/xdecor_workbench_top.png b/mods/xdecor/textures/xdecor_workbench_top.png new file mode 100644 index 0000000..852a83d Binary files /dev/null and b/mods/xdecor/textures/xdecor_workbench_top.png differ diff --git a/runner.lua b/runner.lua index ffb7c7f..58a695b 100755 --- a/runner.lua +++ b/runner.lua @@ -72,8 +72,9 @@ local standardize_data = function() end local techage = "Unnamed Luanti TechAge Pack" +local technic = "Unnamed Luanti Technic Pack" -check_dependencies(techage) +check_dependencies(technic) -- copy_pack_mods(techage, "../Luanti_Servers/mods") standardize_data()